Skip to content

Commit 9259708

Browse files
authored
Fix deserialize/serialize of power level (#82295)
* get_int64 for JsonObject Just boilerplate * Fix deserialize/serialize of power level These were not being serialized as units strings, but as integers, and changing it to optional resulted in a loading error. Save them as units strings always and handle loading ints.
2 parents a3e1dfb + 27b7395 commit 9259708

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

src/flexbuffer_json-inl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,11 @@ inline int JsonObject::get_int( const std::string_view key ) const
849849
return get_member( key );
850850
}
851851

852+
inline int64_t JsonObject::get_int64( const std::string_view key ) const
853+
{
854+
return get_member( key );
855+
}
856+
852857
inline double JsonObject::get_float( const std::string_view key ) const
853858
{
854859
return get_member( key );

src/flexbuffer_json.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,7 @@ class JsonObject : JsonWithPath
617617
// Vanilla accessors. Just return the named member and use it's conversion function.
618618
bool get_bool( std::string_view key ) const;
619619
int get_int( std::string_view key ) const;
620+
int64_t get_int64( std::string_view key ) const;
620621
double get_float( std::string_view key ) const;
621622
JsonArray get_array( std::string_view key ) const;
622623
JsonObject get_object( std::string_view key ) const;

src/savegame_json.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,8 +1094,18 @@ void Character::load( const JsonObject &data )
10941094
recalc_sight_limits();
10951095
calc_encumbrance();
10961096

1097-
optional( data, false, "power_level", power_level, 0_kJ );
1098-
optional( data, false, "max_power_level_modifier", max_power_level_modifier, units::energy::min() );
1097+
// migration code, added in early 0.J
1098+
if( data.has_int( "power_level" ) ) {
1099+
power_level = units::from_kilojoule( data.get_int64( "power_level" ) );
1100+
} else {
1101+
data.read( "power_level", power_level );
1102+
}
1103+
// migration code, added in early 0.J
1104+
if( data.has_int( "max_power_level_modifier" ) ) {
1105+
max_power_level_modifier = units::from_kilojoule( data.get_int64( "max_power_level_modifier" ) );
1106+
} else {
1107+
data.read( "max_power_level_modifier", max_power_level_modifier );
1108+
}
10991109

11001110
// Bionic power should not be negative!
11011111
if( power_level < 0_mJ ) {
@@ -1460,14 +1470,8 @@ void Character::store( JsonOut &json ) const
14601470
json.member( "proficiencies", _proficiencies );
14611471

14621472
// npc; unimplemented
1463-
if( power_level < 1_J ) {
1464-
json.member( "power_level", std::to_string( units::to_millijoule( power_level ) ) + " mJ" );
1465-
} else if( power_level < 1_kJ ) {
1466-
json.member( "power_level", std::to_string( units::to_joule( power_level ) ) + " J" );
1467-
} else {
1468-
json.member( "power_level", units::to_kilojoule( power_level ) );
1469-
}
1470-
json.member( "max_power_level_modifier", units::to_kilojoule( max_power_level_modifier ) );
1473+
json.member( "power_level", power_level );
1474+
json.member( "max_power_level_modifier", max_power_level_modifier );
14711475

14721476
if( !overmap_time.empty() ) {
14731477
json.member( "overmap_time" );

0 commit comments

Comments
 (0)