From c8729f5bd62f9a645638d273d352e5739e3cf156 Mon Sep 17 00:00:00 2001 From: Atemo Date: Tue, 16 Jan 2024 15:12:24 +0100 Subject: [PATCH] Updated ResultRefine * Converted ResultRefine to a ResultRefine array * Converted the values between ResultRefineMinimum and ResultRefineMaximum to a ResultRefine array --- db/import-tmpl/laphine_upgrade.yml | 8 +- db/laphine_upgrade.yml | 8 +- db/re/laphine_upgrade.yml | 236 +++++++++++++++++++---------- src/map/clif.cpp | 57 ++----- src/map/itemdb.cpp | 71 +-------- src/map/itemdb.hpp | 5 +- src/tool/yamlupgrade.cpp | 63 ++++++++ 7 files changed, 247 insertions(+), 201 deletions(-) diff --git a/db/import-tmpl/laphine_upgrade.yml b/db/import-tmpl/laphine_upgrade.yml index 4c0f5f1605..96e672cc6d 100644 --- a/db/import-tmpl/laphine_upgrade.yml +++ b/db/import-tmpl/laphine_upgrade.yml @@ -24,13 +24,9 @@ ########################################################################### # - Item Item that triggers Laphine Upgrade. # RandomOptionGroup Name of the random option group that will be applied. (Default: none) -# 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. +# ResultRefine: Refine level after the upgrade. (Default: none) # - Level Refine level. -# Rate Rate per level. (Default: 1. Max: 10000) +# Rate Rate per level. The total rate is the sum of the rates. (Default: 1) # 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) diff --git a/db/laphine_upgrade.yml b/db/laphine_upgrade.yml index 4799e64909..c87ef8a436 100644 --- a/db/laphine_upgrade.yml +++ b/db/laphine_upgrade.yml @@ -24,13 +24,9 @@ ########################################################################### # - Item Item that triggers Laphine Upgrade. # RandomOptionGroup Name of the random option group that will be applied. (Default: none) -# 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. +# ResultRefine: Refine level after the upgrade. (Default: none) # - Level Refine level. -# Rate Rate per level. (Default: 1. Max: 10000) +# Rate Rate per level. The total rate is the sum of the rates. (Default: 1) # 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) diff --git a/db/re/laphine_upgrade.yml b/db/re/laphine_upgrade.yml index 5d578c8efc..56a13bfcb5 100644 --- a/db/re/laphine_upgrade.yml +++ b/db/re/laphine_upgrade.yml @@ -1,5 +1,5 @@ # This file is a part of rAthena. -# Copyright(C) 2022 rAthena Development Team +# Copyright(C) 2024 rAthena Development Team # https://rathena.org - https://github.com/rathena # # This program is free software: you can redistribute it and/or modify @@ -24,13 +24,9 @@ ########################################################################### # - Item Item that triggers Laphine Upgrade. # RandomOptionGroup Name of the random option group that will be applied. (Default: none) -# 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. +# ResultRefine: Refine level after the upgrade. (Default: none) # - Level Refine level. -# Rate Rate per level. (Default: 1. Max: 10000) +# Rate Rate per level. The total rate is the sum of the rates. (Default: 1) # 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) @@ -66,7 +62,8 @@ Body: - Item: Ein_1HGUN - Item: Ein_1H_Foxtail - Item: Metal_Rifine_Ticket - ResultRefine: 7 + ResultRefine: + - Level: 7 CardsAllowed: true TargetItems: - Item: Metal_Katar @@ -121,8 +118,11 @@ Body: - Item: Temporal_M_Dex - Item: Temporal_M_Luk - Item: Frozen_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -133,7 +133,8 @@ Body: - Item: Clack_Of_Servival_IL - Item: Herald_Of_GOD_IL - Item: True_Hunting_9Refine - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: @@ -156,9 +157,7 @@ Body: # - Item: True_Hunting_Ring2 # Source: https://ro.gnjoy.com/news/probability/View.asp?seq=3954806 - Item: Shadow_Refine_Hammer - ResultRefineMinimum: 1 - ResultRefineMaximum: 10 - ResultRefineRate: + ResultRefine: - Level: 1 Rate: 440 - Level: 2 @@ -1720,7 +1719,8 @@ Body: - Item: Lava_Leather_Suits - Item: Lava_Leather_Robe - Item: Shadow_9_Refine_Hammer - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: @@ -2708,7 +2708,8 @@ Body: - Item: Comp_Light_Blade - Item: Comp_Scalet_DragonL_Bow - Item: Boost_Up_1 - ResultRefine: 10 + ResultRefine: + - Level: 10 MaximumRefine: 9 CardsAllowed: true TargetItems: @@ -2725,7 +2726,8 @@ Body: - Item: Defn_Muffler - Item: Defn_Shoes - Item: Boost_Up_2 - ResultRefine: 10 + ResultRefine: + - Level: 10 CardsAllowed: true TargetItems: - Item: Boost_TH_Sword @@ -2747,7 +2749,8 @@ Body: - Item: Boost_Soul_Rod - Item: Boost_Foxtail - Item: Metal_7_Ticket - ResultRefine: 7 + ResultRefine: + - Level: 7 MaximumRefine: 6 CardsAllowed: true TargetItems: @@ -2764,7 +2767,8 @@ Body: - Item: Metal_Revolver - Item: Metal_Huuma_Shuriken - Item: Noblesse_Rifine_Ticket - ResultRefine: 9 + ResultRefine: + - Level: 9 CardsAllowed: true TargetItems: - Item: Noblesse_Breath_Armor @@ -2808,7 +2812,8 @@ Body: - Item: Noblesse_Attack_Manteau - Item: Noblesse_Magic_Manteau - Item: Imperial_Rifine_Ticket - ResultRefine: 9 + ResultRefine: + - Level: 9 CardsAllowed: true TargetItems: - Item: Imperial_Breath_Armor @@ -2852,7 +2857,8 @@ Body: - Item: Imperial_Attack_Manteau - Item: Imperial_Magic_Manteau - Item: Grace_Rifine_Ticket - ResultRefine: 9 + ResultRefine: + - Level: 9 CardsAllowed: true TargetItems: - Item: Grace_Breath_Armor @@ -3856,7 +3862,8 @@ Body: # - Item: S_Evilcurse_Pendant # - Item: S_Evilcurse_Shoes - Item: Illu_Enhance_Cube - ResultRefine: 7 + ResultRefine: + - Level: 7 MinimumRefine: 4 MaximumRefine: 6 CardsAllowed: true @@ -3868,7 +3875,8 @@ Body: - Item: Illusion_Leg_A - Item: Illusion_Leg_B - Item: Auto_Enhance_Cube - ResultRefine: 7 + ResultRefine: + - Level: 7 MinimumRefine: 4 MaximumRefine: 6 CardsAllowed: true @@ -3880,7 +3888,8 @@ Body: - Item: Auto_Leg_A - Item: Auto_Leg_B - Item: Temporal_Refine_Cube - ResultRefine: 11 + ResultRefine: + - Level: 11 MaximumRefine: 10 CardsAllowed: true TargetItems: @@ -3921,7 +3930,8 @@ Body: - Item: Modify_Dex_Boots_ - Item: Modify_Luk_Boots_ - Item: Geffen_Refine_Cube - ResultRefine: 12 + ResultRefine: + - Level: 12 MaximumRefine: 11 CardsAllowed: true TargetItems: @@ -3930,7 +3940,8 @@ Body: - Item: Geffen_Magic_Muffler - Item: Anti_Magic_Manteau - Item: Old_Refine_Cube - ResultRefine: 12 + ResultRefine: + - Level: 12 MaximumRefine: 11 CardsAllowed: true TargetItems: @@ -3949,7 +3960,8 @@ Body: - Item: Old_Protect_Of_Crown - Item: Old_Camo_RabbitHood - Item: Refine_Hero_Weapon - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: @@ -3990,13 +4002,15 @@ Body: - Item: Blue_Crystal_Staff - Item: Freezing_Rod - Item: Refine_Hero_Boots - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: - Item: Ancient_Hero_Boots - Item: OS_Weapon_Refine_Cube - ResultRefine: 11 + ResultRefine: + - Level: 11 MaximumRefine: 10 CardsAllowed: true TargetItems: @@ -4017,7 +4031,8 @@ Body: - Item: Kuroiro_OS - Item: Boost_Lance_OS - Item: Racecap_Refine_Cube - ResultRefine: 11 + ResultRefine: + - Level: 11 MaximumRefine: 10 CardsAllowed: true TargetItems: @@ -4041,7 +4056,8 @@ Body: - Item: Racing_C_Star - Item: Racing_C_Soul - Item: Booster_W_Up_1 - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: @@ -4071,7 +4087,8 @@ Body: - Item: MV_B_Violin - Item: MV_B_Whip - Item: Booster_W_Up_2 - ResultRefine: 11 + ResultRefine: + - Level: 11 MaximumRefine: 10 CardsAllowed: true TargetItems: @@ -4101,7 +4118,8 @@ Body: - Item: MV_B_Violin - Item: MV_B_Whip - Item: Booster_W_Up_3 - ResultRefine: 13 + ResultRefine: + - Level: 13 MaximumRefine: 12 CardsAllowed: true TargetItems: @@ -4144,7 +4162,8 @@ Body: - Item: SP_B_Saber - Item: SI_B_Saber - Item: E_ILL_Up - ResultRefine: 10 + ResultRefine: + - Level: 10 MaximumRefine: 9 CardsAllowed: true TargetItems: @@ -4155,7 +4174,8 @@ Body: - Item: E_Illusion_Leg_A - Item: E_Illusion_Leg_B - Item: Auto_Armor_Refine_Cube - ResultRefine: 11 + ResultRefine: + - Level: 11 MaximumRefine: 10 CardsAllowed: true TargetItems: @@ -4166,7 +4186,8 @@ Body: - Item: Auto_Leg_A - Item: Auto_Leg_B - Item: Bio_Weapon_Refine_Cube - ResultRefine: 12 + ResultRefine: + - Level: 12 MaximumRefine: 11 CardsAllowed: true TargetItems: @@ -4232,8 +4253,11 @@ Body: # - Item: MD_Geffen_Shield # - Item: MD_Geffen_Shield2 - Item: Moonlight_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4248,8 +4272,11 @@ Body: - Item: Puente_Robe_IL - Item: Apple_Of_Archer_IL - Item: S_Moonlight_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4340,8 +4367,11 @@ Body: - Item: Up_OneSkyOneSun - Item: Up_SoulWeight - Item: Vampire_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4353,8 +4383,11 @@ Body: - Item: Ghoul_Leg_IL - Item: Cape_Of_Ancient_Lord_IL - Item: S_Vampire_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4366,8 +4399,11 @@ Body: - Item: Ghoul_Leg_IL - Item: Cape_Of_Ancient_Lord_IL - Item: S_Frozen_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4378,8 +4414,11 @@ Body: - Item: Clack_Of_Servival_IL - Item: Herald_Of_GOD_IL - Item: Turtle_Is_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4391,8 +4430,11 @@ Body: - Item: Pole_Axe_IL - Item: Fancy_Flower_IL - Item: S_Turtle_Is_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4404,8 +4446,11 @@ Body: - Item: Pole_Axe_IL - Item: Fancy_Flower_IL - Item: Teddy_Bear_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4416,8 +4461,11 @@ Body: - Item: Headband_Of_Power_IL - Item: Boots_IL - Item: S_Teddy_Bear_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4428,8 +4476,11 @@ Body: - Item: Headband_Of_Power_IL - Item: Boots_IL - Item: Luanda_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4441,8 +4492,11 @@ Body: - Item: Goibne_Shoulder_IL - Item: Goibne_Boots_IL - Item: S_Luanda_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4454,8 +4508,11 @@ Body: - Item: Goibne_Shoulder_IL - Item: Goibne_Boots_IL - Item: Labyrinth_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4467,8 +4524,11 @@ Body: - Item: Morpheus_Hood_IL - Item: Morpheus_Shawl_IL - Item: S_Teddy_Labyrinth_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4480,8 +4540,11 @@ Body: - Item: Morpheus_Hood_IL - Item: Morpheus_Shawl_IL - Item: Underwater_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4498,8 +4561,11 @@ Body: - Item: Morrigane_Helm_IL - Item: Morrigane_Manyeau_IL - Item: S_Underwater_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -4516,7 +4582,8 @@ Body: - Item: Morrigane_Helm_IL - Item: Morrigane_Manyeau_IL - Item: Circlet_Refine_Cube - ResultRefine: 11 + ResultRefine: + - Level: 11 MaximumRefine: 10 CardsAllowed: true TargetItems: @@ -4731,7 +4798,8 @@ Body: # - Item: Blue_Mental_Pendant # - Item: Red_Force_Pendant - Item: GrayWolf_7_Ticket - ResultRefine: 7 + ResultRefine: + - Level: 7 MaximumRefine: 6 CardsAllowed: true TargetItems: @@ -4742,7 +4810,8 @@ Body: - Item: Gray_W_Boots - Item: Gray_W_Shoes - Item: GrayWolf_9_Ticket - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: @@ -4917,7 +4986,8 @@ Body: # - Item: Vivatus_F_C_Humma # - Item: Vivatus_F_Humma - Item: Bio_Helm_Refine_Cube - ResultRefine: 11 + ResultRefine: + - Level: 11 MaximumRefine: 10 CardsAllowed: true TargetItems: @@ -4934,8 +5004,11 @@ Body: - Item: BioWeapon_Helm_SC - Item: BioWeapon_Helm_GC - Item: Twins_Box_IL - ResultRefineMinimum: 7 - ResultRefineMaximum: 10 + ResultRefine: + - Level: 7 + - Level: 8 + - Level: 9 + - Level: 10 MinimumRefine: 4 MaximumRefine: 9 CardsAllowed: true @@ -4952,8 +5025,11 @@ Body: - Item: Dea_Staff_IL - Item: Sprint_Mail_IL - Item: S_Twins_Box_IL - ResultRefineMinimum: 9 - ResultRefineMaximum: 12 + ResultRefine: + - Level: 9 + - Level: 10 + - Level: 11 + - Level: 12 MinimumRefine: 4 MaximumRefine: 11 CardsAllowed: true @@ -5170,7 +5246,8 @@ Body: # - Item: S_Creative_Weapon # - Item: S_Creative_Shield - Item: Snow_F_Refine - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: @@ -5181,7 +5258,8 @@ Body: - Item: Snowflower_Boots - Item: Snowflower_Shoes - Item: Glacier_W_Refine - ResultRefine: 9 + ResultRefine: + - Level: 9 MaximumRefine: 8 CardsAllowed: true TargetItems: @@ -5236,7 +5314,8 @@ Body: # - Item: S_M_Mammoth_Earring # - Item: S_M_Mammoth_Pendant - Item: SubjectCape_Refine_Cube - ResultRefine: 12 + ResultRefine: + - Level: 12 MaximumRefine: 11 CardsAllowed: true TargetItems: @@ -5244,7 +5323,8 @@ Body: - Item: Subject_CapeMagic_TH - Item: Subject_CapeMelee_TH - Item: GMT_Robe_Stone - ResultRefine: 12 + ResultRefine: + - Level: 12 MaximumRefine: 11 CardsAllowed: true TargetItems: diff --git a/src/map/clif.cpp b/src/map/clif.cpp index b5199644a7..0874e830bb 100644 --- a/src/map/clif.cpp +++ b/src/map/clif.cpp @@ -23568,55 +23568,30 @@ void clif_parse_laphine_upgrade( int fd, map_session_data* sd ){ } // Change the refine rate if needed - if( upgrade->resultRefine > 0 ){ - // Absolute refine level change - item->refine = max( item->refine, upgrade->resultRefine ); - }else { - uint16 min_value = 0; - uint16 max_value = MAX_REFINE; + if (!upgrade->resultRefine.empty()) { + int total_rate = 0; - 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; + // Get the total rate (sum of the rate) + for ( const auto& it : upgrade->resultRefine ) { + if (it.second == 0) // Level removed on import + continue; + total_rate += it.second; } - if (upgrade->resultRefineRate.empty()) { - item->refine = rnd_value( min_value, max_value ); - } - else { - int level, total = 0, rate = 0; + if (total_rate > 0) { + int chance = rnd_value( 1, total_rate ); + int sum_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; - } + for ( const auto& it : upgrade->resultRefine ) { + if (it.second == 0) + continue; + sum_rate += it.second; - 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; + if (chance <= sum_rate) { + item->refine = cap_value( it.first, 0, MAX_REFINE ); break; } } - } } diff --git a/src/map/itemdb.cpp b/src/map/itemdb.cpp index e4bc4c9835..91e9a308b1 100644 --- a/src/map/itemdb.cpp +++ b/src/map/itemdb.cpp @@ -1793,77 +1793,16 @@ uint64 LaphineUpgradeDatabase::parseBodyNode( const ryml::NodeRef& node ){ } } - if( this->nodeExists( node, "ResultRefine" ) ){ - uint16 refine; - - if( !this->asUInt16( node, "ResultRefine", refine ) ){ - return 0; - } - - if( refine > MAX_REFINE ){ - this->invalidWarning( node["ResultRefine"], "Result refine %hu is too high, capping to MAX_REFINE...\n", refine ); - refine = MAX_REFINE; - } - - entry->resultRefine = refine; - }else{ - if( !exists ){ - entry->resultRefine = 0; - } - } - - if( this->nodeExists( node, "ResultRefineMinimum" ) ){ - uint16 refine; - - if( !this->asUInt16( node, "ResultRefineMinimum", refine ) ){ - return 0; - } - - if( refine > MAX_REFINE ){ - this->invalidWarning( node["ResultRefineMinimum"], "Result refine minimum %hu is too high, capping to MAX_REFINE...\n", refine ); - refine = MAX_REFINE; - } - - entry->resultRefineMinimum = refine; - }else{ - if( !exists ){ - entry->resultRefineMinimum = 0; - } - } - - if( this->nodeExists( node, "ResultRefineMaximum" ) ){ - uint16 refine; - - if( !this->asUInt16( node, "ResultRefineMaximum", refine ) ){ - return 0; - } - - if( refine > MAX_REFINE ){ - this->invalidWarning( node["ResultRefineMaximum"], "Result refine maximum %hu is too high, capping to MAX_REFINE...\n", refine ); - refine = MAX_REFINE; - } - - entry->resultRefineMaximum = refine; - }else{ - if( !exists ){ - entry->resultRefineMaximum = 0; - } - } - - if (this->nodeExists( node, "ResultRefineRate" )) { - const auto& refineNode = node["ResultRefineRate"]; + if (this->nodeExists( node, "ResultRefine" )) { + const auto& refineNode = node["ResultRefine"]; 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; + bool refine_exists = util::umap_find( entry->resultRefine, level ) != nullptr; if (this->nodeExists( refineit, "Rate" )) { uint16 rate; @@ -1871,10 +1810,10 @@ uint64 LaphineUpgradeDatabase::parseBodyNode( const ryml::NodeRef& node ){ if (!this->asUInt16Rate( refineit, "Rate", rate )) { return 0; } - entry->resultRefineRate[level] = rate; + entry->resultRefine[level] = rate; } else { if (!refine_exists) { - entry->resultRefineRate[level] = 1; + entry->resultRefine[level] = 1; } } } diff --git a/src/map/itemdb.hpp b/src/map/itemdb.hpp index a91af74d43..70f3226788 100644 --- a/src/map/itemdb.hpp +++ b/src/map/itemdb.hpp @@ -2417,10 +2417,7 @@ struct s_laphine_upgrade{ uint16 requiredRandomOptions; bool cardsAllowed; std::shared_ptr randomOptionGroup; - uint16 resultRefine; - uint16 resultRefineMinimum; - uint16 resultRefineMaximum; - std::unordered_map resultRefineRate; + std::unordered_map resultRefine; }; class LaphineUpgradeDatabase : public TypesafeYamlDatabase{ diff --git a/src/tool/yamlupgrade.cpp b/src/tool/yamlupgrade.cpp index e50964dd29..74758c5ca9 100644 --- a/src/tool/yamlupgrade.cpp +++ b/src/tool/yamlupgrade.cpp @@ -12,6 +12,7 @@ static bool upgrade_status_db(std::string file, const uint32 source_version); static bool upgrade_map_drops_db(std::string file, const uint32 source_version); static bool upgrade_enchantgrade_db( std::string file, const uint32 source_version ); static bool upgrade_item_group_db( std::string file, const uint32 source_version ); +static bool upgrade_laphine_upgrade( std::string file, const uint32 source_version ); template bool process(const std::string &type, uint32 version, const std::vector &paths, const std::string &name, Func lambda) { @@ -150,6 +151,11 @@ bool YamlUpgradeTool::initialize( int argc, char* argv[] ){ } ) ){ return false; } + if( !process( "LAPHINE_UPGRADE_DB", 2, root_paths, "laphine_upgrade", []( const std::string& path, const std::string& name_ext, uint32 source_version ) -> bool { + return upgrade_laphine_upgrade( path + name_ext, source_version ); + } ) ){ + return false; + } return true; } @@ -516,6 +522,63 @@ static bool upgrade_item_group_db( std::string file, const uint32 source_version return true; } +static bool upgrade_laphine_upgrade( std::string file, const uint32 source_version ){ + size_t entries = 0; + + for( auto input : inNode["Body"] ){ + if( source_version < 2 ){ + if( input["ResultRefine"].IsDefined() ){ + // Convert ResultRefine to a ResultRefine array + uint16 refine_level = input["ResultRefine"].as(); + + // Remove the existing Refine entry + input.remove( "ResultRefine" ); + + // Add the ResultRefine array + auto RatesNode = input["ResultRefine"]; + auto RateNode = RatesNode[0]; + + RateNode["Level"] = refine_level; + } + + // Convert the values between ResultRefineMinimum and ResultRefineMaximum to a ResultRefine array + if( input["ResultRefineMinimum"].IsDefined() || input["ResultRefineMaximum"].IsDefined() ){ + uint16 refine_level_min = 0, refine_level_max = MAX_REFINE; + + // Save data and remove the existing ResultRefineMinimum/ResultRefineMaximum entry + if( input["ResultRefineMinimum"].IsDefined() ) { + refine_level_min = input["ResultRefineMinimum"].as(); + input.remove( "ResultRefineMinimum" ); + } + if( input["ResultRefineMaximum"].IsDefined() ) { + refine_level_max = input["ResultRefineMaximum"].as(); + input.remove( "ResultRefineMaximum" ); + } + + // Remove existing ResultRefine entry (shouldn't happen) + if( input["ResultRefine"].IsDefined() ) + input.remove( "ResultRefine" ); + + // Add the ResultRefine array + auto RatesNode = input["ResultRefine"]; + + for( int i = refine_level_min, j = 0; i <= refine_level_max; i++, j++ ){ + auto RateNode = RatesNode[j]; + + RateNode["Level"] = i; + } + } + } + + body << input; + entries++; + } + + ShowStatus( "Done converting/upgrading '" CL_WHITE "%zu" CL_RESET "' entries in '" CL_WHITE "%s" CL_RESET "'.\n", entries, file.c_str() ); + + return true; +} + int main( int argc, char *argv[] ){ return main_core( argc, argv );