diff --git a/conf/battle/feature.conf b/conf/battle/feature.conf index a39eb39a816..97c5d263612 100644 --- a/conf/battle/feature.conf +++ b/conf/battle/feature.conf @@ -71,6 +71,10 @@ feature.roulette: on // Requires: 2015-05-13aRagexe or later feature.achievement: on +// Refine UI (Note 1) +// Requires: 2016-10-12aRagexeRE or later +feature.refineui: on + // Equipment Switch (Note 1) // Requires: 2017-02-08bRagexeRE or later feature.equipswitch: on diff --git a/conf/battle/items.conf b/conf/battle/items.conf index 94adc67348c..24da604c685 100644 --- a/conf/battle/items.conf +++ b/conf/battle/items.conf @@ -115,11 +115,6 @@ default_bind_on_equip: 4 // 0x8 = Only Guild Leader can sell BOUND_GUILD items to Shops or Itemshops (if 0x1 or 0x4 set) allow_bound_sell: 0x0 -// Turn on event refine chance (see db/{pre-}re/refine_db.yml) -// no = normal refine chances in effect (official/default value) -// yes = event refine chances in effect -event_refine_chance: no - // Hide n last characters of player's name with asterisk (*) when the player // obtained an item with special broadcast flag. // Note: Players with short names can be fully converted to asterisks if this diff --git a/conf/msg_conf/map_msg.conf b/conf/msg_conf/map_msg.conf index aac9c8767f3..b9e0ce730c0 100644 --- a/conf/msg_conf/map_msg.conf +++ b/conf/msg_conf/map_msg.conf @@ -836,7 +836,10 @@ // Achievements 772: Achievements are disabled. -//773-775 reserved for refine UI +// @refineui +773: This command requires packet version 2016-10-12 or newer. +774: This command is disabled via configuration. +775: You have already opened the refine UI. //776-781 reserved for tax system 782: Star Emperor diff --git a/db/import-tmpl/refine.yml b/db/import-tmpl/refine.yml new file mode 100644 index 00000000000..bd84e7272c0 --- /dev/null +++ b/db/import-tmpl/refine.yml @@ -0,0 +1,391 @@ +# This file is a part of rAthena++. +# Copyright(C) 2021 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Refine Database +########################################################################### +# +# Refine Settings +# +########################################################################### +# - Group Refine item type. +# Levels: Refinement settings per item level. (Default: null) +# - Level Item level. +# RefineLevels: Refinement settings per refine level. (Default: null) +# - Level Refine level. +# Bonus Refinement bonus. (Default: 0) +# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0) +# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0) +# Chances: Success chance based on cost type. (Default: null) +# - Type Refinement cost type based on ore used. +# Rate Chance of success out of 0~100. (Default: 0) +# Price Amount of zeny required to refine. (Default: 0) +# Material Ore item required to refine. (Default: 0) +# BreakingRate Chance of item breaking out of 0~100. (Default: 0) +# DowngradeAmount Number of refine levels reduced on failure. (Default: 0) +########################################################################### + +Header: + Type: REFINE_DB + Version: 1 + +########################################################################### +# Event Refine Rates +########################################################################### +#Body: +# - Group: Armor +# Levels: +# - Level: 1 +# RefineLevels: +# - Level: 5 +# Chances: +# - Type: Enriched +# Rate: 9500 +# - Level: 6 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 7 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 8 +# Chances: +# - Type: Enriched +# Rate: 5000 +# - Level: 9 +# Chances: +# - Type: Enriched +# Rate: 5000 +# - Level: 10 +# Chances: +# - Type: Enriched +# Rate: 3500 +# - Level: 11 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 12 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 13 +# Chances: +# - Type: Normal +# Rate: 1600 +# - Level: 14 +# Chances: +# - Type: Normal +# Rate: 1600 +# - Level: 15 +# Chances: +# - Type: Normal +# Rate: 1500 +# - Level: 16 +# Chances: +# - Type: Normal +# Rate: 1500 +# - Level: 17 +# Chances: +# - Type: Normal +# Rate: 1400 +# - Level: 18 +# Chances: +# - Type: Normal +# Rate: 1400 +# - Level: 19 +# Chances: +# - Type: Normal +# Rate: 1000 +# - Level: 20 +# Chances: +# - Type: Normal +# Rate: 1000 +# - Group: Weapon +# Levels: +# - Level: 1 +# RefineLevels: +# - Level: 8 +# Chances: +# - Type: Enriched +# Rate: 9500 +# - Level: 9 +# Chances: +# - Type: Enriched +# Rate: 8500 +# - Level: 10 +# Chances: +# - Type: Enriched +# Rate: 5500 +# - Level: 11 +# Chances: +# - Type: Normal +# Rate: 4000 +# - Level: 12 +# Chances: +# - Type: Normal +# Rate: 4000 +# - Level: 13 +# Chances: +# - Type: Normal +# Rate: 3500 +# - Level: 14 +# Chances: +# - Type: Normal +# Rate: 3500 +# - Level: 15 +# Chances: +# - Type: Normal +# Rate: 3000 +# - Level: 16 +# Chances: +# - Type: Normal +# Rate: 3000 +# - Level: 17 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 18 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 2 +# RefineLevels: +# - Level: 7 +# Chances: +# - Type: Enriched +# Rate: 9500 +# - Level: 8 +# Chances: +# - Type: Enriched +# Rate: 8500 +# - Level: 9 +# Chances: +# - Type: Enriched +# Rate: 6000 +# - Level: 10 +# Chances: +# - Type: Enriched +# Rate: 4500 +# - Level: 11 +# Chances: +# - Type: Normal +# Rate: 4000 +# - Level: 12 +# Chances: +# - Type: Normal +# Rate: 4000 +# - Level: 13 +# Chances: +# - Type: Normal +# Rate: 3500 +# - Level: 14 +# Chances: +# - Type: Normal +# Rate: 3500 +# - Level: 15 +# Chances: +# - Type: Normal +# Rate: 3000 +# - Level: 16 +# Chances: +# - Type: Normal +# Rate: 3000 +# - Level: 17 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 18 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 3 +# RefineLevels: +# - Level: 6 +# Chances: +# - Type: Enriched +# Rate: 9500 +# - Level: 7 +# Chances: +# - Type: Enriched +# Rate: 9000 +# - Level: 8 +# Chances: +# - Type: Enriched +# Rate: 7000 +# - Level: 9 +# Chances: +# - Type: Enriched +# Rate: 6000 +# - Level: 10 +# Chances: +# - Type: Enriched +# Rate: 4500 +# - Level: 11 +# Chances: +# - Type: Normal +# Rate: 4000 +# - Level: 12 +# Chances: +# - Type: Normal +# Rate: 4000 +# - Level: 13 +# Chances: +# - Type: Normal +# Rate: 3500 +# - Level: 14 +# Chances: +# - Type: Normal +# Rate: 3500 +# - Level: 15 +# Chances: +# - Type: Normal +# Rate: 3000 +# - Level: 16 +# Chances: +# - Type: Normal +# Rate: 3000 +# - Level: 17 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 18 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 4 +# RefineLevels: +# - Level: 5 +# Chances: +# - Type: Enriched +# Rate: 9500 +# - Level: 6 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 7 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 8 +# Chances: +# - Type: Enriched +# Rate: 6000 +# - Level: 9 +# Chances: +# - Type: Enriched +# Rate: 5000 +# - Level: 10 +# Chances: +# - Type: Enriched +# Rate: 3500 +# - Level: 11 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 12 +# Chances: +# - Type: Normal +# Rate: 2000 +# - Level: 13 +# Chances: +# - Type: Normal +# Rate: 1600 +# - Level: 14 +# Chances: +# - Type: Normal +# Rate: 1600 +# - Level: 15 +# Chances: +# - Type: Normal +# Rate: 1500 +# - Level: 16 +# Chances: +# - Type: Normal +# Rate: 1500 +# - Level: 17 +# Chances: +# - Type: Normal +# Rate: 1400 +# - Level: 18 +# Chances: +# - Type: Normal +# Rate: 1400 +# - Level: 19 +# Chances: +# - Type: Normal +# Rate: 1000 +# - Level: 20 +# Chances: +# - Type: Normal +# Rate: 1000 +# - Group: Shadow_Armor +# Levels: +# - Level: 1 +# RefineLevels: +# - Level: 5 +# Chances: +# - Type: Enriched +# Rate: 9500 +# - Level: 6 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 7 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 8 +# Chances: +# - Type: Enriched +# Rate: 5000 +# - Level: 9 +# Chances: +# - Type: Enriched +# Rate: 5000 +# - Level: 10 +# Chances: +# - Type: Enriched +# Rate: 3500 +# - Group: Shadow_Weapon +# Levels: +# - Level: 1 +# RefineLevels: +# - Level: 5 +# Chances: +# - Type: Enriched +# Rate: 9500 +# - Level: 6 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 7 +# Chances: +# - Type: Enriched +# Rate: 8000 +# - Level: 8 +# Chances: +# - Type: Enriched +# Rate: 5000 +# - Level: 9 +# Chances: +# - Type: Enriched +# Rate: 5000 +# - Level: 10 +# Chances: +# - Type: Enriched +# Rate: 3500 diff --git a/db/import-tmpl/refine_db.yml b/db/import-tmpl/refine_db.yml deleted file mode 100644 index eff7034d052..00000000000 --- a/db/import-tmpl/refine_db.yml +++ /dev/null @@ -1,20 +0,0 @@ -# This file is a part of rAthena++. -# Copyright(C) 2021 rAthena Development Team -# https://rathena.org - https://github.com/rathena -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -########################################################################### -# Custom Refine Database -########################################################################### diff --git a/db/pre-re/refine.yml b/db/pre-re/refine.yml new file mode 100644 index 00000000000..25f71fb358e --- /dev/null +++ b/db/pre-re/refine.yml @@ -0,0 +1,924 @@ +# This file is a part of rAthena++. +# Copyright(C) 2021 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Refine Database +########################################################################### +# +# Refine Settings +# +########################################################################### +# - Group Refine item type. +# Levels: Refinement settings per item level. (Default: null) +# - Level Item level. +# RefineLevels: Refinement settings per refine level. (Default: null) +# - Level Refine level. +# Bonus Refinement bonus. (Default: 0) +# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0) +# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0) +# Chances: Success chance based on cost type. (Default: null) +# - Type Refinement cost type based on ore used. +# Rate Chance of success out of 0~100. (Default: 0) +# Price Amount of zeny required to refine. (Default: 0) +# Material Ore item required to refine. (Default: 0) +# BreakingRate Chance of item breaking out of 0~100. (Default: 0) +# DowngradeAmount Number of refine levels reduced on failure. (Default: 0) +########################################################################### + +Header: + Type: REFINE_DB + Version: 1 + +Body: + - Group: Armor + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Bonus: 66 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 2 + Bonus: 132 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 3 + Bonus: 198 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 4 + Bonus: 264 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 5 + Bonus: 330 + Chances: + - Type: Normal + Rate: 6000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 6 + Bonus: 396 + Chances: + - Type: Normal + Rate: 4000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 7 + Bonus: 462 + Chances: + - Type: Normal + Rate: 4000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 8 + Bonus: 528 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 2000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 9 + Bonus: 594 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 10 + Bonus: 660 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 900 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 2000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Group: Weapon + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Bonus: 200 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 400 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 600 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 800 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 1000 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 6 + Bonus: 1200 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 7 + Bonus: 1400 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 8 + Bonus: 1600 + RandomBonus: 300 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 6000 + Price: 50 + Material: Phracon + BreakingRate: 10000 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 1800 + RandomBonus: 600 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 4000 + Price: 50 + Material: Phracon + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 2000 + RandomBonus: 900 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 1900 + Price: 50 + Material: Phracon + BreakingRate: 10000 + - Type: Enriched + Rate: 3000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 2 + RefineLevels: + - Level: 1 + Bonus: 300 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 600 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 900 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 1200 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 1500 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 6 + Bonus: 1800 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 7 + Bonus: 2100 + RandomBonus: 500 + Chances: + - Type: Normal + Rate: 6000 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Bonus: 2400 + RandomBonus: 1000 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 4000 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 2700 + RandomBonus: 1500 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 3000 + RandomBonus: 2000 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 1900 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: Enriched + Rate: 3000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 3 + RefineLevels: + - Level: 1 + Bonus: 500 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 1000 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 1500 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 2000 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 2500 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 6 + Bonus: 3000 + RandomBonus: 800 + Chances: + - Type: Normal + Rate: 6000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 7 + Bonus: 3500 + RandomBonus: 1600 + Chances: + - Type: Normal + Rate: 5000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 8000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Bonus: 4000 + RandomBonus: 2400 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 2000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 4500 + RandomBonus: 3200 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 5000 + RandomBonus: 4000 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 1900 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 3000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + + - Level: 4 + RefineLevels: + - Level: 1 + Bonus: 700 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 1400 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 2100 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 2800 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 3500 + RandomBonus: 1300 + Chances: + - Type: Normal + Rate: 6000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 6 + Bonus: 4200 + RandomBonus: 2600 + Chances: + - Type: Normal + Rate: 4000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 7 + Bonus: 4900 + RandomBonus: 3900 + Chances: + - Type: Normal + Rate: 4000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Bonus: 5600 + RandomBonus: 5200 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 2000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 6300 + RandomBonus: 6500 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 7000 + RandomBonus: 7800 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 900 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 2000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Group: Shadow_Armor + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 2 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 3 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 4 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 5 + Chances: + - Type: Normal + Rate: 6000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 9000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 6 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 7 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 8 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 9 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 10 + Chances: + - Type: Normal + Rate: 900 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: Enriched + Rate: 2000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Group: Shadow_Weapon + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 2 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 3 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 4 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 5 + Chances: + - Type: Normal + Rate: 6000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 9000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 6 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 7 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Chances: + - Type: Normal + Rate: 900 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: Enriched + Rate: 2000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 diff --git a/db/pre-re/refine_db.yml b/db/pre-re/refine_db.yml deleted file mode 100644 index 70da3057730..00000000000 --- a/db/pre-re/refine_db.yml +++ /dev/null @@ -1,235 +0,0 @@ -# This file is a part of rAthena++. -# Copyright(C) 2021 rAthena Development Team -# https://rathena.org - https://github.com/rathena -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -########################################################################### -# Pre-Renewal Refine Database -########################################################################### -Armor: - StatsPerLevel: 66 - RandomBonusStartLevel: 0 - RandomBonusValue: 0 - Costs: - - Type: REFINE_COST_NORMAL - Price: 2000 - Material: 985 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7619 - Rates: - - Level: 5 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 6 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 7 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 10 - NormalChance: 9 - EnrichedChance: 20 - EventNormalChance: 9 - EventEnrichedChance: 35 -WeaponLv1: - StatsPerLevel: 200 - RandomBonusStartLevel: 8 - RandomBonusValue: 300 - Costs: - - Type: REFINE_COST_NORMAL - Price: 50 - Material: 1010 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - Rates: - - Level: 8 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 9 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 85 - - Level: 10 - NormalChance: 19 - EnrichedChance: 30 - EventNormalChance: 19 - EventEnrichedChance: 55 -WeaponLv2: - StatsPerLevel: 300 - RandomBonusStartLevel: 7 - RandomBonusValue: 500 - Costs: - - Type: REFINE_COST_NORMAL - Price: 200 - Material: 1011 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - Rates: - - Level: 7 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 8 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 85 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 60 - - Level: 10 - NormalChance: 19 - EnrichedChance: 30 - EventNormalChance: 19 - EventEnrichedChance: 45 -WeaponLv3: - StatsPerLevel: 500 - RandomBonusStartLevel: 6 - RandomBonusValue: 800 - Costs: - - Type: REFINE_COST_NORMAL - Price: 5000 - Material: 984 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - Rates: - - Level: 6 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 7 - NormalChance: 50 - EnrichedChance: 80 - EventNormalChance: 50 - EventEnrichedChance: 90 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 70 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 60 - - Level: 10 - NormalChance: 19 - EnrichedChance: 30 - EventNormalChance: 19 - EventEnrichedChance: 45 -WeaponLv4: - StatsPerLevel: 700 - RandomBonusStartLevel: 5 - RandomBonusValue: 1300 - Costs: - - Type: REFINE_COST_NORMAL - Price: 20000 - Material: 984 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - Rates: - - Level: 5 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 6 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 7 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 60 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 10 - NormalChance: 9 - EnrichedChance: 20 - EventNormalChance: 9 - EventEnrichedChance: 35 -Shadow: - StatsPerLevel: 0 - RandomBonusStartLevel: 0 - RandomBonusValue: 0 - Rates: - - Level: 5 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 6 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 7 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 10 - NormalChance: 9 - EnrichedChance: 20 - EventNormalChance: 9 - EventEnrichedChance: 35 diff --git a/db/re/refine.yml b/db/re/refine.yml new file mode 100644 index 00000000000..8457ca9ac5f --- /dev/null +++ b/db/re/refine.yml @@ -0,0 +1,1999 @@ +# This file is a part of rAthena++. +# Copyright(C) 2021 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Refine Database +########################################################################### +# +# Refine Settings +# +########################################################################### +# - Group Refine item type. +# Levels: Refinement settings per item level. (Default: null) +# - Level Item level. +# RefineLevels: Refinement settings per refine level. (Default: null) +# - Level Refine level. +# Bonus Refinement bonus. (Default: 0) +# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0) +# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0) +# Chances: Success chance based on cost type. (Default: null) +# - Type Refinement cost type based on ore used. +# Rate Chance of success out of 0~100. (Default: 0) +# Price Amount of zeny required to refine. (Default: 0) +# Material Ore item required to refine. (Default: 0) +# BreakingRate Chance of item breaking out of 0~100. (Default: 0) +# DowngradeAmount Number of refine levels reduced on failure. (Default: 0) +########################################################################### + +Header: + Type: REFINE_DB + Version: 1 + +Body: + - Group: Armor + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Bonus: 100 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 2 + Bonus: 200 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 3 + Bonus: 300 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 4 + Bonus: 400 + Chances: + - Type: Normal + Rate: 10000 + Price: 2000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Elunium + - Level: 5 + Bonus: 600 + Chances: + - Type: Normal + Rate: 6000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 6000 + Price: 20000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 6 + Bonus: 800 + Chances: + - Type: Normal + Rate: 4000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 20000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 7 + Bonus: 1000 + Chances: + - Type: Normal + Rate: 4000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 20000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 8 + Bonus: 1200 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 2000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 20000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 9 + Bonus: 1500 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 20000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 10 + Bonus: 1800 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 900 + Price: 2000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 900 + Price: 20000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 2000 + Price: 2000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 11 + Bonus: 2100 + BlacksmithBlessingAmount: 7 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 12 + Bonus: 2400 + BlacksmithBlessingAmount: 11 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 13 + Bonus: 2800 + BlacksmithBlessingAmount: 16 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 14 + Bonus: 3200 + BlacksmithBlessingAmount: 22 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 15 + Bonus: 3600 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 16 + Bonus: 4000 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 17 + Bonus: 4500 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 18 + Bonus: 5000 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 19 + Bonus: 5500 + Chances: + - Type: Normal + Rate: 500 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 500 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Level: 20 + Bonus: 6000 + Chances: + - Type: Normal + Rate: 500 + Price: 100000 + Material: Carnium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 500 + Price: 100000 + Material: HD_Carnium + DowngradeAmount: 1 + - Group: Weapon + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Bonus: 200 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 400 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 600 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 800 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 1000 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 6 + Bonus: 1200 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 7 + Bonus: 1400 + Chances: + - Type: Normal + Rate: 10000 + Price: 50 + Material: Phracon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 8 + Bonus: 1600 + RandomBonus: 300 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 6000 + Price: 50 + Material: Phracon + BreakingRate: 10000 + - Type: HD + Rate: 6000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 1800 + RandomBonus: 600 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 4000 + Price: 50 + Material: Phracon + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 2000 + RandomBonus: 900 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 1900 + Price: 50 + Material: Phracon + BreakingRate: 10000 + - Type: HD + Rate: 1900 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 3000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 11 + Bonus: 2200 + RandomBonus: 1200 + BlacksmithBlessingAmount: 7 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 12 + Bonus: 2400 + RandomBonus: 1500 + BlacksmithBlessingAmount: 11 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 13 + Bonus: 2600 + RandomBonus: 1800 + BlacksmithBlessingAmount: 16 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 14 + Bonus: 2800 + RandomBonus: 2100 + BlacksmithBlessingAmount: 22 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 15 + Bonus: 3000 + RandomBonus: 2400 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 16 + Bonus: 3300 + RandomBonus: 2700 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 17 + Bonus: 3600 + RandomBonus: 3000 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 18 + Bonus: 3900 + RandomBonus: 3300 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 19 + Bonus: 4500 + RandomBonus: 3600 + Chances: + - Type: Normal + Rate: 1500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 20 + Bonus: 4800 + RandomBonus: 3900 + Chances: + - Type: Normal + Rate: 1500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 2 + RefineLevels: + - Level: 1 + Bonus: 300 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 600 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 900 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 1200 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 1500 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 6 + Bonus: 1800 + Chances: + - Type: Normal + Rate: 10000 + Price: 200 + Material: Emveretarcon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 7 + Bonus: 2100 + RandomBonus: 500 + Chances: + - Type: Normal + Rate: 6000 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: HD + Rate: 6000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Bonus: 2400 + RandomBonus: 1000 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 4000 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 2700 + RandomBonus: 1500 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 3000 + RandomBonus: 2000 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 1900 + Price: 200 + Material: Emveretarcon + BreakingRate: 10000 + - Type: HD + Rate: 1900 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 3000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 11 + Bonus: 3300 + RandomBonus: 2500 + BlacksmithBlessingAmount: 7 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 12 + Bonus: 3600 + RandomBonus: 3000 + BlacksmithBlessingAmount: 11 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 13 + Bonus: 3900 + RandomBonus: 3500 + BlacksmithBlessingAmount: 16 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 14 + Bonus: 4200 + RandomBonus: 4000 + BlacksmithBlessingAmount: 22 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 15 + Bonus: 4500 + RandomBonus: 4500 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 16 + Bonus: 5100 + RandomBonus: 5000 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 17 + Bonus: 5700 + RandomBonus: 5500 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 18 + Bonus: 6300 + RandomBonus: 6000 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 19 + Bonus: 6900 + RandomBonus: 6500 + Chances: + - Type: Normal + Rate: 1500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 20 + Bonus: 7500 + RandomBonus: 7000 + Chances: + - Type: Normal + Rate: 1500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 3 + RefineLevels: + - Level: 1 + Bonus: 500 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 1000 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 1500 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 2000 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 2500 + Chances: + - Type: Normal + Rate: 10000 + Price: 5000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 6 + Bonus: 3000 + RandomBonus: 800 + Chances: + - Type: Normal + Rate: 6000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 6000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 7 + Bonus: 3500 + RandomBonus: 1600 + Chances: + - Type: Normal + Rate: 5000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 5000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 8000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Bonus: 4000 + RandomBonus: 2400 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 2000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 4500 + RandomBonus: 3200 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 5000 + RandomBonus: 4000 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 1900 + Price: 5000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 1900 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 3000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 11 + Bonus: 5500 + RandomBonus: 4800 + BlacksmithBlessingAmount: 7 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 12 + Bonus: 6000 + RandomBonus: 5600 + BlacksmithBlessingAmount: 11 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 13 + Bonus: 6500 + RandomBonus: 6400 + BlacksmithBlessingAmount: 16 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 14 + Bonus: 7000 + RandomBonus: 7200 + BlacksmithBlessingAmount: 22 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 15 + Bonus: 7500 + RandomBonus: 8000 + Chances: + - Type: Normal + Rate: 1800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 16 + Bonus: 8400 + RandomBonus: 8800 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 17 + Bonus: 9300 + RandomBonus: 9600 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 18 + Bonus: 10200 + RandomBonus: 10400 + Chances: + - Type: Normal + Rate: 1700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 19 + Bonus: 11100 + RandomBonus: 11200 + Chances: + - Type: Normal + Rate: 1500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 20 + Bonus: 12000 + RandomBonus: 12000 + Chances: + - Type: Normal + Rate: 1500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 1500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 4 + RefineLevels: + - Level: 1 + Bonus: 700 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 2 + Bonus: 1400 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 3 + Bonus: 2100 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 4 + Bonus: 2800 + Chances: + - Type: Normal + Rate: 10000 + Price: 20000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 20000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 2000 + Material: Enriched_Oridecon + - Level: 5 + Bonus: 3500 + RandomBonus: 1400 + Chances: + - Type: Normal + Rate: 6000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 6000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 9000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 6 + Bonus: 4200 + RandomBonus: 2800 + Chances: + - Type: Normal + Rate: 4000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 7 + Bonus: 4900 + RandomBonus: 4200 + Chances: + - Type: Normal + Rate: 4000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Bonus: 5600 + RandomBonus: 5600 + BlacksmithBlessingAmount: 1 + Chances: + - Type: Normal + Rate: 2000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Bonus: 6300 + RandomBonus: 7000 + BlacksmithBlessingAmount: 2 + Chances: + - Type: Normal + Rate: 2000 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Bonus: 7000 + RandomBonus: 8400 + BlacksmithBlessingAmount: 4 + Chances: + - Type: Normal + Rate: 900 + Price: 20000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 900 + Price: 20000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 2000 + Price: 2000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 11 + Bonus: 7700 + RandomBonus: 9800 + BlacksmithBlessingAmount: 7 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 12 + Bonus: 8400 + RandomBonus: 11200 + BlacksmithBlessingAmount: 11 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 13 + Bonus: 9100 + RandomBonus: 12600 + BlacksmithBlessingAmount: 16 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 14 + Bonus: 9800 + RandomBonus: 14000 + BlacksmithBlessingAmount: 22 + Chances: + - Type: Normal + Rate: 800 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 800 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 15 + Bonus: 10500 + RandomBonus: 15400 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 16 + Bonus: 11700 + RandomBonus: 16800 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 17 + Bonus: 12900 + RandomBonus: 18200 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 18 + Bonus: 14100 + RandomBonus: 19600 + Chances: + - Type: Normal + Rate: 700 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 700 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 19 + Bonus: 15300 + RandomBonus: 21000 + Chances: + - Type: Normal + Rate: 500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Level: 20 + Bonus: 16500 + RandomBonus: 22400 + Chances: + - Type: Normal + Rate: 500 + Price: 100000 + Material: Bradium + BreakingRate: 2000 + DowngradeAmount: 3 + - Type: HD + Rate: 500 + Price: 100000 + Material: HD_Bradium + DowngradeAmount: 1 + - Group: Shadow_Armor + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 2 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 3 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 4 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Elunium + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Elunium + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Elunium + - Level: 5 + Chances: + - Type: Normal + Rate: 6000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 6000 + Price: 10000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 9000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 6 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 10000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 7 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 10000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 8 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 10000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 9 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 10000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Level: 10 + Chances: + - Type: Normal + Rate: 900 + Price: 10000 + Material: Elunium + BreakingRate: 10000 + - Type: HD + Rate: 900 + Price: 10000 + Material: HD_Elunium + DowngradeAmount: 1 + - Type: Enriched + Rate: 2000 + Price: 10000 + Material: Enriched_Elunium + BreakingRate: 10000 + - Group: Shadow_Weapon + Levels: + - Level: 1 + RefineLevels: + - Level: 1 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 2 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 3 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 4 + Chances: + - Type: Normal + Rate: 10000 + Price: 10000 + Material: Oridecon + - Type: HD + Rate: 10000 + Price: 10000 + Material: HD_Oridecon + - Type: Enriched + Rate: 10000 + Price: 10000 + Material: Enriched_Oridecon + - Level: 5 + Chances: + - Type: Normal + Rate: 6000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 6000 + Price: 10000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 9000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 6 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 10000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 7 + Chances: + - Type: Normal + Rate: 4000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 4000 + Price: 10000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 7000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 8 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 10000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 9 + Chances: + - Type: Normal + Rate: 2000 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 2000 + Price: 10000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 4000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 + - Level: 10 + Chances: + - Type: Normal + Rate: 900 + Price: 10000 + Material: Oridecon + BreakingRate: 10000 + - Type: HD + Rate: 900 + Price: 10000 + Material: HD_Oridecon + DowngradeAmount: 1 + - Type: Enriched + Rate: 2000 + Price: 10000 + Material: Enriched_Oridecon + BreakingRate: 10000 diff --git a/db/re/refine_db.yml b/db/re/refine_db.yml deleted file mode 100644 index 01c51d8ff26..00000000000 --- a/db/re/refine_db.yml +++ /dev/null @@ -1,614 +0,0 @@ -# This file is a part of rAthena++. -# Copyright(C) 2021 rAthena Development Team -# https://rathena.org - https://github.com/rathena -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -########################################################################### -# Renewal Refine Database -########################################################################### -Armor: - StatsPerLevel: 0 - RandomBonusStartLevel: 0 - RandomBonusValue: 0 - Costs: - - Type: REFINE_COST_NORMAL - Price: 2000 - Material: 985 - - Type: REFINE_COST_OVER10 - Price: 100000 - Material: 6223 - - Type: REFINE_COST_HD - Price: 20000 - Material: 6241 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7619 - - Type: REFINE_COST_OVER10_HD - Price: 100000 - Material: 6225 - - Type: REFINE_COST_HOLINK - Price: 15000 - Material: 7619 - - Type: REFINE_COST_WAGJAK - Price: 20000 - Material: 985 - Rates: - - Level: 1 - Bonus: 100 - - Level: 2 - Bonus: 100 - - Level: 3 - Bonus: 100 - - Level: 4 - Bonus: 100 - - Level: 5 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - Bonus: 200 - - Level: 6 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - Bonus: 200 - - Level: 7 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - Bonus: 200 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - Bonus: 200 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - Bonus: 300 - - Level: 10 - NormalChance: 9 - EnrichedChance: 20 - EventNormalChance: 9 - EventEnrichedChance: 35 - Bonus: 300 - - Level: 11 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 300 - - Level: 12 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 300 - - Level: 13 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 16 - EventEnrichedChance: 16 - Bonus: 400 - - Level: 14 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 16 - EventEnrichedChance: 16 - Bonus: 400 - - Level: 15 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 400 - - Level: 16 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 400 - - Level: 17 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 14 - EventEnrichedChance: 14 - Bonus: 500 - - Level: 18 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 14 - EventEnrichedChance: 14 - Bonus: 500 - - Level: 19 - NormalChance: 5 - EnrichedChance: 5 - EventNormalChance: 10 - EventEnrichedChance: 10 - Bonus: 500 - - Level: 20 - NormalChance: 5 - EnrichedChance: 5 - EventNormalChance: 10 - EventEnrichedChance: 10 - Bonus: 500 -WeaponLv1: - StatsPerLevel: 200 - RandomBonusStartLevel: 8 - RandomBonusValue: 300 - Costs: - - Type: REFINE_COST_NORMAL - Price: 50 - Material: 1010 - - Type: REFINE_COST_OVER10 - Price: 100000 - Material: 6224 - - Type: REFINE_COST_HD - Price: 20000 - Material: 6240 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - - Type: REFINE_COST_OVER10_HD - Price: 100000 - Material: 6226 - - Type: REFINE_COST_HOLINK - Price: 500 - Material: 7620 - - Type: REFINE_COST_WAGJAK - Price: 1000 - Material: 1010 - Rates: - - Level: 8 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 9 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 85 - - Level: 10 - NormalChance: 19 - EnrichedChance: 30 - EventNormalChance: 19 - EventEnrichedChance: 55 - - Level: 11 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 40 - EventEnrichedChance: 40 - - Level: 12 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 40 - EventEnrichedChance: 40 - - Level: 13 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 35 - EventEnrichedChance: 35 - - Level: 14 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 35 - EventEnrichedChance: 35 - - Level: 15 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 30 - EventEnrichedChance: 30 - - Level: 16 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 30 - EventEnrichedChance: 30 - Bonus: 300 - - Level: 17 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 300 - - Level: 18 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 300 - - Level: 19 - NormalChance: 15 - EnrichedChance: 15 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 300 - - Level: 20 - NormalChance: 15 - EnrichedChance: 15 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 300 -WeaponLv2: - StatsPerLevel: 300 - RandomBonusStartLevel: 7 - RandomBonusValue: 500 - Costs: - - Type: REFINE_COST_NORMAL - Price: 200 - Material: 1011 - - Type: REFINE_COST_OVER10 - Price: 100000 - Material: 6224 - - Type: REFINE_COST_HD - Price: 20000 - Material: 6240 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - - Type: REFINE_COST_OVER10_HD - Price: 100000 - Material: 6226 - - Type: REFINE_COST_HOLINK - Price: 2000 - Material: 7620 - - Type: REFINE_COST_WAGJAK - Price: 2000 - Material: 1011 - Rates: - - Level: 7 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 8 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 85 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 60 - - Level: 10 - NormalChance: 19 - EnrichedChance: 30 - EventNormalChance: 19 - EventEnrichedChance: 45 - - Level: 11 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 40 - EventEnrichedChance: 40 - - Level: 12 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 40 - EventEnrichedChance: 40 - - Level: 13 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 35 - EventEnrichedChance: 35 - - Level: 14 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 35 - EventEnrichedChance: 35 - - Level: 15 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 30 - EventEnrichedChance: 30 - - Level: 16 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 30 - EventEnrichedChance: 30 - Bonus: 600 - - Level: 17 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 600 - - Level: 18 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 600 - - Level: 19 - NormalChance: 15 - EnrichedChance: 15 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 600 - - Level: 20 - NormalChance: 15 - EnrichedChance: 15 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 600 -WeaponLv3: - StatsPerLevel: 500 - RandomBonusStartLevel: 6 - RandomBonusValue: 800 - Costs: - - Type: REFINE_COST_NORMAL - Price: 5000 - Material: 984 - - Type: REFINE_COST_OVER10 - Price: 100000 - Material: 6224 - - Type: REFINE_COST_HD - Price: 20000 - Material: 6240 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - - Type: REFINE_COST_OVER10_HD - Price: 100000 - Material: 6226 - - Type: REFINE_COST_HOLINK - Price: 20000 - Material: 7620 - - Type: REFINE_COST_WAGJAK - Price: 10000 - Material: 984 - Rates: - - Level: 6 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 7 - NormalChance: 50 - EnrichedChance: 80 - EventNormalChance: 50 - EventEnrichedChance: 90 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 70 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 60 - - Level: 10 - NormalChance: 19 - EnrichedChance: 30 - EventNormalChance: 19 - EventEnrichedChance: 45 - - Level: 11 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 40 - EventEnrichedChance: 40 - - Level: 12 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 40 - EventEnrichedChance: 40 - - Level: 13 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 35 - EventEnrichedChance: 35 - - Level: 14 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 35 - EventEnrichedChance: 35 - - Level: 15 - NormalChance: 18 - EnrichedChance: 18 - EventNormalChance: 30 - EventEnrichedChance: 30 - - Level: 16 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 30 - EventEnrichedChance: 30 - Bonus: 900 - - Level: 17 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 900 - - Level: 18 - NormalChance: 17 - EnrichedChance: 17 - EventNormalChance: 20 - EventEnrichedChance: 20 - Bonus: 900 - - Level: 19 - NormalChance: 15 - EnrichedChance: 15 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 900 - - Level: 20 - NormalChance: 15 - EnrichedChance: 15 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 900 -WeaponLv4: - StatsPerLevel: 700 - RandomBonusStartLevel: 5 - RandomBonusValue: 1400 - Costs: - - Type: REFINE_COST_NORMAL - Price: 20000 - Material: 984 - - Type: REFINE_COST_OVER10 - Price: 100000 - Material: 6224 - - Type: REFINE_COST_HD - Price: 20000 - Material: 6240 - - Type: REFINE_COST_ENRICHED - Price: 2000 - Material: 7620 - - Type: REFINE_COST_OVER10_HD - Price: 100000 - Material: 6226 - - Type: REFINE_COST_HOLINK - Price: 50000 - Material: 7620 - - Type: REFINE_COST_WAGJAK - Price: 20000 - Material: 984 - Rates: - - Level: 5 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 6 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 7 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 60 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 10 - NormalChance: 9 - EnrichedChance: 20 - EventNormalChance: 9 - EventEnrichedChance: 35 - - Level: 11 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 20 - EventEnrichedChance: 20 - - Level: 12 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 20 - EventEnrichedChance: 20 - - Level: 13 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 16 - EventEnrichedChance: 16 - - Level: 14 - NormalChance: 8 - EnrichedChance: 8 - EventNormalChance: 16 - EventEnrichedChance: 16 - - Level: 15 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 15 - EventEnrichedChance: 15 - - Level: 16 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 15 - EventEnrichedChance: 15 - Bonus: 1200 - - Level: 17 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 14 - EventEnrichedChance: 14 - Bonus: 1200 - - Level: 18 - NormalChance: 7 - EnrichedChance: 7 - EventNormalChance: 14 - EventEnrichedChance: 14 - Bonus: 1200 - - Level: 19 - NormalChance: 5 - EnrichedChance: 5 - EventNormalChance: 10 - EventEnrichedChance: 10 - Bonus: 1200 - - Level: 20 - NormalChance: 5 - EnrichedChance: 5 - EventNormalChance: 10 - EventEnrichedChance: 10 - Bonus: 1200 -Shadow: - StatsPerLevel: 0 - RandomBonusStartLevel: 0 - RandomBonusValue: 0 - Costs: - - Type: REFINE_COST_NORMAL - Price: 20000 - Material: 985 - - Type: REFINE_COST_HD - Price: 20000 - Material: 6241 - - Type: REFINE_COST_ENRICHED - Price: 20000 - Material: 7619 - Rates: - - Level: 5 - NormalChance: 60 - EnrichedChance: 90 - EventNormalChance: 60 - EventEnrichedChance: 95 - - Level: 6 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 7 - NormalChance: 40 - EnrichedChance: 70 - EventNormalChance: 40 - EventEnrichedChance: 80 - - Level: 8 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 9 - NormalChance: 20 - EnrichedChance: 40 - EventNormalChance: 20 - EventEnrichedChance: 50 - - Level: 10 - NormalChance: 9 - EnrichedChance: 20 - EventNormalChance: 9 - EventEnrichedChance: 35 diff --git a/db/refine.yml b/db/refine.yml new file mode 100644 index 00000000000..612c13ddd6e --- /dev/null +++ b/db/refine.yml @@ -0,0 +1,52 @@ +# This file is a part of rAthena. +# Copyright(C) 2021 rAthena Development Team +# https://rathena.org - https://github.com/rathena +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +########################################################################### +# Refine Database +########################################################################### +# +# Refine Settings +# +########################################################################### +# - Group Refine item type. +# Levels: Refinement settings per item level. (Default: null) +# - Level Item level. +# RefineLevels: Refinement settings per refine level. (Default: null) +# - Level Refine level. +# Bonus Refinement bonus. (Default: 0) +# RandomBonus Extra refinement bonus of 0~RandomBonus stacked on Bonus. (Default: 0) +# BlacksmithBlessingAmount Amount of Blacksmith Blessing required. (Default: 0) +# Chances: Success chance based on cost type. (Default: null) +# - Type Refinement cost type based on ore used. +# Rate Chance of success out of 0~100. (Default: 0) +# Price Amount of zeny required to refine. (Default: 0) +# Material Ore item required to refine. (Default: 0) +# BreakingRate Chance of item breaking out of 0~100. (Default: 0) +# DowngradeAmount Number of refine levels reduced on failure. (Default: 0) +########################################################################### + +Header: + Type: REFINE_DB + Version: 1 + +Footer: + Imports: + - Path: db/pre-re/refine.yml + Mode: Prerenewal + - Path: db/re/refine.yml + Mode: Renewal + - Path: db/import/refine.yml diff --git a/doc/atcommands.txt b/doc/atcommands.txt index e22def9cad4..c13d73ff7db 100644 --- a/doc/atcommands.txt +++ b/doc/atcommands.txt @@ -1229,6 +1229,14 @@ Adopts the specified player with the attached character as one of the parents. --------------------------------------- +@refineui + +Opens the refine user interface. + +Note: This command requires packet version 2016-10-12 or newer. + +--------------------------------------- + @request Sends a message to all connected GMs (via the GM whisper system). diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 36a5ece6243..8bb7996eb65 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -2852,12 +2852,8 @@ passed arguments and . Valid cost types are: REFINE_COST_NORMAL - For normal refining -REFINE_COST_OVER10 - For refining over +10 REFINE_COST_HD - For refining with HD ores REFINE_COST_ENRICHED - For refining with enriched ores -REFINE_COST_OVER10_HD - For refining over +10 with HD ores -REFINE_COST_HOLINK - For refining at Holink in Malangdo -REFINE_COST_WAGJAK - For refining at Refining Machine Wagjak in the Novice Academy This function will return required cost for refining based on argument. @@ -2867,7 +2863,15 @@ REFINE_ZENY_COST - Zeny REFINE_MATERIAL_ID - Material Item ID This function will return -1 on failure. The function fails if the cost type -is invalid or if there is no item in the equipment slot. +is invalid or if there is no item in the equipment slot. + +--------------------------------------- + +*refineui({}) + +Opens the refine UI for the attached player or the given character id. + +This feature requires 2016-10-12aRagexeRE or newer. --------------------------------------- diff --git a/npc/merchants/refine.txt b/npc/merchants/refine.txt index 14772926ff2..ae18c7c816c 100644 --- a/npc/merchants/refine.txt +++ b/npc/merchants/refine.txt @@ -16,6 +16,7 @@ //= 3.2a Added 'disable_items' command. [Euphy] //= 3.3 Some official script updates. [Euphy] //= 3.4 Added VIP features. [Euphy] +//= 3.5 Added Refine UI [Atemo, Lemongrass] //============================================================ // Christopher: Geffen Blacksmith @@ -522,33 +523,102 @@ ein_in01,38,29,0 script Paul Spanner 63,{ // Weapon/Armor Refiners //============================================================ -prt_in,63,60,0 script Hollgrehenn 85,{ - callfunc "refinemain","Hollgrehenn",0; - end; +prt_in,63,60,0 script Hollgrehenn 4_M_03,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Hollgrehenn]"; + mes "I'm a blacksmith who can refine weapons and equipment."; + mes "Do you have any items that you'd like to refine?"; + close2; + refineui(); + end; + }else{ + callfunc "refinemain","Hollgrehenn",0; + end; + } } -morocc_in,73,38,6 script Aragham 99,{ - callfunc "refinemain","Aragham",0; - end; + +morocc_in,73,38,6 script Aragham 4W_M_03,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Aragham]"; + mes "De~ sert~ Blacksmith~"; + mes "Aragham Ssaleh~ who can refine anything Ssaleh~"; + mes "Let me see what you'd like to refine~"; + close2; + refineui(); + end; + }else{ + callfunc "refinemain","Aragham",0; + end; + } } -payon,144,173,5 script Antonio 88,{ - callfunc "refinemain","Antonio",0; - end; + +payon,144,173,5 script Antonio 4_M_ORIENT01,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Antonio]"; + mes "Stop nagging and get me the equipment you want to refine."; + close2; + refineui(); + end; + }else{ + callfunc "refinemain","Antonio",0; + end; + } } -alberta_in,28,58,0 script Fredrik 85,{ - callfunc "refinemain","Fredrik",0; - end; + +alberta_in,28,58,0 script Fredrik 4_M_03,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Fredrik Hermanthorn]"; + mes "I am a blacksmith who can refine your weapon or equipment."; + mes "Do you have anything that you'd like to refine?"; + close2; + refineui(); + end; + }else{ + callfunc "refinemain","Fredrik",0; + end; + } } -yuno_in01,171,21,4 script Lambert 88,{ - callfunc "refinemain","Lambert",0; - end; + +yuno_in01,171,21,4 script Lambert 4_M_ORIENT01,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Lambert]"; + mes "Wel...come... This is... the best... smithy... in Juno."; + close2; + refineui(); + end; + }else{ + callfunc "refinemain","Lambert",0; + end; + } } -ein_in01,24,87,5 script Manthasman 826,{ - callfunc "refinemain","Manthasman Pruhag",0; - end; + +ein_in01,24,87,5 script Manthasman 4_M_DWARF,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Manthasman Pruhag]"; + mes "Hahaha, you already knew it. So you'd like to refine something?"; + mes "Let's try something risky today!"; + close2; + refineui(); + end; + }else{ + callfunc "refinemain","Manthasman Pruhag",0; + end; + } } -lhz_in02,282,20,7 script Fulerr 869,{ - callfunc "refinemain","Fulerr",0; - end; + +lhz_in02,282,20,7 script Fulerr 4_M_LGTMAN,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Fulerr]"; + mes "Hehe... You wanna refine?"; + mes "Hehe.. Consider it done.."; + mes "Hehe...."; + close2; + refineui(); + end; + }else{ + callfunc "refinemain","Fulerr",0; + end; + } } //============================================================ diff --git a/npc/re/jobs/novice/academy.txt b/npc/re/jobs/novice/academy.txt index bc8cabaf62e..75e50c51753 100644 --- a/npc/re/jobs/novice/academy.txt +++ b/npc/re/jobs/novice/academy.txt @@ -12871,13 +12871,33 @@ izlude_d,153,126,1 duplicate(Refinery Owner Han#iz) Refinery Owner Han#iz_d 4_M_ } } - .@price = getequiprefinecost(.@part, REFINE_COST_WAGJAK, REFINE_ZENY_COST); - .@material = getequiprefinecost(.@part, REFINE_COST_WAGJAK, REFINE_MATERIAL_ID); +// Wagjak has different hardcoded prices +// .@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST); + .@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID); - if ((getequipweaponlv(.@part) >= 1) && (getequipweaponlv(.@part) <= 4)) - .@type$ = "Level " + getequipweaponlv(.@part) + " weapon"; - else + switch(getequipweaponlv(.@part)) { + default: + case 0: // Armor + .@price = 20000; .@type$ = "Armor"; + break; + case 1: // Level 1 Weapon + .@price = 1000; + .@type$ = "Level 1 weapon"; + break; + case 2: // Level 2 Weapon + .@price = 2000; + .@type$ = "Level 2 weapon"; + break; + case 3: // Level 3 Weapon + .@price = 10000; + .@type$ = "Level 3 weapon"; + break; + case 4: // Level 4 Weapon + .@price = 20000; + .@type$ = "Level 4 weapon"; + break; + } mes "[Refining Machine Wagjak]"; mes "Type : "+ .@type$ +""; diff --git a/npc/re/merchants/advanced_refiner.txt b/npc/re/merchants/advanced_refiner.txt index 3257f007131..6d6261f5508 100644 --- a/npc/re/merchants/advanced_refiner.txt +++ b/npc/re/merchants/advanced_refiner.txt @@ -73,29 +73,35 @@ malangdo,221,174,6 script Holink#mal_cash 559,{ .@refineitemid = getequipid(.@part); // save id of the item .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3); - .@price = getequiprefinecost(.@part, REFINE_COST_HOLINK, REFINE_ZENY_COST); - .@material = getequiprefinecost(.@part, REFINE_COST_HOLINK, REFINE_MATERIAL_ID); +// Holink has different hardcoded prices +// .@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST); + .@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID); switch(getequipweaponlv(.@part)) { default: case 0: // Armor .@type$ = "armor"; + .@price = 15000; mes "You have chosen an armor, meow~"; break; case 1: // Level 1 Weapon .@type$ = "weapon"; + .@price = 500; mes "A level 1 weapon...?"; break; case 2: // Level 2 Weapon .@type$ = "weapon"; + .@price = 2000; mes "Meow, a level 2 weapon...?"; break; case 3: // Level 3 Weapon .@type$ = "weapon"; + .@price = 20000; mes "Meow Meow~~ A level 3 weapon~~"; break; case 4: // Level 4 Weapon .@type$ = "weapon"; + .@price = 50000; mes "Me-Meow!... A level 4 weapon...!"; mes "I've only seen it twice while"; mes "learning from Aragam... Me-Meow!!"; diff --git a/npc/re/merchants/hd_refiner.txt b/npc/re/merchants/hd_refiner.txt index ed1160e1d2d..e1cd28bdcc1 100644 --- a/npc/re/merchants/hd_refiner.txt +++ b/npc/re/merchants/hd_refiner.txt @@ -1,4 +1,4 @@ -//===== rAthena Script ======================================= +//===== rAthena Script ======================================= //= HD Refiners //===== Description: ========================================= //= [Official Conversion] @@ -28,9 +28,9 @@ mes "So lets kick this into overdrive, what d' ya say? What item do you want to refine?"; next; setarray .@indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW; - for(set .@i,1; .@i<=10; set .@i,.@i+1) - set .@menu$, .@menu$ + ( getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) +"-[Not equipped]" ) +":"; - set .@part, .@indices[ select(.@menu$) ]; + for ( .@i = 1; .@i <= 10; ++.@i ) + .@menu$ = .@menu$ + ( getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) + "-[Not equipped]" ) + ":"; + .@part = .@indices[ select(.@menu$) ]; if (!getequipisequiped(.@part)) { mes "[Blacksmith Mighty Hammer]"; switch(.@part) { @@ -68,23 +68,33 @@ mes "This item can't be refined."; close; } - if (getequiprefinerycnt(.@part) < 7 || getequiprefinerycnt(.@part) > 9) { + switch( getequiprefinerycnt(.@part) ) { + case 7: + .@blacksmith_blessing_count = 1; + break; + case 8: + .@blacksmith_blessing_count = 2; + break; + case 9: + .@blacksmith_blessing_count = 4; + break; + default: mes "[Blacksmith Mighty Hammer]"; mes "I only handle items with refine levels from +7 to +9."; close; } - + .@refineitemid = getequipid(.@part); // save id of the item .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3); .@price = getequiprefinecost(.@part, REFINE_COST_HD, REFINE_ZENY_COST); .@material = getequiprefinecost(.@part, REFINE_COST_HD, REFINE_MATERIAL_ID); - + mes "[Blacksmith Mighty Hammer]"; - mes "In order to refine the gear you selected you need ^ff9999"+getitemname(.@material)+"^000000 and 20,000 zeny as a fee."; + mes "In order to refine the gear you selected you need ^ff9999" + getitemname(.@material) + "^000000 and 20,000 zeny as a fee."; mes "Do you have them ready?"; next; - if(select("Yes:No") == 2) { + if (select("Yes:No") == 2) { mes "[Blacksmith Mighty Hammer]"; mes "I will wait until you are ready."; close; @@ -95,19 +105,43 @@ mes "Well, even if it fails, it only decreases by 1 refine level."; mes "Would you like to continue refining?"; next; - if(select("Yes:No") == 2) { + if (countitem(6635) < .@blacksmith_blessing_count) + setarray .@menu$[1], "Yes", "Not yet"; + else { + mes "[Blacksmith Mighty Hammer]"; + mes "Ah! Is it the ^0000ffBlacksmith Blessing^000000?"; + mes "With the Blacksmith Blessing, the equipment won't vanish if the refine fails!"; + next; + mes "[Blacksmith Mighty Hammer]"; + .@weapon_lvl = getequipweaponlv(.@part); + if (.@weapon_lvl < 1 || .@weapon_lvl > 4) + mes "For +" + getequiprefinerycnt(.@part) + " equipment, refine with^316AC5 " + .@blacksmith_blessing_count + " unit(s) Blacksmith Blessing^000000 can prevent the equipment from vanishing. Do you want use it to refine?"; + else + mes "For +" + getequiprefinerycnt(.@part) + " weapon, refine with^316AC5 " + .@blacksmith_blessing_count + " unit(s) Blacksmith Blessing^000000 can prevent the equipment from vanishing. Do you want use it to refine?"; + next; + setarray .@menu$[0], "Use it to refine", "Refine directly without it", "Don't refine yet"; + } + switch( select(.@menu$[0], .@menu$[1], .@menu$[2]) ) { + case 1: + .@bless_who = 1; + break; + case 2: + break; + case 3: mes "[Blacksmith Mighty Hammer]"; mes "Only those who overcome fear of failure will obtain a masterpiece."; close; } } - if (countitem(.@material) == 0 || Zeny < .@price) { + if ((.@bless_who && countitem(6635) < .@blacksmith_blessing_count) || countitem(.@material) == 0 || Zeny < .@price) { mes "[Blacksmith Mighty Hammer]"; mes "Didn't you just say you had everything ready?"; close; } + if (.@bless_who) + delitem 6635, .@blacksmith_blessing_count; delitem .@material,1; - set Zeny, Zeny-.@price; + Zeny = Zeny - .@price; // anti-hack if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || @@ -131,6 +165,17 @@ mes "Here, have it. Refine succeeded flawlessly!"; close; } + if (.@bless_who == 1) { + specialeffect EF_HOLYHIT; + next; + emotion ET_HUK; + mes "[Blacksmith Mighty Hammer]"; + mes "What?!!"; + next; + mes "[Blacksmith Mighty Hammer]"; + mes "Aiya! I am faceless now. HmHm."; + close; + } downrefitem .@part; next; emotion ET_HUK; @@ -141,16 +186,16 @@ mes "I am sure a person like you would never blame me for a decrease in refine level by 1. Hmm."; close; } -prt_in,59,54,3 duplicate(MightyHammer) Mighty Hammer#prt 826 -morocc_in,65,30,3 duplicate(MightyHammer) Mighty Hammer#morocc 826 -payon,148,176,3 duplicate(MightyHammer) Mighty Hammer#pay 826 -alberta_in,16,56,3 duplicate(MightyHammer) Mighty Hammer#alb 826 -yuno_in01,171,18,3 duplicate(MightyHammer) Mighty Hammer#yuno 826 -ein_in01,22,82,3 duplicate(MightyHammer) Mighty Hammer#ein 826 -lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826 +prt_in,59,54,3 duplicate(MightyHammer) Mighty Hammer#prt 4_M_DWARF +morocc_in,65,30,3 duplicate(MightyHammer) Mighty Hammer#morocc 4_M_DWARF +payon,148,176,3 duplicate(MightyHammer) Mighty Hammer#pay 4_M_DWARF +alberta_in,16,56,3 duplicate(MightyHammer) Mighty Hammer#alb 4_M_DWARF +yuno_in01,171,18,3 duplicate(MightyHammer) Mighty Hammer#yuno 4_M_DWARF +ein_in01,22,82,3 duplicate(MightyHammer) Mighty Hammer#ein 4_M_DWARF +lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 4_M_DWARF // iRO NPC locations: -// payon,174,133,4 duplicate(MightyHammer) Mighty Hammer#im 826 +// payon,174,133,4 duplicate(MightyHammer) Mighty Hammer#im 4_M_DWARF // Basta (+10 and up) :: cash_smelting //============================================================ @@ -165,9 +210,9 @@ lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826 mes "Which equipment do you want to refine?"; next; setarray .@indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW; - for(set .@i,1; .@i<=10; set .@i,.@i+1) - set .@menu$, .@menu$ + ( getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) +"-[Unequipped]" ) +":"; - set .@part, .@indices[ select(.@menu$) ]; + for ( .@i = 1; .@i <= 10; ++.@i ) + .@menu$ = .@menu$ + ( getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) + "-[Unequipped]" ) + ":"; + .@part = .@indices[ select(.@menu$) ]; if (!getequipisequiped(.@part)) { mes "[Basta]"; switch(.@part) { @@ -205,12 +250,17 @@ lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826 mes "Even I cannot refine this item. There's no way."; close; } - if (getequiprefinerycnt(.@part) < 10) { + .@refine_count = getequiprefinerycnt(.@part); + if (.@refine_count < 10) { mes "[Basta]"; mes "Haven't I told you? I only refine equipments that are +10 and above."; close; } - if (getequiprefinerycnt(.@part) == 20) { + else if (.@refine_count == 10) + .@blacksmith_blessing_count = 7; + else if (.@refine_count == 11) + .@blacksmith_blessing_count = 11; + else if (.@refine_count == 20) { mes "[Basta]"; mes "This weapon is perfect, no need to refine it anymore~"; close; @@ -218,33 +268,27 @@ lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826 .@refineitemid = getequipid(.@part); // save id of the item .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3); - .@price = getequiprefinecost(.@part, REFINE_COST_OVER10_HD, REFINE_ZENY_COST); - .@material = getequiprefinecost(.@part, REFINE_COST_OVER10_HD, REFINE_MATERIAL_ID); - switch(getequipweaponlv(.@part)) { - default: - case 0: - set .@type$,"armor"; - break; - case 1: - case 2: - case 3: - case 4: - set .@type$,"weapon"; - break; - } + .@price = getequiprefinecost(.@part, REFINE_COST_HD, REFINE_ZENY_COST); + .@material = getequiprefinecost(.@part, REFINE_COST_HD, REFINE_MATERIAL_ID); + + .@weapon_lvl = getequipweaponlv(.@part); + if (.@weapon_lvl < 1 || .@weapon_lvl > 4) + .@type$ = "armor"; + else + .@type$ = "weapon"; mes "[Basta]"; mes "Hmm... is this the one you want to refine?"; - mes "To refine this equipment, I need 1 ^ff9999"+getitemname(.@material)+"^000000 and " + callfunc("F_InsertComma",.@price) + " zeny as a fee."; + mes "To refine this equipment, I need 1 ^ff9999" + getitemname(.@material) + "^000000 and " + callfunc("F_InsertComma",.@price) + " zeny as a fee."; mes "Do you really want to refine this?"; next; - if(select("Yes:No") == 2) { + if (select("Yes:No") == 2) { mes "[Basta]"; mes "Okay. If that's what you want..."; close; } if (getequippercentrefinery(.@part, true) < 100) { mes "[Basta]"; - mes "This "+.@type$+" has already been refined pretty high."; + mes "This " + .@type$ + " has already been refined pretty high."; mes "If you try to refine it more, the refine level could decrease."; next; mes "[Basta]"; @@ -252,25 +296,45 @@ lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826 mes "It is impossible that the refine level will drop by, say, 3 or 4... that sounds scary."; mes "Here it can only decrease by 1 level."; next; - mes "[Basta]"; - mes "Compared to other blacksmiths, the risk is smaller."; - mes "I've given all precautions. Do you want to try it?"; - next; - if(select("Yes:No") == 2) { + if (.@blacksmith_blessing_count == 0 || countitem(6635) < .@blacksmith_blessing_count) { + mes "[Basta]"; + mes "Compared to other blacksmiths, the risk is smaller."; + mes "I've given all precautions. Do you want to try it?"; + next; + setarray .@menu$[1], "Yes", "No"; + } + else { + mes "[Basta]"; + mes "Woah~ Is it the ^316AC5Blacksmith Blessing^000000? It is difficult to get~ But, you have it!"; + next; + mes "[Basta]"; + mes "For +" + .@refine_count + " " + .@type$ + " need ^316AC5" + .@blacksmith_blessing_count + " unit(s) Blacksmith Blessing^000000 can prevent the equipment from vanishing. Do you want to refine with Blacksmith Blessing?"; + next; + setarray .@menu$[0], "Refine with Blacksmith Blessing", "Refine without Blacksmith Blessing", "Don't refine yet"; + } + switch( select(.@menu$[0], .@menu$[1], .@menu$[2]) ) { + case 1: + .@bless_who = 1; + break; + case 2: + break; + case 3: mes "[Basta]"; mes "Well~"; mes "Not challenging at all could also be a kind of wisdom in life."; close; } } - if (countitem(.@material) == 0 || Zeny < .@price) { + if ((.@bless_who && countitem(6635) < .@blacksmith_blessing_count) || countitem(.@material) == 0 || Zeny < .@price) { mes "[Basta]"; mes "Hmm... You didn't bring all the materials needed."; mes "Come back when you have them all."; close; } + if (.@bless_who) + delitem 6635, .@blacksmith_blessing_count; delitem .@material,1; - set Zeny, Zeny-.@price; + Zeny = Zeny - .@price; // anti-hack if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || @@ -293,26 +357,52 @@ lhz_in02,280,19,3 duplicate(MightyHammer) Mighty Hammer#lhz 826 mes "I really am the best blacksmith in the whole wide world!"; close; } - downrefitem .@part; - next; - emotion (!rand(5))?ET_MONEY:ET_HUK; - mes "[Basta]"; - mes "Aaaaaaaaaaak!!!"; - next; - mes "[Basta]"; - mes "Damn it!"; - mes "Refining failed and refine level has decreased!"; - mes "Even the best blacksmith in the world doesn't guarantee 100% success!"; + if (.@bless_who == 1) { + specialeffect EF_HOLYHIT; + next; + emotion (!rand(5))?ET_MONEY:ET_HUK; + mes "[Basta]"; + mes "Aaaaaaaaaaak!!!"; + next; + mes "[Basta]"; + mes "Refining has failed!"; + mes "The best blacksmith in the world like me..."; + mes "doesn't guarantee 100% success~"; + } + else { + downrefitem .@part; + next; + emotion (!rand(5))?ET_MONEY:ET_HUK; + mes "[Basta]"; + mes "Aaaaaaaaaaak!!!"; + next; + mes "[Basta]"; + mes "Damn it!"; + mes "Refining has failed and refine level has decreased!"; + mes "Even the best blacksmith in the world doesn't guarantee 100% success!"; + } mes "Too bad."; next; mes "[Basta]"; mes "I'll do better next time! Don't worry!"; close; } -prt_in,57,54,3 duplicate(Basta) Basta#prt 826 -morocc_in,68,30,3 duplicate(Basta) Basta#morocc 826 -payon,148,174,3 duplicate(Basta) Basta#payon 826 -alberta_in,18,56,3 duplicate(Basta) Basta#alberta 826 -yuno_in01,173,18,3 duplicate(Basta) Basta#yuno 826 -ein_in01,24,82,3 duplicate(Basta) Basta#einbroch 826 -lhz_in02,280,17,3 duplicate(Basta) Basta#lighthalzen 826 + +prt_in,57,54,3 duplicate(Basta) Basta#prt 4_M_DWARF +morocc_in,68,30,3 duplicate(Basta) Basta#morocc 4_M_DWARF +payon,148,174,3 duplicate(Basta) Basta#payon 4_M_DWARF +alberta_in,18,56,3 duplicate(Basta) Basta#alberta 4_M_DWARF +yuno_in01,173,18,3 duplicate(Basta) Basta#yuno 4_M_DWARF +ein_in01,24,82,3 duplicate(Basta) Basta#einbroch 4_M_DWARF +lhz_in02,280,17,3 duplicate(Basta) Basta#lighthalzen 4_M_DWARF + +// Refine UI makes these NPCs useless +- script RefineUI_Init -1,{ + end; +OnInit: + if (getbattleflag("feature.refineui")) { + unloadnpc "Basta"; + unloadnpc "MightyHammer"; + } + end; +} diff --git a/npc/re/merchants/refine.txt b/npc/re/merchants/refine.txt index 8fd70e3668c..e6a5e7ac247 100644 --- a/npc/re/merchants/refine.txt +++ b/npc/re/merchants/refine.txt @@ -16,23 +16,27 @@ //= The safe/multiple refine feature is now functional. [Euphy] //= 1.3 Updated to match the latest official script. [Euphy] //= 1.4 Added correct safe refines. [Haruna] +//= 1.5 Added Refine UI [Atemo, Lemongrass] //============================================================ // +11 and above Refiners //============================================================ -prt_in,90,72,5 script Vestri#prt 826,{ - callfunc "refinenew","Vestri",0; - end; -} -morocc_in,64,41,5 script Vestri#moc 826,{ - callfunc "refinenew","Vestri",0; - end; -} -payon_in01,18,132,3 script Vestri#pay 826,{ - callfunc "refinenew","Vestri",0; - end; +prt_in,90,72,5 script Vestri#prt 4_M_DWARF,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Vestri]"; + mes "I'm the most skillful blacksmith!"; + close2; + refineui(); + end; + }else{ + callfunc "refinenew","Vestri",0; + end; + } } +morocc_in,64,41,5 duplicate(Vestri#prt) Vestri#moc 4_M_DWARF +payon_in01,18,132,3 duplicate(Vestri#prt) Vestri#pay 4_M_DWARF + //============================================================ // +11 and above Refiner Function //============================================================ @@ -101,8 +105,8 @@ function script refinenew { } .@refineitemid = getequipid(.@part); // save id of the item setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3); - .@price = getequiprefinecost(.@part, REFINE_COST_OVER10, REFINE_ZENY_COST); - .@material = getequiprefinecost(.@part, REFINE_COST_OVER10, REFINE_MATERIAL_ID); + .@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST); + .@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID); .@safe = 10; if (getequipweaponlv(.@part) >= 1 && getequipweaponlv(.@part) <= 4) { diff --git a/npc/re/merchants/shadow_refiner.txt b/npc/re/merchants/shadow_refiner.txt index 4aa22ed28cf..fd39a59a1ad 100644 --- a/npc/re/merchants/shadow_refiner.txt +++ b/npc/re/merchants/shadow_refiner.txt @@ -7,8 +7,16 @@ //= 1.0 First version [Aleos] //= 1.1 Removed re-roll behavior and fetch materials from db //= [Secret] +//= 1.2 Added Refine UI [Atemo, Lemongrass] //============================================================ - script ::ShadowBlacksmith -1,{ + if( getbattleflag( "feature.refineui" ) ){ + mes "[Shadow Blacksmith]"; + mes "Now Basta is in charge of refinement for shadow items."; + mes "If you'd like to refine a shadow item, please visit him."; + close; + } + .@zeny_cost = 200000; // Zeny cost is 200,000 according to official script [Secret] disable_items; mes "[Shadow Blacksmith]"; diff --git a/src/common/mmo.hpp b/src/common/mmo.hpp index 179304015db..d0912ca6b8e 100644 --- a/src/common/mmo.hpp +++ b/src/common/mmo.hpp @@ -88,6 +88,14 @@ typedef uint32 t_itemid; #define MAX_CLAN 500 #define MAX_CLANALLIANCE 6 +#ifdef RENEWAL + #define MAX_WEAPON_LEVEL 5 + #define MAX_ARMOR_LEVEL 2 +#else + #define MAX_WEAPON_LEVEL 4 + #define MAX_ARMOR_LEVEL 1 +#endif + // for produce #define MIN_ATTRIBUTE 0 #define MAX_ATTRIBUTE 4 diff --git a/src/map/atcommand.cpp b/src/map/atcommand.cpp index 9cf116c34ac..7004d9a8ae8 100644 --- a/src/map/atcommand.cpp +++ b/src/map/atcommand.cpp @@ -10342,6 +10342,33 @@ ACMD_FUNC(quest) { return 0; } +/** + * Opens the refineUI + * Usage: @refineui + */ +ACMD_FUNC(refineui) +{ + nullpo_retr(-1, sd); + +#if PACKETVER < 20161012 + clif_displaymessage(fd, msg_txt(sd, 773)); // This command requires packet version 2016-10-12 or newer. + return -1; +#else + if( !battle_config.feature_refineui ){ + clif_displaymessage(fd, msg_txt(sd, 774)); // This command is disabled via configuration. + return -1; + } + + if( sd->state.refineui_open ){ + clif_displaymessage(fd, msg_txt(sd, 775)); // You have already opened the refine UI. + return -1; + } + + clif_refineui_open(sd); + return 0; +#endif +} + #include "../custom/atcommand.inc" /** @@ -10650,6 +10677,7 @@ void atcommand_basecommands(void) { ACMD_DEF2("erasequest", quest), ACMD_DEF2("completequest", quest), ACMD_DEF2("checkquest", quest), + ACMD_DEF(refineui), }; AtCommandInfo* atcommand; int i; diff --git a/src/map/battle.cpp b/src/map/battle.cpp index d7738fa543d..1743d5f2ad8 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -9115,7 +9115,6 @@ static const struct _battle_data { { "guild_alliance_onlygm", &battle_config.guild_alliance_onlygm, 0, 0, 1, }, { "feature.achievement", &battle_config.feature_achievement, 1, 0, 1, }, { "allow_bound_sell", &battle_config.allow_bound_sell, 0, 0, 0xF, }, - { "event_refine_chance", &battle_config.event_refine_chance, 0, 0, 1, }, { "autoloot_adjust", &battle_config.autoloot_adjust, 0, 0, 1, }, { "feature.petevolution", &battle_config.feature_petevolution, 1, 0, 1, }, { "feature.petautofeed", &battle_config.feature_pet_autofeed, 1, 0, 1, }, @@ -9161,6 +9160,7 @@ static const struct _battle_data { { "mercenary_autoloot", &battle_config.mercenary_autoloot, 0, 0, 1, }, { "mer_idle_no_share" , &battle_config.mer_idle_no_share, 0, 0, INT_MAX, }, { "idletime_mer_option", &battle_config.idletime_mer_option, 0x1F, 0x1, 0xFFF, }, + { "feature.refineui", &battle_config.feature_refineui, 1, 0, 1, }, #include "../custom/battle_config_init.inc" }; @@ -9310,6 +9310,13 @@ void battle_adjust_conf() } #endif +#if PACKETVER < 20161012 + if (battle_config.feature_refineui) { + ShowWarning("conf/battle/feature.conf refine UI is enabled but it requires PACKETVER 2016-10-12 or newer, disabling...\n"); + battle_config.feature_refineui = 0; + } +#endif + #if PACKETVER < 20170208 if (battle_config.feature_equipswitch) { ShowWarning("conf/battle/feature.conf equip switch is enabled but it requires PACKETVER 2017-02-08 or newer, disabling...\n"); diff --git a/src/map/battle.hpp b/src/map/battle.hpp index 7031eecf656..d3dd62836a2 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -646,7 +646,6 @@ struct Battle_Config int guild_alliance_onlygm; int feature_achievement; int allow_bound_sell; - int event_refine_chance; int autoloot_adjust; int feature_petevolution; int feature_pet_autofeed; @@ -692,6 +691,7 @@ struct Battle_Config int mercenary_autoloot; int mer_idle_no_share; int idletime_mer_option; + int feature_refineui; #include "../custom/battle_config_struct.inc" }; diff --git a/src/map/clif.cpp b/src/map/clif.cpp index 29b55c65cbb..79a3144f84d 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -20980,7 +20980,7 @@ void clif_parse_sale_remove( int fd, struct map_session_data* sd ){ /** * Sends all achievement data to the client (ZC_ALL_ACH_LIST). - * 0a23 .W .W .L .L + * 0a23 .W .L .L */ void clif_achievement_list_all(struct map_session_data *sd) { @@ -21022,7 +21022,7 @@ void clif_achievement_list_all(struct map_session_data *sd) /** * Sends a single achievement's data to the client (ZC_ACH_UPDATE). - * 0a24 .W .L + * 0a24 .L */ void clif_achievement_update(struct map_session_data *sd, struct achievement *ach, int count) { @@ -21056,7 +21056,7 @@ void clif_achievement_update(struct map_session_data *sd, struct achievement *ac /** * Checks if an achievement reward can be rewarded (CZ_REQ_ACH_REWARD). - * 0a25 .W .L + * 0a25 .L */ void clif_parse_AchievementCheckReward(int fd, struct map_session_data *sd) { @@ -21070,7 +21070,7 @@ void clif_parse_AchievementCheckReward(int fd, struct map_session_data *sd) /** * Returns the result of achievement_check_reward (ZC_REQ_ACH_REWARD_ACK). - * 0a26 .W .W .L + * 0a26 .W .L */ void clif_achievement_reward_ack(int fd, unsigned char result, int achievement_id) { @@ -21670,6 +21670,286 @@ TIMER_FUNC( clif_ping_timer ){ return 0; } +/** + * Opens the refine UI on the designated client. + * 0aa0 + */ +void clif_refineui_open( struct map_session_data* sd ){ +#if PACKETVER >= 20161012 + nullpo_retv( sd ); + + struct PACKET_ZC_REFINE_OPEN_WINDOW p; + + p.packetType = HEADER_ZC_REFINE_OPEN_WINDOW; + + clif_send( &p, sizeof( p ), &sd->bl, SELF ); + + sd->state.refineui_open = true; +#endif +} + +/** + * Parses cancel/close of the refine UI on client side. + * 0aa4 + */ +void clif_parse_refineui_close( int fd, struct map_session_data* sd ){ +#if PACKETVER >= 20161012 + sd->state.refineui_open = false; +#endif +} + +/** + * Adds the selected item into the refine UI and sends the possible materials + * to the client. + * 0aa2 .W .W .B { .W .B .L }* + */ +void clif_refineui_info( struct map_session_data* sd, uint16 index ){ + int fd = sd->fd; + + // Get the item db reference + struct item_data* id = sd->inventory_data[index]; + + // No item data was found + if( id == NULL ){ + return; + } + + // Check the inventory + struct item* item = &sd->inventory.u.items_inventory[index]; + + // No item was found at the given index + if( item == NULL ){ + return; + } + + // Check if the item is identified + if( !item->identify ){ + return; + } + + // Check if the item is broken + if( item->attribute ){ + return; + } + + std::shared_ptr info = refine_db.findLevelInfo( *id, *item ); + + // No refine possible + if( info == nullptr ){ + return; + } + + // No possibilities were found + if( info->costs.empty() ){ + return; + } + + uint16 length = (uint16)( sizeof( struct PACKET_ZC_REFINE_ADD_ITEM ) + REFINE_COST_MAX * sizeof( struct PACKET_ZC_REFINE_ADD_ITEM_SUB ) ); + + // Preallocate the size + WFIFOHEAD( fd, length ); + + struct PACKET_ZC_REFINE_ADD_ITEM* p = (struct PACKET_ZC_REFINE_ADD_ITEM*)WFIFOP( fd, 0 ); + + p->packetType = HEADER_ZC_REFINE_ADD_ITEM; + p->itemIndex = client_index( index ); + p->blacksmithBlessing = (uint8)info->blessing_amount; + + uint16 count = 0; + + for( uint16 i = REFINE_COST_NORMAL; i < REFINE_COST_MAX; i++ ){ + std::shared_ptr cost = util::umap_find( info->costs, i ); + + if( cost != nullptr ){ + p->req[count].itemId = client_nameid( cost->nameid ); + p->req[count].chance = (uint8)( cost->chance / 100 ); + p->req[count].zeny = cost->zeny; + count++; + } + } + + p->packtLength = (uint16)( sizeof( struct PACKET_ZC_REFINE_ADD_ITEM ) + count * sizeof( struct PACKET_ZC_REFINE_ADD_ITEM_SUB ) ); + + WFIFOSET( fd, p->packtLength ); +} + +/** + * Client request to add an item to the refine UI. + * 0aa1 .W + */ +void clif_parse_refineui_add( int fd, struct map_session_data* sd ){ +#if PACKETVER >= 20161012 + struct PACKET_CZ_REFINE_ADD_ITEM* p = (struct PACKET_CZ_REFINE_ADD_ITEM*)RFIFOP( fd, 0 ); + + uint16 index = server_index( p->index ); + + // Check if the refine UI is open + if( !sd->state.refineui_open ){ + return; + } + + // Check if the index is valid + if( index >= MAX_INVENTORY ){ + return; + } + + // Send out the requirements for the refine process + clif_refineui_info( sd, index ); +#endif +} + +/** + * Client requests to try to refine an item. + * 0aa3 .W .W .B + */ +void clif_parse_refineui_refine( int fd, struct map_session_data* sd ){ +#if PACKETVER >= 20161012 + struct PACKET_CZ_REFINE_ITEM_REQUEST* p = (struct PACKET_CZ_REFINE_ITEM_REQUEST*)RFIFOP( fd, 0 ); + + uint16 index = server_index( p->index ); + t_itemid material = p->itemId; + int16 j; + + // Check if the refine UI is open + if( !sd->state.refineui_open ){ + return; + } + + // Check if the index is valid + if( index >= MAX_INVENTORY ){ + return; + } + + // Get the item db reference + struct item_data* id = sd->inventory_data[index]; + + // No item data was found + if( id == NULL ){ + return; + } + + // Check the inventory + struct item* item = &sd->inventory.u.items_inventory[index]; + + // No item was found at the given index + if( item == NULL ){ + return; + } + + // Check if the item is identified + if( !item->identify ){ + return; + } + + // Check if the item is broken + if( item->attribute ){ + return; + } + + std::shared_ptr info = refine_db.findLevelInfo( *id, *item ); + + // No refine possible + if( info == nullptr ){ + return; + } + + // No possibilities were found + if( info->costs.empty() ){ + return; + } + + // Check if the player has the selected material + if( ( j = pc_search_inventory( sd, material ) ) < 0 ){ + return; + } + + int16 blacksmith_index = -1; + uint16 blacksmith_amount = 0; + + // Check if the player has enough blacksmith blessings + if( p->blacksmithBlessing != 0 ){ + blacksmith_amount = info->blessing_amount; + + // Player tried to use blacksmith blessing on a refine level, where it is not available + if( blacksmith_amount == 0 ){ + return; + } + + // Check if the player has blacksmith blessings + if( ( blacksmith_index = pc_search_inventory( sd, ITEMID_BLACKSMITH_BLESSING ) ) < 0 ){ + return; + } + + // Check if the player has enough blacksmith blessings + if( sd->inventory.u.items_inventory[blacksmith_index].amount < blacksmith_amount ){ + return; + } + } + + std::shared_ptr cost = nullptr; + + for( const auto& pair : info->costs ){ + if( pair.second->nameid == material ){ + cost = pair.second; + break; + } + } + + // The material was not in the list of possible materials + if( cost == nullptr ){ + return; + } + + // Try to pay for the refine + if( pc_payzeny( sd, cost->zeny, LOG_TYPE_CONSUME, NULL ) ){ + clif_npc_buy_result( sd, 1 ); // "You do not have enough zeny." + return; + } + + // Delete the required material + if( pc_delitem( sd, j, 1, 0, 0, LOG_TYPE_CONSUME ) ){ + return; + } + + // Delete the required blacksmith blessings + if( blacksmith_amount > 0 && pc_delitem( sd, blacksmith_index, blacksmith_amount, 0, 0, LOG_TYPE_CONSUME ) ){ + return; + } + + // Try to refine the item + if( cost->chance >= ( rnd() % 10000 ) ){ + // Success + item->refine = cap_value( item->refine + 1, 0, MAX_REFINE ); + clif_misceffect( &sd->bl, 3 ); + clif_refine( fd, 0, index, item->refine ); + achievement_update_objective( sd, AG_ENCHANT_SUCCESS, 2, id->wlv, item->refine ); + clif_refineui_info( sd, index ); + }else{ + // Failure + + // Blacksmith blessings were used to prevent breaking and downgrading + if( blacksmith_amount > 0 ){ + clif_refine( fd, 3, index, item->refine ); + // Delete the item if it is breakable + }else if( cost->breaking_rate > 0 && ( rnd() % 10000 ) < cost->breaking_rate ){ + clif_refine( fd, 1, index, item->refine ); + pc_delitem( sd, index, 1, 0, 0, LOG_TYPE_CONSUME ); + // Downgrade the item if necessary + }else if( cost->downgrade_amount > 0 ){ + item->refine = cap_value( item->refine - cost->downgrade_amount, 0, MAX_REFINE ); + clif_refine( fd, 2, index, item->refine ); + clif_refineui_info(sd, index); + // Only show failure, but dont do anything + }else{ + clif_refine( fd, 3, index, item->refine ); + } + + clif_misceffect( &sd->bl, 2 ); + achievement_update_objective( sd, AG_ENCHANT_FAIL, 1, 1 ); + } +#endif +} + /*========================================== * Main client packet processing function *------------------------------------------*/ diff --git a/src/map/clif.hpp b/src/map/clif.hpp index c8c5daa19ee..8425fdd471f 100644 --- a/src/map/clif.hpp +++ b/src/map/clif.hpp @@ -1077,6 +1077,9 @@ void clif_sale_end(struct sale_item_data* sale_item, struct block_list* bl, enum void clif_sale_amount(struct sale_item_data* sale_item, struct block_list* bl, enum send_target target); void clif_sale_open(struct map_session_data* sd); +// Refine UI +void clif_refineui_open( struct map_session_data* sd ); + /** * Color Table **/ diff --git a/src/map/clif_packetdb.hpp b/src/map/clif_packetdb.hpp index e3660a84650..2864038bbf1 100644 --- a/src/map/clif_packetdb.hpp +++ b/src/map/clif_packetdb.hpp @@ -2299,6 +2299,15 @@ packet(0x0A84,94); #endif +// 2016-10-12aRagexeRE +#if PACKETVER >= 20161012 + packet( HEADER_ZC_REFINE_OPEN_WINDOW, sizeof( struct PACKET_ZC_REFINE_OPEN_WINDOW ) ); + parseable_packet( HEADER_CZ_REFINE_ADD_ITEM, sizeof( struct PACKET_CZ_REFINE_ADD_ITEM ), clif_parse_refineui_add, 0 ); + packet( HEADER_ZC_REFINE_ADD_ITEM, -1 ); + parseable_packet( HEADER_CZ_REFINE_ITEM_REQUEST, sizeof( struct PACKET_CZ_REFINE_ITEM_REQUEST ), clif_parse_refineui_refine, 0 ); + parseable_packet( HEADER_CZ_REFINE_WINDOW_CLOSE, sizeof( struct PACKET_CZ_REFINE_WINDOW_CLOSE ), clif_parse_refineui_close, 0 ); +#endif + // 2016-10-26bRagexeRE #if PACKETVER >= 20161026 packet(0x0AA5,-1); diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp index 731089e4c71..5374b388039 100644 --- a/src/map/itemdb.cpp +++ b/src/map/itemdb.cpp @@ -430,7 +430,7 @@ uint64 ItemDatabase::parseBodyNode(const YAML::Node &node) { if (!this->asUInt16(node, "WeaponLevel", lv)) return 0; - if (lv >= REFINE_TYPE_SHADOW) { + if (lv > MAX_WEAPON_LEVEL) { this->invalidWarning(node["WeaponLevel"], "Invalid weapon level %d, defaulting to 0.\n", lv); lv = REFINE_TYPE_ARMOR; } diff --git a/src/map/itemdb.hpp b/src/map/itemdb.hpp index ee0c77dcc87..894c5f2ace2 100644 --- a/src/map/itemdb.hpp +++ b/src/map/itemdb.hpp @@ -88,6 +88,7 @@ enum item_itemid : t_itemid ITEMID_PAINT_BRUSH = 6122, ITEMID_MAGIC_GEAR_FUEL = 6146, ITEMID_STRANGE_EMBRYO = 6415, + ITEMID_BLACKSMITH_BLESSING = 6635, ITEMID_STONE = 7049, ITEMID_FIRE_BOTTLE = 7135, ITEMID_ACID_BOTTLE = 7136, diff --git a/src/map/map-server.vcxproj b/src/map/map-server.vcxproj index 96637c077ff..5a03dcbfb28 100644 --- a/src/map/map-server.vcxproj +++ b/src/map/map-server.vcxproj @@ -351,7 +351,7 @@ - + diff --git a/src/map/pc.hpp b/src/map/pc.hpp index 2032f7710af..30427ebcfd1 100644 --- a/src/map/pc.hpp +++ b/src/map/pc.hpp @@ -341,6 +341,7 @@ struct map_session_data { bool cashshop_open; bool sale_open; unsigned int block_action : 10; + bool refineui_open; } state; struct { unsigned char no_weapon_damage, no_magic_damage, no_misc_damage; @@ -976,10 +977,9 @@ extern struct s_job_info job_info[CLASS_COUNT]; #define pc_isidle_hom(sd) ( (sd)->hd && ( (sd)->chatID || (sd)->state.vending || (sd)->state.buyingstore || DIFF_TICK(last_tick, (sd)->idletime_hom) >= battle_config.hom_idle_no_share ) ) #define pc_isidle_mer(sd) ( (sd)->md && ( (sd)->chatID || (sd)->state.vending || (sd)->state.buyingstore || DIFF_TICK(last_tick, (sd)->idletime_mer) >= battle_config.mer_idle_no_share ) ) #define pc_istrading(sd) ( (sd)->npc_id || (sd)->state.vending || (sd)->state.buyingstore || (sd)->state.trading ) -#define pc_cant_act(sd) ( (sd)->npc_id || (sd)->state.vending || (sd)->state.buyingstore || (sd)->chatID || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend ) - -/* equals pc_cant_act except it doesn't check for chat rooms or npcs */ -#define pc_cant_act2(sd) ( (sd)->state.vending || (sd)->state.buyingstore || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend ) +// equals pc_cant_act2 and additionally checks for chat rooms and npcs +#define pc_cant_act(sd) ( (sd)->npc_id || (sd)->chatID || pc_cant_act2( (sd) ) ) +#define pc_cant_act2(sd) ( (sd)->state.vending || (sd)->state.buyingstore || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend || (sd)->state.refineui_open ) #define pc_setdir(sd,b,h) ( (sd)->ud.dir = (b) ,(sd)->head_dir = (h) ) #define pc_setchatid(sd,n) ( (sd)->chatID = n ) diff --git a/src/map/script.cpp b/src/map/script.cpp index 7d664419f50..70c6a7879c3 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -9200,11 +9200,22 @@ BUILDIN_FUNC(getequippercentrefinery) if (equip_index_check(num)) i = pc_checkequip(sd,equip_bitmask[num]); - if (i >= 0 && sd->inventory.u.items_inventory[i].nameid && sd->inventory.u.items_inventory[i].refine < MAX_REFINE) { - enum refine_type type = REFINE_TYPE_SHADOW; - if (sd->inventory_data[i]->type != IT_SHADOWGEAR) - type = (enum refine_type)sd->inventory_data[i]->wlv; - script_pushint(st, status_get_refine_chance(type, (int)sd->inventory.u.items_inventory[i].refine, enriched)); + if (i >= 0 && sd->inventory.u.items_inventory[i].nameid) { + std::shared_ptr info = refine_db.findLevelInfo( *sd->inventory_data[i], sd->inventory.u.items_inventory[i] ); + + if( info == nullptr ){ + script_pushint( st, 0 ); + return SCRIPT_CMD_SUCCESS; + } + + std::shared_ptr cost = util::umap_find( info->costs, (uint16)( enriched ? REFINE_COST_ENRICHED : REFINE_COST_NORMAL ) ); + + if( cost == nullptr ){ + script_pushint( st, 0 ); + return SCRIPT_CMD_SUCCESS; + } + + script_pushint( st, cost->chance / 100 ); } else script_pushint(st,0); @@ -24364,15 +24375,36 @@ BUILDIN_FUNC(getequiprefinecost) { return SCRIPT_CMD_SUCCESS; } - int weapon_lv = sd->inventory_data[i]->wlv; - if (sd->inventory_data[i]->type == IT_SHADOWGEAR) { - if (sd->inventory_data[i]->equip == EQP_SHADOW_WEAPON) - weapon_lv = REFINE_TYPE_WEAPON4; - else - weapon_lv = REFINE_TYPE_SHADOW; + if( sd->inventory_data[i] == nullptr ){ + script_pushint( st, -1 ); + return SCRIPT_CMD_SUCCESS; + } + + std::shared_ptr level_info = refine_db.findLevelInfo( *sd->inventory_data[i], sd->inventory.u.items_inventory[i] ); + + if( level_info == nullptr ){ + script_pushint( st, -1 ); + return SCRIPT_CMD_SUCCESS; } - script_pushint(st, status_get_refine_cost(weapon_lv, type, info != 0)); + std::shared_ptr cost = util::umap_find( level_info->costs, (uint16)type ); + + if( cost == nullptr ){ + script_pushint( st, -1 ); + return SCRIPT_CMD_SUCCESS; + } + + switch( info ){ + case REFINE_MATERIAL_ID: + script_pushint( st, cost->nameid ); + break; + case REFINE_ZENY_COST: + script_pushint( st, cost->zeny ); + break; + default: + script_pushint( st, -1 ); + return SCRIPT_CMD_FAILURE; + } return SCRIPT_CMD_SUCCESS; } @@ -24993,6 +25025,30 @@ BUILDIN_FUNC(isnpccloaked) return SCRIPT_CMD_SUCCESS; } +BUILDIN_FUNC(refineui){ +#if PACKETVER < 20161012 + ShowError( "buildin_refineui: This command requires packet version 2016-10-12 or newer.\n" ); + return SCRIPT_CMD_FAILURE; +#else + struct map_session_data* sd; + + if( !script_charid2sd(2,sd) ){ + return SCRIPT_CMD_FAILURE; + } + + if( !battle_config.feature_refineui ){ + ShowError( "buildin_refineui: This command is disabled via configuration.\n" ); + return SCRIPT_CMD_FAILURE; + } + + if( !sd->state.refineui_open ){ + clif_refineui_open(sd); + } + + return SCRIPT_CMD_SUCCESS; +#endif +} + #include "../custom/script.inc" // declarations that were supposed to be exported from npc_chat.cpp @@ -25657,8 +25713,9 @@ struct script_function buildin_func[] = { BUILDIN_DEF(achievementexists,"i?"), BUILDIN_DEF(achievementupdate,"iii?"), - BUILDIN_DEF(getequiprefinecost,"iii?"), + BUILDIN_DEF(refineui,"?"), + BUILDIN_DEF2(round, "round", "ii"), BUILDIN_DEF2(round, "ceil", "ii"), BUILDIN_DEF2(round, "floor", "ii"), diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 04ad3b7cc0e..dde7773bdc1 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -5254,17 +5254,18 @@ /* refine cost types */ export_constant(REFINE_COST_NORMAL); - export_constant(REFINE_COST_OVER10); + export_deprecated_constant3("REFINE_COST_OVER10", REFINE_COST_NORMAL, "REFINE_COST_NORMAL"); export_constant(REFINE_COST_HD); export_constant(REFINE_COST_ENRICHED); - export_constant(REFINE_COST_OVER10_HD); - export_constant(REFINE_COST_HOLINK); - export_constant(REFINE_COST_WAGJAK); + export_deprecated_constant3("REFINE_COST_OVER10_HD", REFINE_COST_HD, "REFINE_COST_HD"); + // These two have been re-hardcoded, but better default to normal than provide nothing + export_deprecated_constant3("REFINE_COST_HOLINK", REFINE_COST_NORMAL, "REFINE_COST_NORMAL"); + export_deprecated_constant3("REFINE_COST_WAGJAK", REFINE_COST_NORMAL, "REFINE_COST_NORMAL"); export_constant(REFINE_COST_MAX); /* refine information types */ - script_set_constant("REFINE_MATERIAL_ID", 0, false, false); - script_set_constant("REFINE_ZENY_COST", 1, false, false); + export_constant(REFINE_MATERIAL_ID); + export_constant(REFINE_ZENY_COST); /* NPC view ids */ // Special macro to strip the prefix 'JT_' @@ -8093,6 +8094,12 @@ export_constant(ITEMINFO_ID); export_constant(ITEMINFO_AEGISNAME); + /* refine types */ + export_constant(REFINE_TYPE_ARMOR); + export_constant(REFINE_TYPE_WEAPON); + export_constant(REFINE_TYPE_SHADOW_ARMOR); + export_constant(REFINE_TYPE_SHADOW_WEAPON); + #undef export_constant #undef export_constant2 #undef export_parameter diff --git a/src/map/skill.cpp b/src/map/skill.cpp index cab4c8b25db..1857ffd7f87 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -17695,7 +17695,27 @@ void skill_weaponrefine(struct map_session_data *sd, int idx) clif_upgrademessage(sd, 3, material[ditem->wlv]); return; } - per = status_get_refine_chance(static_cast(ditem->wlv), (int)item->refine, false); + + std::shared_ptr info = refine_db.findLevelInfo( *ditem, *item ); + + if( info == nullptr ){ + clif_skill_fail( sd, sd->menuskill_id, USESKILL_FAIL_LEVEL, 0 ); + return; + } + + std::shared_ptr cost = util::umap_find( info->costs, (uint16)REFINE_COST_NORMAL ); + + if( cost == nullptr ){ + clif_skill_fail( sd, sd->menuskill_id, USESKILL_FAIL_LEVEL, 0 ); + return; + } + + if( cost->nameid != material[ditem->wlv] ){ + clif_skill_fail( sd, sd->menuskill_id, USESKILL_FAIL_LEVEL, 0 ); + return; + } + + per = ( cost->chance / 100 ); if( sd->class_&JOBL_THIRD ) per += 10; else diff --git a/src/map/status.cpp b/src/map/status.cpp index 6ed1e4a416c..650b576770e 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -48,14 +48,6 @@ enum e_regen { RGN_SSP = 0x08, }; -// Bonus values and upgrade chances for refining equipment -static struct { - int chance[REFINE_CHANCE_TYPE_MAX][MAX_REFINE]; /// Success chance - int bonus[MAX_REFINE]; /// Cumulative fixed bonus damage - int randombonus_max[MAX_REFINE]; /// Cumulative maximum random bonus damage - struct refine_cost cost[REFINE_COST_MAX]; -} refine_info[REFINE_TYPE_MAX]; - static struct eri *sc_data_ers; /// For sc_data entries static struct status_data dummy_status; @@ -115,6 +107,324 @@ static int status_get_sc_interval(enum sc_type type); static bool status_change_isDisabledOnMap_(sc_type type, bool mapIsVS, bool mapIsPVP, bool mapIsGVG, bool mapIsBG, unsigned int mapZone, bool mapIsTE); #define status_change_isDisabledOnMap(type, m) ( status_change_isDisabledOnMap_((type), mapdata_flag_vs2((m)), m->flag[MF_PVP] != 0, mapdata_flag_gvg2_no_te((m)), m->flag[MF_BATTLEGROUND] != 0, (m->zone << 3) != 0, mapdata_flag_gvg2_te((m))) ) +const std::string RefineDatabase::getDefaultLocation(){ + return std::string( db_path ) + "/refine.yml"; +} + +uint64 RefineDatabase::parseBodyNode( const YAML::Node& node ){ + std::string group_name; + + if( !this->asString( node, "Group", group_name ) ){ + return 0; + } + + std::string group_name_constant = "REFINE_TYPE_" + group_name; + int64 constant; + + if( !script_get_constant( group_name_constant.c_str(), &constant ) ){ + this->invalidWarning(node["Group"], "Unknown refine group %s, skipping.\n", group_name.c_str() ); + return 0; + } + + uint16 group_id = static_cast( constant ); + + std::shared_ptr info = this->find( group_id ); + bool exists = info != nullptr; + + if( !exists ){ + info = std::make_shared(); + } + + if( this->nodeExists( node, "Levels" ) ){ + for( const YAML::Node& levelNode : node["Levels"] ){ + uint16 level; + + if( !this->asUInt16( levelNode, "Level", level ) ){ + return 0; + } + + std::shared_ptr levels_info = util::umap_find( info->levels, level ); + bool levels_exists = levels_info != nullptr; + + if( !levels_exists ){ + levels_info = std::make_shared(); + levels_info->level = level; + } + + if( this->nodeExists( levelNode, "RefineLevels" ) ){ + for( const YAML::Node& refineLevelNode : levelNode["RefineLevels"] ){ + uint16 refine_level; + + if( !this->asUInt16( refineLevelNode, "Level", refine_level ) ){ + return 0; + } + + if( refine_level == 0 || refine_level > MAX_REFINE ){ + this->invalidWarning( refineLevelNode["Level"], "Refine level %hu is invalid, skipping.\n", refine_level ); + return 0; + } + + // Database is 1 based, code is 0 based + refine_level -= 1; + + std::shared_ptr level_info = util::umap_find( levels_info->levels, refine_level ); + bool level_exists = level_info != nullptr; + + if( !level_exists ){ + level_info = std::make_shared(); + level_info->level = refine_level; + } + + if( this->nodeExists( refineLevelNode, "Bonus" ) ){ + uint32 bonus; + + if( !this->asUInt32( refineLevelNode, "Bonus", bonus ) ){ + return 0; + } + + level_info->bonus = bonus; + }else{ + if( !level_exists ){ + level_info->bonus = 0; + } + } + + if( this->nodeExists( refineLevelNode, "RandomBonus" ) ){ + uint32 bonus; + + if( !this->asUInt32( refineLevelNode, "RandomBonus", bonus ) ){ + return 0; + } + + level_info->randombonus_max = bonus; + }else{ + if( !level_exists ){ + level_info->randombonus_max = 0; + } + } + + if( this->nodeExists( refineLevelNode, "BlacksmithBlessingAmount" ) ){ + uint16 amount; + + if( !this->asUInt16( refineLevelNode, "BlacksmithBlessingAmount", amount ) ){ + return 0; + } + + if( amount > MAX_AMOUNT ){ + this->invalidWarning( refineLevelNode["BlacksmithBlessingAmount"], "Blacksmith Blessing amount %hu too high, capping to MAX_AMOUNT.\n", amount ); + amount = MAX_AMOUNT; + } + + level_info->blessing_amount = amount; + }else{ + if( !level_exists ){ + level_info->blessing_amount = 0; + } + } + + if( this->nodeExists( refineLevelNode, "Chances" ) ){ + for( const YAML::Node& chanceNode : refineLevelNode["Chances"] ){ + std::string cost_name; + + if( !this->asString( chanceNode, "Type", cost_name ) ){ + return 0; + } + + std::string cost_name_constant = "REFINE_COST_" + cost_name; + + if( !script_get_constant( cost_name_constant.c_str(), &constant ) ){ + this->invalidWarning( chanceNode["Type"], "Unknown refine cost type %s, skipping.\n", cost_name.c_str() ); + return 0; + } + + if( constant >= REFINE_COST_MAX ){ + this->invalidWarning( chanceNode["Type"], "Refine cost type %s is unsupported, skipping.\n", cost_name.c_str() ); + return 0; + } + + uint16 index = (uint16)constant; + + std::shared_ptr cost = util::umap_find( level_info->costs, index ); + bool cost_exists = cost != nullptr; + + if( !cost_exists ){ + cost = std::make_shared(); + cost->index = index; + } + + if( this->nodeExists( chanceNode, "Rate" ) ){ + uint16 rate; + + if( !this->asUInt16Rate( chanceNode, "Rate", rate ) ){ + return 0; + } + + cost->chance = rate; + }else{ + if( !cost_exists ){ + cost->chance = 0; + } + } + + if( this->nodeExists( chanceNode, "Price" ) ){ + uint32 price; + + if( !this->asUInt32( chanceNode, "Price", price ) ){ + return 0; + } + + if( price > MAX_ZENY ){ + this->invalidWarning( chanceNode["Price"], "Price is above MAX_ZENY, capping...\n" ); + price = MAX_ZENY; + } + + cost->zeny = price; + }else{ + if( !cost_exists ){ + cost->zeny = 0; + } + } + + if( this->nodeExists( chanceNode, "Material" ) ){ + std::string item_name; + + if( !this->asString( chanceNode, "Material", item_name ) ){ + return 0; + } + + struct item_data* id = itemdb_search_aegisname( item_name.c_str() ); + + if( id == nullptr ){ + this->invalidWarning( chanceNode["Material"], "Unknown refine material %s, skipping.\n", item_name.c_str() ); + return 0; + } + + cost->nameid = id->nameid; + }else{ + if( !cost_exists ){ + cost->nameid = 0; + } + } + + if( this->nodeExists( chanceNode, "BreakingRate" ) ){ + uint16 breaking_rate; + + if( !this->asUInt16Rate( chanceNode, "BreakingRate", breaking_rate ) ){ + return 0; + } + + cost->breaking_rate = breaking_rate; + }else{ + if( !cost_exists ){ + cost->breaking_rate = 0; + } + } + + if( this->nodeExists( chanceNode, "DowngradeAmount" ) ){ + uint16 downgrade_amount; + + if( !this->asUInt16( chanceNode, "DowngradeAmount", downgrade_amount ) ){ + return 0; + } + + if( downgrade_amount > MAX_REFINE ){ + this->invalidWarning( chanceNode["DowngradeAmount"], "Downgrade amount %hu is invalid, skipping.\n", downgrade_amount ); + return 0; + } + + cost->downgrade_amount = downgrade_amount; + }else{ + if( !cost_exists ){ + cost->downgrade_amount = 0; + } + } + + if( !cost_exists ){ + level_info->costs[index] = cost; + } + } + } + + if( !level_exists ){ + levels_info->levels[refine_level] = level_info; + } + } + } + + if( !levels_exists ){ + info->levels[level] = levels_info; + } + } + } + + if( !exists ){ + this->put( group_id, info ); + } + + return 1; +} + +std::shared_ptr RefineDatabase::findLevelInfo( const struct item_data& data, struct item& item ){ + // Check if the item can be refined + if( data.flag.no_refine ){ + return nullptr; + } + + // Check the current refine level + if( item.refine >= MAX_REFINE ){ + return nullptr; + } + + e_refine_type type; + uint16 level; + + if( !this->calculate_refine_info( data, type, level ) ){ + return nullptr; + } + + std::shared_ptr info = this->find( type ); + + if( info == nullptr ){ + return nullptr; + } + + std::shared_ptr levels_info = util::umap_find( info->levels, level ); + + if( levels_info == nullptr ){ + return nullptr; + } + + return util::umap_find( levels_info->levels, (uint16)item.refine ); +} + +bool RefineDatabase::calculate_refine_info( const struct item_data& data, e_refine_type& refine_type, uint16& level ){ + if( data.type == IT_WEAPON ){ + refine_type = REFINE_TYPE_WEAPON; + level = data.wlv; + + return true; + }else if( data.type == IT_ARMOR ){ + refine_type = REFINE_TYPE_ARMOR; + // TODO: implement when armor level is supported + level = 1; + + return true; + }else if( data.type == IT_SHADOWGEAR ){ + if( data.equip == EQP_SHADOW_WEAPON ){ + refine_type = REFINE_TYPE_SHADOW_WEAPON; + }else{ + refine_type = REFINE_TYPE_SHADOW_ARMOR; + } + level = 1; + + return true; + }else{ + return false; + } +} + +RefineDatabase refine_db; + const std::string SizeFixDatabase::getDefaultLocation() { return std::string(db_path) + "/size_fix.yml"; } @@ -3951,9 +4261,15 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) int r = sd->inventory.u.items_inventory[index].refine, wlv = sd->inventory_data[index]->wlv; struct weapon_data *wd; struct weapon_atk *wa; + std::shared_ptr info = nullptr; + + if(wlv >= MAX_WEAPON_LEVEL) + wlv = MAX_WEAPON_LEVEL; + + if( r ){ + info = refine_db.findLevelInfo( *sd->inventory_data[index], sd->inventory.u.items_inventory[index] ); + } - if(wlv >= REFINE_TYPE_MAX) - wlv = REFINE_TYPE_MAX - 1; if(i == EQI_HAND_L && sd->inventory.u.items_inventory[index].equip == EQP_HAND_L) { wd = &sd->left_weapon; // Left-hand weapon wa = &base_status->lhw; @@ -3962,18 +4278,24 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) wa = &base_status->rhw; } wa->atk += sd->inventory_data[index]->atk; - if(r) - wa->atk2 += refine_info[wlv].bonus[r-1] / 100; + if( info != nullptr ){ + wa->atk2 += info->bonus / 100; + } #ifdef RENEWAL if (sd->bonus.weapon_atk_rate) wa->atk = wa->atk * sd->bonus.weapon_atk_rate / 100; wa->matk += sd->inventory_data[index]->matk; wa->wlv = wlv; - if(r && sd->weapontype1 != W_BOW) // Renewal magic attack refine bonus - wa->matk += refine_info[wlv].bonus[r-1] / 100; + // Renewal magic attack refine bonus + if( info != nullptr && sd->weapontype1 != W_BOW ){ + wa->matk += info->bonus / 100; + } #endif - if(r) // Overrefine bonus. - wd->overrefine = refine_info[wlv].randombonus_max[r-1] / 100; + // Overrefine bonus. + if( info != nullptr ){ + wd->overrefine = info->randombonus_max / 100; + } + wa->range += sd->inventory_data[index]->range; if(sd->inventory_data[index]->script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) { if (wd == &sd->left_weapon) { @@ -3998,10 +4320,16 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) wa->ele = (sd->inventory.u.items_inventory[index].card[1]&0x0f); } } else if(sd->inventory_data[index]->type == IT_ARMOR) { - int r; + int r = sd->inventory.u.items_inventory[index].refine; + + if( r ){ + std::shared_ptr info = refine_db.findLevelInfo( *sd->inventory_data[index], sd->inventory.u.items_inventory[index] ); + + if( info != nullptr ){ + refinedef += info->bonus; + } + } - if ( (r = sd->inventory.u.items_inventory[index].refine) ) - refinedef += refine_info[REFINE_TYPE_ARMOR].bonus[r-1]; if(sd->inventory_data[index]->script && (pc_has_permission(sd,PC_PERM_USE_ALL_EQUIPMENT) || !itemdb_isNoEquip(sd->inventory_data[index],sd->bl.m))) { if( i == EQI_HAND_L ) // Shield sd->state.lr_flag = 3; @@ -15494,24 +15822,6 @@ static TIMER_FUNC(status_natural_heal_timer){ return 0; } -/** - * Get the chance to upgrade a piece of equipment - * @param wlv: The weapon type of the item to refine (see see enum refine_type) - * @param refine: The target's refine level - * @return The chance to refine the item, in percent (0~100) - */ -int status_get_refine_chance(enum refine_type wlv, int refine, bool enriched) -{ - if ( refine < 0 || refine >= MAX_REFINE) - return 0; - - int type = enriched ? 1 : 0; - if (battle_config.event_refine_chance) - type |= 2; - - return refine_info[wlv].chance[type][refine]; -} - /** * Check if status is disabled on a map * @param type: Status Change data @@ -15596,123 +15906,6 @@ static bool status_readdb_status_disabled(char **str, int columns, int current) return true; } -/** - * Reads and parses an entry from the refine_db - * @param node: The YAML node containing the entry - * @param refine_info_index: The sequential index of the current entry - * @param file_name: File name for displaying only - * @return True on success or false on failure - */ -static bool status_yaml_readdb_refine_sub(const YAML::Node &node, int refine_info_index, const std::string &file_name) { - if (refine_info_index < 0 || refine_info_index >= REFINE_TYPE_MAX) - return false; - - int bonus_per_level = node["StatsPerLevel"].as(); - int random_bonus_start_level = node["RandomBonusStartLevel"].as(); - int random_bonus = node["RandomBonusValue"].as(); - - if (file_name.find("import") != std::string::npos) { // Import file, reset refine bonus before calculation - for (int refine_level = 0; refine_level < MAX_REFINE; ++refine_level) - refine_info[refine_info_index].bonus[refine_level] = 0; - } - - const YAML::Node &costs = node["Costs"]; - - for (const auto costit : costs) { - int64 idx_tmp = 0; - const YAML::Node &type = costit; - int idx = 0, price; - t_itemid material; - const std::string keys[] = { "Type", "Price", "Material" }; - - for (int i = 0; i < ARRAYLENGTH(keys); i++) { - if (!type[keys[i]].IsDefined()) - ShowWarning("status_yaml_readdb_refine_sub: Invalid refine cost with undefined " CL_WHITE "%s" CL_RESET "in file" CL_WHITE "%s" CL_RESET ".\n", keys[i].c_str(), file_name.c_str()); - } - - std::string refine_cost_const = type["Type"].as(); - if (ISDIGIT(refine_cost_const[0])) - idx = atoi(refine_cost_const.c_str()); - else { - script_get_constant(refine_cost_const.c_str(), &idx_tmp); - idx = static_cast(idx_tmp); - } - price = type["Price"].as(); - // TODO: item id verification - material = type["Material"].as(); - - refine_info[refine_info_index].cost[idx].nameid = material; - refine_info[refine_info_index].cost[idx].zeny = price; - } - - const YAML::Node &rates = node["Rates"]; - - for (const auto rateit : rates) { - const YAML::Node &level = rateit; - int refine_level = level["Level"].as() - 1; - - if (refine_level >= MAX_REFINE) - continue; - - if (level["NormalChance"].IsDefined()) - refine_info[refine_info_index].chance[REFINE_CHANCE_NORMAL][refine_level] = level["NormalChance"].as(); - if (level["EnrichedChance"].IsDefined()) - refine_info[refine_info_index].chance[REFINE_CHANCE_ENRICHED][refine_level] = level["EnrichedChance"].as(); - if (level["EventNormalChance"].IsDefined()) - refine_info[refine_info_index].chance[REFINE_CHANCE_EVENT_NORMAL][refine_level] = level["EventNormalChance"].as(); - if (level["EventEnrichedChance"].IsDefined()) - refine_info[refine_info_index].chance[REFINE_CHANCE_EVENT_ENRICHED][refine_level] = level["EventEnrichedChance"].as(); - if (level["Bonus"].IsDefined()) - refine_info[refine_info_index].bonus[refine_level] = level["Bonus"].as(); - - if (refine_level >= random_bonus_start_level - 1) - refine_info[refine_info_index].randombonus_max[refine_level] = random_bonus * (refine_level - random_bonus_start_level + 2); - } - for (int refine_level = 0; refine_level < MAX_REFINE; ++refine_level) - refine_info[refine_info_index].bonus[refine_level] += bonus_per_level + (refine_level > 0 ? refine_info[refine_info_index].bonus[refine_level - 1] : 0); - - return true; -} - -/** - * Loads refine values from the refine_db - * @param directory: Location of refine_db file - * @param file: File name - */ -static void status_yaml_readdb_refine(const std::string &directory, const std::string &file) { - int count = 0; - const std::string labels[] = { "Armor", "WeaponLv1", "WeaponLv2", "WeaponLv3", "WeaponLv4", "Shadow" }; - const std::string current_file = directory + "/" + file; - YAML::Node config; - - try { - config = YAML::LoadFile(current_file); - } - catch (...) { - ShowError("Failed to read '" CL_WHITE "%s" CL_RESET "'.\n", current_file.c_str()); - return; - } - - for (int i = 0; i < ARRAYLENGTH(labels); i++) { - const YAML::Node &node = config[labels[i]]; - - if (node.IsDefined() && status_yaml_readdb_refine_sub(node, i, current_file)) - count++; - } - ShowStatus("Done reading '" CL_WHITE "%d" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", count, current_file.c_str()); -} - -/** - * Returns refine cost (zeny or item) for a weapon level. - * @param weapon_lv Weapon level - * @param type Refine type (can be retrieved from refine_cost_type enum) - * @param what true = returns zeny, false = returns item id - * @return Refine cost for a weapon level - */ -int status_get_refine_cost(int weapon_lv, int type, bool what) { - return what ? refine_info[weapon_lv].cost[type].zeny : refine_info[weapon_lv].cost[type].nameid; -} - /** * Read attribute fix database for attack calculations * Function stores information in the attr_fix_table @@ -15785,21 +15978,10 @@ int status_readdb(void) "/" DBIMPORT, //add other path here }; - // Initialize databases to default + // Initialize databases to default memset(SCDisabled, 0, sizeof(SCDisabled)); - // refine_db.yml - for(i=0;i 0); // !TODO use sv_readdb ? sv_readdb(dbsubpath1, "status_disabled.txt", ',', 2, 2, -1, &status_readdb_status_disabled, i > 0); - status_yaml_readdb_refine(dbsubpath2, "refine_db.yml"); aFree(dbsubpath1); aFree(dbsubpath2); } size_fix_db.load(); + refine_db.load(); return 0; } diff --git a/src/map/status.hpp b/src/map/status.hpp index 3ba6fd14968..803963788c2 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -31,36 +31,72 @@ struct status_change; #endif /// Refine type -enum refine_type { - REFINE_TYPE_ARMOR = 0, - REFINE_TYPE_WEAPON1 = 1, - REFINE_TYPE_WEAPON2 = 2, - REFINE_TYPE_WEAPON3 = 3, - REFINE_TYPE_WEAPON4 = 4, - REFINE_TYPE_SHADOW = 5, - REFINE_TYPE_MAX = 6 +enum e_refine_type : uint16{ + REFINE_TYPE_ARMOR = 0, + REFINE_TYPE_WEAPON, + REFINE_TYPE_SHADOW_ARMOR, + REFINE_TYPE_SHADOW_WEAPON, + REFINE_TYPE_MAX }; /// Refine cost type -enum refine_cost_type { +enum e_refine_cost_type : uint16{ REFINE_COST_NORMAL = 0, - REFINE_COST_OVER10, REFINE_COST_HD, REFINE_COST_ENRICHED, - REFINE_COST_OVER10_HD, - REFINE_COST_HOLINK, - REFINE_COST_WAGJAK, REFINE_COST_MAX }; -struct refine_cost { +/// Refine script parameters +enum e_refine_parameter{ + REFINE_MATERIAL_ID = 0, + REFINE_ZENY_COST +}; + +struct s_refine_cost{ + uint16 index; t_itemid nameid; - int zeny; + uint16 chance; + uint32 zeny; + uint16 breaking_rate; + uint16 downgrade_amount; +}; + +struct s_refine_level_info{ + uint16 level; + uint32 bonus; + uint32 randombonus_max; + uint16 blessing_amount; + std::unordered_map> costs; +}; + +struct s_refine_levels_info{ + uint16 level; + std::unordered_map> levels; +}; + +struct s_refine_info{ + uint16 groupId; + std::unordered_map> levels; +}; + +class RefineDatabase : public TypesafeYamlDatabase{ +private: + bool calculate_refine_info( const struct item_data& data, e_refine_type& refine_type, uint16& level ); + +public: + RefineDatabase() : TypesafeYamlDatabase( "REFINE_DB", 1 ){ + + } + + const std::string getDefaultLocation(); + uint64 parseBodyNode( const YAML::Node& node ); + + // Additional + std::shared_ptr findLevelInfo( const struct item_data& data, struct item& item ); }; -/// Get refine chance -int status_get_refine_chance(enum refine_type wlv, int refine, bool enriched); -int status_get_refine_cost(int weapon_lv, int type, bool what); +extern RefineDatabase refine_db; /// Weapon attack modification for size struct s_sizefix_db {