Skip to content

Commit cc1fe77

Browse files
authored
Enchantment cache save corruption fix (#82674)
* Fix enchantment cache save corruption * Migrate enchantment cache save corruption * Clarify difference between load_add_and_multiply functions, remove unnecessary is_child checks
1 parent de723be commit cc1fe77

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

src/magic_enchantment.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,11 @@ bool string_id<enchantment>::is_valid() const
199199
}
200200

201201
template<typename TKey>
202-
void load_add_and_multiply( const JsonObject &jo, const bool &is_child,
203-
std::string_view array_key, const std::string &type_key, std::map<TKey, dbl_or_var> &add_map,
204-
std::map<TKey, dbl_or_var> &mult_map )
202+
void load_add_and_multiply_dbl_or_var( const JsonObject &jo, std::string_view array_key,
203+
const std::string &type_key, std::map<TKey, dbl_or_var> &add_map,
204+
std::map<TKey, dbl_or_var> &mult_map )
205205
{
206-
if( !is_child && jo.has_array( array_key ) ) {
206+
if( jo.has_array( array_key ) ) {
207207
for( const JsonObject value_obj : jo.get_array( array_key ) ) {
208208

209209
TKey value;
@@ -246,7 +246,11 @@ void load_add_and_multiply( const JsonObject &jo, std::string_view array_key,
246246
if( jo.has_array( array_key ) ) {
247247
for( const JsonObject value_obj : jo.get_array( array_key ) ) {
248248

249-
const TKey value = TKey( value_obj.get_string( type_key ) );
249+
// Migration from accidental corruption, remove after 0.J
250+
const TKey value = !value_obj.has_string( type_key ) && value_obj.has_string( "value" ) ?
251+
TKey( value_obj.get_string( "value" ) ) :
252+
TKey( value_obj.get_string( type_key ) );
253+
// Values of 0 used to be serialised exist (removed in 0.J exp) so for now load based on != 0 rather than on member existance
250254
const double add = value_obj.get_float( "add", 0.0 );
251255
const double mult = value_obj.get_float( "multiply", 0.0 );
252256

@@ -293,7 +297,7 @@ void enchant_cache::save_add_and_multiply( JsonOut &jsout, const std::string_vie
293297
continue;
294298
}
295299
jsout.start_object();
296-
jsout.member( "value", type );
300+
jsout.member( type_key, type );
297301
jsout.member( "multiply", multiply );
298302
jsout.end_object();
299303
}
@@ -569,25 +573,29 @@ void enchantment::load( const JsonObject &jo, std::string_view,
569573
optional( jo, was_loaded, "name", name );
570574
optional( jo, was_loaded, "description", description );
571575

572-
load_add_and_multiply<enchant_vals::mod>( jo, is_child, "values", "value", values_add,
576+
if( is_child ) {
577+
return;
578+
}
579+
580+
load_add_and_multiply_dbl_or_var<enchant_vals::mod>( jo, "values", "value", values_add,
573581
values_multiply );
574582

575-
load_add_and_multiply<skill_id>( jo, is_child, "skills", "value",
576-
skill_values_add, skill_values_multiply );
583+
load_add_and_multiply_dbl_or_var<skill_id>( jo, "skills", "value", skill_values_add,
584+
skill_values_multiply );
577585

578-
load_add_and_multiply<bodypart_str_id>( jo, is_child, "encumbrance_modifier", "part",
579-
encumbrance_values_add, encumbrance_values_multiply );
586+
load_add_and_multiply_dbl_or_var<bodypart_str_id>( jo, "encumbrance_modifier", "part",
587+
encumbrance_values_add, encumbrance_values_multiply );
580588

581-
load_add_and_multiply<damage_type_id>( jo, is_child, "melee_damage_bonus", "type",
582-
damage_values_add, damage_values_multiply );
589+
load_add_and_multiply_dbl_or_var<damage_type_id>( jo, "melee_damage_bonus", "type",
590+
damage_values_add, damage_values_multiply );
583591

584-
load_add_and_multiply<damage_type_id>( jo, is_child, "incoming_damage_mod", "type",
585-
armor_values_add, armor_values_multiply );
592+
load_add_and_multiply_dbl_or_var<damage_type_id>( jo, "incoming_damage_mod", "type",
593+
armor_values_add, armor_values_multiply );
586594

587-
load_add_and_multiply<damage_type_id>( jo, is_child, "incoming_damage_mod_post_absorbed", "type",
588-
extra_damage_add, extra_damage_multiply );
595+
load_add_and_multiply_dbl_or_var<damage_type_id>( jo, "incoming_damage_mod_post_absorbed", "type",
596+
extra_damage_add, extra_damage_multiply );
589597

590-
if( !is_child && jo.has_array( "special_vision" ) ) {
598+
if( jo.has_array( "special_vision" ) ) {
591599
for( const JsonObject vision_obj : jo.get_array( "special_vision" ) ) {
592600
special_vision _vision;
593601
special_vision_descriptions _desc;

0 commit comments

Comments
 (0)