Added rate per refine in laphine upgrade

This commit is contained in:
Atemo 2022-09-07 14:21:30 +02:00
parent 4a43856271
commit b2a74e228e
6 changed files with 114 additions and 14 deletions

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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

View File

@ -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 );
}

View File

@ -1372,11 +1372,12 @@ struct s_laphine_upgrade{
uint16 resultRefine;
uint16 resultRefineMinimum;
uint16 resultRefineMaximum;
std::unordered_map<uint16, uint16> resultRefineRate;
};
class LaphineUpgradeDatabase : public TypesafeYamlDatabase<t_itemid, s_laphine_upgrade>{
public:
LaphineUpgradeDatabase() : TypesafeYamlDatabase( "LAPHINE_UPGRADE_DB", 1 ){
LaphineUpgradeDatabase() : TypesafeYamlDatabase( "LAPHINE_UPGRADE_DB", 2 ){
}