Added rate per refine in laphine upgrade
This commit is contained in:
parent
4a43856271
commit
b2a74e228e
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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 ){
|
||||
}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 ){
|
||||
item->refine = rnd_value( upgrade->resultRefineMinimum, upgrade->resultRefineMaximum );
|
||||
min_value = upgrade->resultRefineMinimum;
|
||||
}else{
|
||||
// Otherwise it can only be upgraded until the maximum, but not downgraded
|
||||
item->refine = rnd_value( item->refine, upgrade->resultRefineMaximum );
|
||||
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
|
||||
item->refine = rnd_value( upgrade->resultRefineMinimum, 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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Log retrieving the item again -> with the new options
|
||||
|
||||
@ -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 );
|
||||
}
|
||||
|
||||
@ -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 ){
|
||||
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user