From b2a74e228e303222ddbd9ad9d68ecbeeb8adc628 Mon Sep 17 00:00:00 2001 From: Atemo Date: Wed, 7 Sep 2022 14:21:30 +0200 Subject: [PATCH] Added rate per refine in laphine upgrade --- db/import-tmpl/laphine_upgrade.yml | 6 +++- db/laphine_upgrade.yml | 6 +++- db/re/laphine_upgrade.yml | 27 +++++++++++++- src/map/clif.cpp | 56 ++++++++++++++++++++++++------ src/map/itemdb.cpp | 30 ++++++++++++++++ src/map/itemdb.hpp | 3 +- 6 files changed, 114 insertions(+), 14 deletions(-) diff --git a/db/import-tmpl/laphine_upgrade.yml b/db/import-tmpl/laphine_upgrade.yml index 127a1d07e4..4c0f5f1605 100644 --- a/db/import-tmpl/laphine_upgrade.yml +++ b/db/import-tmpl/laphine_upgrade.yml @@ -27,6 +27,10 @@ # ResultRefine Absolute refine level after the upgrade. (Default: none) # ResultRefineMinimum Minimum refine level after the upgrade. (Default: none) # ResultRefineMaximum Maximum refine level after the upgrade. (Default: none) +# ResultRefineRate: Table of rate per refine level. (Default: none) +# By default the rate per level is 1. When defined the total rate is the sum of the rates between the minimum and maximum refinements. +# - Level Refine level. +# Rate Rate per level. (Default: 1. Max: 10000) # MinimumRefine Minimum refine level of the required items. (Default: 0) # MaximumRefine Maximum refine level of the required items. (Default: MAX_REFINE) # RequiredRandomOptions How many random options have to be in the item? (Default: 0) @@ -37,4 +41,4 @@ Header: Type: LAPHINE_UPGRADE_DB - Version: 1 + Version: 2 diff --git a/db/laphine_upgrade.yml b/db/laphine_upgrade.yml index 9bb37c9f30..4799e64909 100644 --- a/db/laphine_upgrade.yml +++ b/db/laphine_upgrade.yml @@ -27,6 +27,10 @@ # ResultRefine Absolute refine level after the upgrade. (Default: none) # ResultRefineMinimum Minimum refine level after the upgrade. (Default: none) # ResultRefineMaximum Maximum refine level after the upgrade. (Default: none) +# ResultRefineRate: Table of rate per refine level. (Default: none) +# By default the rate per level is 1. When defined the total rate is the sum of the rates between the minimum and maximum refinements. +# - Level Refine level. +# Rate Rate per level. (Default: 1. Max: 10000) # MinimumRefine Minimum refine level of the required items. (Default: 0) # MaximumRefine Maximum refine level of the required items. (Default: MAX_REFINE) # RequiredRandomOptions How many random options have to be in the item? (Default: 0) @@ -37,7 +41,7 @@ Header: Type: LAPHINE_UPGRADE_DB - Version: 1 + Version: 2 Footer: Imports: diff --git a/db/re/laphine_upgrade.yml b/db/re/laphine_upgrade.yml index a5c92e8e83..91dae175a6 100644 --- a/db/re/laphine_upgrade.yml +++ b/db/re/laphine_upgrade.yml @@ -27,6 +27,10 @@ # ResultRefine Absolute refine level after the upgrade. (Default: none) # ResultRefineMinimum Minimum refine level after the upgrade. (Default: none) # ResultRefineMaximum Maximum refine level after the upgrade. (Default: none) +# ResultRefineRate: Table of rate per refine level. (Default: none) +# By default the rate per level is 1. When defined the total rate is the sum of the rates between the minimum and maximum refinements. +# - Level Refine level. +# Rate Rate per level. (Default: 1. Max: 10000) # MinimumRefine Minimum refine level of the required items. (Default: 0) # MaximumRefine Maximum refine level of the required items. (Default: MAX_REFINE) # RequiredRandomOptions How many random options have to be in the item? (Default: 0) @@ -37,7 +41,7 @@ Header: Type: LAPHINE_UPGRADE_DB - Version: 1 + Version: 2 Body: # - Item: Ein_Ddbox @@ -152,6 +156,27 @@ Body: - Item: Shadow_Refine_Hammer ResultRefineMinimum: 1 ResultRefineMaximum: 10 + ResultRefineRate: + - Level: 1 + Rate: 440 + - Level: 2 + Rate: 879 + - Level: 3 + Rate: 1703 + - Level: 4 + Rate: 3516 + - Level: 5 + Rate: 1758 + - Level: 6 + Rate: 879 + - Level: 7 + Rate: 440 + - Level: 8 + Rate: 220 + - Level: 9 + Rate: 110 + - Level: 10 + Rate: 55 MaximumRefine: 9 CardsAllowed: true TargetItems: diff --git a/src/map/clif.cpp b/src/map/clif.cpp index f5f2038838..d149876b61 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -23476,17 +23476,53 @@ void clif_parse_laphine_upgrade( int fd, struct map_session_data* sd ){ if( upgrade->resultRefine > 0 ){ // Absolute refine level change item->refine = max( item->refine, upgrade->resultRefine ); - }else if( upgrade->resultRefineMaximum > 0 ){ - // If a minimum is specified it can also downgrade - if( upgrade->resultRefineMinimum ){ - item->refine = rnd_value( upgrade->resultRefineMinimum, upgrade->resultRefineMaximum ); - }else{ - // Otherwise it can only be upgraded until the maximum, but not downgraded - item->refine = rnd_value( item->refine, upgrade->resultRefineMaximum ); + }else { + uint16 min_value = 0; + uint16 max_value = MAX_REFINE; + + if( upgrade->resultRefineMaximum > 0 ){ + // If a minimum is specified it can also downgrade + if( upgrade->resultRefineMinimum ){ + min_value = upgrade->resultRefineMinimum; + }else{ + // Otherwise it can only be upgraded until the maximum, but not downgraded + min_value = item->refine; + } + max_value = upgrade->resultRefineMaximum; + }else if( upgrade->resultRefineMinimum > 0 ){ + // No maximum has been specified, so it can be anything between minimum and MAX_REFINE + min_value = upgrade->resultRefineMinimum; + } + + if (upgrade->resultRefineRate.empty()) { + item->refine = rnd_value( min_value, max_value ); + } + else { + int level, total = 0, rate = 0; + + // Get the total rate between min_value and max_value + for ( level = min_value; level <= max_value; level++ ) { + if (upgrade->resultRefineRate.count(level) > 0) + total += upgrade->resultRefineRate[level]; + else + total += 1; + } + + int r = rnd_value( 1, total ); + + for ( level = min_value; level <= max_value; level++ ) { + if (upgrade->resultRefineRate.count(level) > 0) + rate += upgrade->resultRefineRate[level]; + else + rate += 1; + + if (r <= rate) { + item->refine = level; + break; + } + } + } - }else if( upgrade->resultRefineMinimum > 0 ){ - // No maximum has been specified, so it can be anything between minimum and MAX_REFINE - item->refine = rnd_value( upgrade->resultRefineMinimum, MAX_REFINE ); } // Log retrieving the item again -> with the new options diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp index 5f26c1663c..048f127ebd 100644 --- a/src/map/itemdb.cpp +++ b/src/map/itemdb.cpp @@ -1665,6 +1665,36 @@ uint64 LaphineUpgradeDatabase::parseBodyNode( const ryml::NodeRef& node ){ } } + if (this->nodeExists( node, "ResultRefineRate" )) { + const auto& refineNode = node["ResultRefineRate"]; + + for (const auto& refineit : refineNode) { + if (!this->nodesExist(refineit, { "Level", "Rate" })) { + return 0; + } + + uint16 level; + + if (!this->asUInt16Rate(refineit, "Level", level, MAX_REFINE)) + return 0; + + bool refine_exists = util::umap_find( entry->resultRefineRate, level ) != nullptr; + + if (this->nodeExists( refineit, "Rate" )) { + uint16 rate; + + if (!this->asUInt16Rate( refineit, "Rate", rate )) { + return 0; + } + entry->resultRefineRate[level] = rate; + } else { + if (!refine_exists) { + entry->resultRefineRate[level] = 1; + } + } + } + } + if( !exists ){ this->put( entry->item_id, entry ); } diff --git a/src/map/itemdb.hpp b/src/map/itemdb.hpp index 578db79e2e..5d372c7419 100644 --- a/src/map/itemdb.hpp +++ b/src/map/itemdb.hpp @@ -1372,11 +1372,12 @@ struct s_laphine_upgrade{ uint16 resultRefine; uint16 resultRefineMinimum; uint16 resultRefineMaximum; + std::unordered_map resultRefineRate; }; class LaphineUpgradeDatabase : public TypesafeYamlDatabase{ public: - LaphineUpgradeDatabase() : TypesafeYamlDatabase( "LAPHINE_UPGRADE_DB", 1 ){ + LaphineUpgradeDatabase() : TypesafeYamlDatabase( "LAPHINE_UPGRADE_DB", 2 ){ }