diff --git a/data/json/items/armor/backpacks.json b/data/json/items/armor/backpacks.json index 59c1682166a32..567a697821022 100644 --- a/data/json/items/armor/backpacks.json +++ b/data/json/items/armor/backpacks.json @@ -7,13 +7,15 @@ "weight": "633 g", "volume": "2 L", "price": 3900, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 10, - "storage": "10 L", + "encumbrance": 2, + "max_encumbrance": 15, + "storage": "15 L", "warmth": 6, "material_thickness": 2, "flags": [ "BELTED" ] @@ -26,12 +28,14 @@ "weight": "2291 g", "volume": "14 L", "price": 10000, + "rigid": false, "material": [ "leather" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 55, + "encumbrance": 10, + "max_encumbrance": 40, "storage": "55 L", "warmth": 10, "material_thickness": 2, @@ -55,13 +59,15 @@ "weight": "1200 g", "volume": "8750 ml", "price": 4500, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "green", "covers": [ "TORSO", "LEGS" ], "coverage": 75, - "encumbrance": 100, - "storage": "35 L", + "encumbrance": 10, + "max_encumbrance": 40, + "storage": "45 L", "warmth": 5, "material_thickness": 2, "flags": [ "BELTED" ] @@ -74,13 +80,15 @@ "weight": "818 g", "volume": "2 L", "price": 11900, + "rigid": false, "material": [ "leather" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 11, - "storage": "10 L", + "encumbrance": 4, + "max_encumbrance": 17, + "storage": "15 L", "warmth": 9, "material_thickness": 3, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -93,12 +101,14 @@ "weight": "2291 g", "volume": "15 L", "price": 9000, + "rigid": false, "material": [ "leather" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 65, + "encumbrance": 10, + "max_encumbrance": 55, "storage": "65 L", "warmth": 10, "material_thickness": 2, @@ -112,13 +122,14 @@ "weight": "3539 g", "volume": "21 L", "price": 20000, - "material": [ "leather" ], + "rigid": false, "symbol": "[", "color": "black", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 100, - "storage": "100 L", + "encumbrance": 16, + "max_encumbrance": 65, + "storage": "80 L", "warmth": 10, "material_thickness": 2, "flags": [ "BELTED", "WATERPROOF", "ONLY_ONE", "OVERSIZE" ] @@ -131,13 +142,15 @@ "weight": "512 g", "volume": "1500 ml", "price": 10900, + "rigid": false, "material": [ "plastic" ], "symbol": "[", "color": "yellow", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 10, - "storage": "9500 ml", + "encumbrance": 2, + "max_encumbrance": 12, + "storage": "12 L", "material_thickness": 1, "flags": [ "WATER_FRIENDLY", "BELTED" ] }, @@ -149,13 +162,15 @@ "weight": "933 g", "volume": "6 L", "price": 12000, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 50, - "encumbrance": 30, - "storage": "30 L", + "encumbrance": 5, + "max_encumbrance": 35, + "storage": "35 L", "warmth": 10, "material_thickness": 2, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -173,8 +188,8 @@ "color": "blue", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 14, - "storage": "3750 ml", + "encumbrance": 10, + "storage": "4 L", "warmth": 8, "material_thickness": 2, "properties": [ [ "monster_size_capacity", "SMALL" ] ], @@ -209,12 +224,14 @@ "weight": "560 g", "volume": "2 L", "price": 1000, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "light_gray", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 10, + "encumbrance": 2, + "max_encumbrance": 9, "storage": "5 L", "warmth": 5, "material_thickness": 1, @@ -228,14 +245,16 @@ "weight": "771 g", "volume": "5 L", "price": 100, + "rigid": false, "to_hit": -2, "material": [ "cotton" ], "symbol": "[", "color": "light_gray", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 40, - "storage": "7500 ml", + "encumbrance": 4, + "max_encumbrance": 15, + "storage": "10 L", "warmth": 10, "material_thickness": 1, "flags": [ "OVERSIZE", "BELTED", "WATER_FRIENDLY" ] @@ -249,6 +268,7 @@ "weight": "760 g", "volume": "1 L", "price": 7900, + "rigid": false, "to_hit": 1, "bashing": 1, "material": [ "cotton", "plastic" ], @@ -256,8 +276,9 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 5, - "storage": "6250 ml", + "encumbrance": 1, + "max_encumbrance": 6, + "storage": "6 L", "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] }, @@ -269,12 +290,14 @@ "weight": "966 g", "volume": "2500 ml", "price": 6700, + "rigid": false, "material": [ "cotton", "kevlar" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 35, - "encumbrance": 9, + "encumbrance": 2, + "max_encumbrance": 9, "storage": "12 L", "warmth": 10, "material_thickness": 2, @@ -288,6 +311,7 @@ "weight": "297 g", "volume": "1 L", "price": 7500, + "rigid": false, "to_hit": 2, "bashing": 2, "material": [ "leather" ], @@ -295,7 +319,8 @@ "color": "dark_gray", "covers": [ "TORSO" ], "coverage": 10, - "encumbrance": 7, + "encumbrance": 2, + "max_encumbrance": 7, "storage": "5 L", "material_thickness": 2, "flags": [ "FANCY", "BELTED", "WATER_FRIENDLY" ] @@ -308,13 +333,15 @@ "weight": "1140 g", "volume": "4 L", "price": 9200, + "rigid": false, "material": [ "cotton", "plastic" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 20, - "storage": "20 L", + "encumbrance": 2, + "max_encumbrance": 20, + "storage": "22 L", "warmth": 8, "material_thickness": 2, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -327,6 +354,7 @@ "weight": "840 g", "volume": "1500 ml", "price": 24000, + "rigid": false, "to_hit": 1, "bashing": 1, "material": [ "cotton", "plastic" ], @@ -334,8 +362,9 @@ "color": "green", "covers": [ "TORSO" ], "coverage": 20, - "encumbrance": 3, - "storage": "4 L", + "encumbrance": 1, + "max_encumbrance": 6, + "storage": "7 L", "warmth": 2, "material_thickness": 1, "flags": [ "BELTED", "WATER_FRIENDLY" ] @@ -349,13 +378,15 @@ "weight": "566 g", "volume": "1500 ml", "price": 2900, + "rigid": false, "bashing": 1, "material": [ "cotton", "plastic" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 7, + "encumbrance": 2, + "max_encumbrance": 9, "storage": "8 L", "warmth": 2, "material_thickness": 1, @@ -369,13 +400,15 @@ "weight": "1000 g", "volume": "7500 ml", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "dark_gray", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 25, - "storage": "37500 ml", + "encumbrance": 8, + "max_encumbrance": 28, + "storage": "38 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED", "OVERSIZE" ] }, @@ -387,13 +420,15 @@ "weight": "600 g", "volume": "2500 ml", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 8, - "storage": "12500 ml", + "encumbrance": 3, + "max_encumbrance": 12, + "storage": "16 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED" ] }, @@ -405,12 +440,14 @@ "weight": "800 g", "volume": "5 L", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "dark_gray", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 18, + "encumbrance": 3, + "max_encumbrance": 18, "storage": "25 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED", "OVERSIZE" ] @@ -423,13 +460,15 @@ "weight": "440 g", "volume": "1750 ml", "price": 24000, + "rigid": false, "material": [ "leather", "cotton" ], "symbol": "[", "color": "brown", "covers": [ "TORSO" ], "coverage": 30, - "encumbrance": 2, - "storage": "4500 ml", + "encumbrance": 1, + "max_encumbrance": 6, + "storage": "8 L", "material_thickness": 2, "flags": [ "WATER_FRIENDLY", "STURDY", "BELTED" ] }, @@ -441,13 +480,14 @@ "weight": "1900 g", "volume": "15 L", "price": 800, + "rigid": false, "material": [ "cotton", "plastic" ], "symbol": "[", "color": "green", "covers": [ "TORSO" ], "coverage": 35, - "encumbrance": 16, - "storage": "15 L", + "encumbrance": 2, + "max_encumbrance": 15, "warmth": 5, "material_thickness": 3, "flags": [ "BELTED", "OVERSIZE" ], @@ -468,13 +508,15 @@ "weight": "636 g", "volume": "3 L", "price": 7000, + "rigid": false, "material": [ "cotton" ], "symbol": "[", "color": "yellow", "covers": [ "TORSO" ], "coverage": 40, - "encumbrance": 25, - "storage": "25 L", + "encumbrance": 3, + "max_encumbrance": 25, + "storage": "30 L", "warmth": 8, "material_thickness": 2, "flags": [ "BELTED", "WATERPROOF" ] diff --git a/src/advanced_inv.cpp b/src/advanced_inv.cpp index 5561bceac383a..193199316e9f7 100644 --- a/src/advanced_inv.cpp +++ b/src/advanced_inv.cpp @@ -131,6 +131,7 @@ advanced_inventory::~advanced_inventory() werase( left_window ); werase( right_window ); g->refresh_all(); + g->u.check_item_encumbrance_flag(); } } diff --git a/src/artifact.cpp b/src/artifact.cpp index 14b3e88cecb12..9dc150d4477c0 100644 --- a/src/artifact.cpp +++ b/src/artifact.cpp @@ -234,6 +234,7 @@ struct artifact_armor_form_datum { units::volume volume; units::mass weight; int encumb; + int max_encumb; int coverage; int thickness; int env_resist; @@ -446,9 +447,9 @@ static const std::array artifact_weapon_dat } }; static const std::array artifact_armor_form_data = { { - // Name color Material Vol Wgt Enc Cov Thk Env Wrm Sto Bsh Cut Hit + // Name color Material Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto Bsh Cut Hit { - translate_marker( "Robe" ), def_c_red, material_id( "wool" ), 1500_ml, 700_gram, 1, 90, 3, 0, 2, 0_ml, -8, 0, -3, + translate_marker( "Robe" ), def_c_red, material_id( "wool" ), 1500_ml, 700_gram, 1, 1, 90, 3, 0, 2, 0_ml, -8, 0, -3, { { bp_torso, bp_leg_l, bp_leg_r } }, false, {{ ARMORMOD_LIGHT, ARMORMOD_BULKY, ARMORMOD_POCKETED, ARMORMOD_FURRED, @@ -458,7 +459,7 @@ static const std::array artifact_arm }, { - translate_marker( "Coat" ), def_c_brown, material_id( "leather" ), 3500_ml, 1600_gram, 2, 80, 2, 1, 4, 1000_ml, -6, 0, -3, + translate_marker( "Coat" ), def_c_brown, material_id( "leather" ), 3500_ml, 1600_gram, 2, 2, 80, 2, 1, 4, 1000_ml, -6, 0, -3, { bp_torso }, false, {{ ARMORMOD_LIGHT, ARMORMOD_POCKETED, ARMORMOD_FURRED, ARMORMOD_PADDED, @@ -468,7 +469,7 @@ static const std::array artifact_arm }, { - translate_marker( "Mask" ), def_c_white, material_id( "wood" ), 1000_ml, 100_gram, 2, 50, 2, 1, 2, 0_ml, 2, 0, -2, + translate_marker( "Mask" ), def_c_white, material_id( "wood" ), 1000_ml, 100_gram, 2, 2, 50, 2, 1, 2, 0_ml, 2, 0, -2, { { bp_eyes, bp_mouth } }, false, {{ ARMORMOD_FURRED, ARMORMOD_FURRED, ARMORMOD_NULL, ARMORMOD_NULL, @@ -477,9 +478,9 @@ static const std::array artifact_arm } }, - // Name color Materials Vol Wgt Enc Cov Thk Env Wrm Sto Bsh Cut Hit + // Name color Materials Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto Bsh Cut Hit { - translate_marker( "Helm" ), def_c_dark_gray, material_id( "silver" ), 1500_ml, 700_gram, 2, 85, 3, 0, 1, 0_ml, 8, 0, -2, + translate_marker( "Helm" ), def_c_dark_gray, material_id( "silver" ), 1500_ml, 700_gram, 2, 2, 85, 3, 0, 1, 0_ml, 8, 0, -2, { bp_head }, false, {{ ARMORMOD_BULKY, ARMORMOD_FURRED, ARMORMOD_PADDED, ARMORMOD_PLATED, @@ -489,7 +490,7 @@ static const std::array artifact_arm }, { - translate_marker( "Gloves" ), def_c_light_blue, material_id( "leather" ), 500_ml, 100_gram, 1, 90, 3, 1, 2, 0_ml, -4, 0, -2, + translate_marker( "Gloves" ), def_c_light_blue, material_id( "leather" ), 500_ml, 100_gram, 1, 1, 90, 3, 1, 2, 0_ml, -4, 0, -2, { { bp_hand_l, bp_hand_r } }, true, {{ ARMORMOD_BULKY, ARMORMOD_FURRED, ARMORMOD_PADDED, ARMORMOD_PLATED, @@ -498,9 +499,9 @@ static const std::array artifact_arm } }, - // Name color Materials Vol Wgt Enc Cov Thk Env Wrm Sto Bsh Cut Hit + // Name color Materials Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto Bsh Cut Hit { - translate_marker( "Boots" ), def_c_blue, material_id( "leather" ), 1500_ml, 250_gram, 1, 75, 3, 1, 3, 0_ml, 4, 0, -1, + translate_marker( "Boots" ), def_c_blue, material_id( "leather" ), 1500_ml, 250_gram, 1, 1, 75, 3, 1, 3, 0_ml, 4, 0, -1, { { bp_foot_l, bp_foot_r } }, true, {{ ARMORMOD_LIGHT, ARMORMOD_BULKY, ARMORMOD_PADDED, ARMORMOD_PLATED, @@ -510,7 +511,7 @@ static const std::array artifact_arm }, { - translate_marker( "Ring" ), def_c_light_green, material_id( "silver" ), 0_ml, 4_gram, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, + translate_marker( "Ring" ), def_c_light_green, material_id( "silver" ), 0_ml, 4_gram, 0, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} } @@ -523,45 +524,45 @@ static const std::array artifact_arm */ static const std::array artifact_armor_mod_data = { { { - "", def_c_white, material_id( "null" ), 0_ml, 0_gram, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, {}, false, + "", def_c_white, material_id( "null" ), 0_ml, 0_gram, 0, 0, 0, 0, 0, 0, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, // Description; "It is ..." or "They are ..." { translate_marker( "very thin and light." ), def_c_white, material_id( "null" ), - // Vol Wgt Enc Cov Thk Env Wrm Sto - -1000_ml, -950_gram, -2, -1, -1, -1, -1, 0_ml, 0, 0, 0, {}, false, + // Vol Wgt Enc MaxEnc Cov Thk Env Wrm Sto + -1000_ml, -950_gram, -2, -2, -1, -1, -1, -1, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "extremely bulky." ), def_c_white, material_id( "null" ), - 2000_ml, 1150_gram, 2, 1, 1, 0, 1, 0_ml, 0, 0, 0, {}, false, + 2000_ml, 1150_gram, 2, 2, 1, 1, 0, 1, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "covered in pockets." ), def_c_white, material_id( "null" ), - 250_ml, 150_gram, 1, 0, 0, 0, 0, 4000_ml, 0, 0, 0, {}, false, + 250_ml, 150_gram, 1, 1, 0, 0, 0, 0, 4000_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "disgustingly furry." ), def_c_white, material_id( "wool" ), - // Vol Wgt Enc Dmg Cut Env Wrm Sto - 1000_ml, 250_gram, 1, 1, 1, 1, 3, 0_ml, 0, 0, 0, {}, false, + // Vol Wgt Enc MaxEnc Dmg Cut Env Wrm Sto + 1000_ml, 250_gram, 1, 1, 1, 1, 1, 3, 0_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "leather-padded." ), def_c_white, material_id( "leather" ), - 1000_ml, 450_gram, 1, 1, 1, 0, 1, -750_ml, 0, 0, 0, {}, false, + 1000_ml, 450_gram, 1, 1, 1, 1, 0, 1, -750_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, { translate_marker( "plated in iron." ), def_c_white, material_id( "iron" ), - 1000_ml, 1400_gram, 3, 2, 2, 0, 1, -1000_ml, 0, 0, 0, {}, false, + 1000_ml, 1400_gram, 3, 3, 2, 2, 0, 1, -1000_ml, 0, 0, 0, {}, false, {{ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL, ARMORMOD_NULL}} }, } @@ -823,6 +824,7 @@ std::string new_artifact() def.m_to_hit = info.melee_hit; def.armor->covers = info.covers; def.armor->encumber = info.encumb; + def.armor->max_encumber = info.max_encumb; def.armor->coverage = info.coverage; def.armor->thickness = info.thickness; def.armor->env_resist = info.env_resist; @@ -1277,6 +1279,7 @@ void it_artifact_armor::deserialize( JsonObject &jo ) jo.read( "covers", armor->covers ); armor->encumber = jo.get_int( "encumber" ); + armor->max_encumber = jo.get_int( "max_encumber" ); armor->coverage = jo.get_int( "coverage" ); armor->thickness = jo.get_int( "material_thickness" ); armor->env_resist = jo.get_int( "env_resist" ); @@ -1412,6 +1415,7 @@ void it_artifact_armor::serialize( JsonOut &json ) const // armor data json.member( "covers", armor->covers ); json.member( "encumber", armor->encumber ); + json.member( "max_encumber", armor->max_encumber ); json.member( "coverage", armor->coverage ); json.member( "material_thickness", armor->thickness ); json.member( "env_resist", armor->env_resist ); diff --git a/src/character.cpp b/src/character.cpp index 3074e2c9732ca..2a3b3d075b1b3 100644 --- a/src/character.cpp +++ b/src/character.cpp @@ -807,9 +807,14 @@ float Character::get_vision_threshold( float light_level ) const threshold_for_range( range ) * dimming_from_light ); } +void Character::flag_encumbrance() +{ + check_encumbrance = true; +} + void Character::check_item_encumbrance_flag() { - bool update_required = false; + bool update_required = check_encumbrance; for( auto &i : worn ) { if( !update_required && i.has_flag( "ENCUMBRANCE_UPDATE" ) ) { update_required = true; diff --git a/src/character.h b/src/character.h index c5245b4fd0b6f..d5ceceed1fa11 100644 --- a/src/character.h +++ b/src/character.h @@ -384,6 +384,10 @@ class Character : public Creature, public visitable * to simulate glare, etc, night vision only works if you are in the dark. */ float get_vision_threshold( float light_level ) const; + /** + * Flag encumbrance for updating. + */ + void flag_encumbrance(); /** * Checks worn items for the "RESET_ENCUMBRANCE" flag, which indicates * that encumbrance may have changed and require recalculating. @@ -1018,6 +1022,7 @@ class Character : public Creature, public visitable int fatigue; int sleep_deprivation; + bool check_encumbrance; }; #endif diff --git a/src/item.cpp b/src/item.cpp index 86a46e69036c8..d52a7124aaa63 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -3273,7 +3273,7 @@ void item::on_wield( player &p, int mv ) } // Update encumbrance in case we were wearing it - p.reset_encumbrance(); + p.flag_encumbrance(); } void item::handle_pickup_ownership( Character &c ) @@ -3335,6 +3335,8 @@ void item::on_pickup( Character &p ) contents.clear(); } + + p.flag_encumbrance(); } void item::on_contents_changed() @@ -4464,10 +4466,31 @@ bool item::is_power_armor() const int item::get_encumber( const Character &p ) const { + units::volume contents_volume( 0_ml ); + for( const item &e : contents ) { contents_volume += e.volume(); } + + if( p.is_worn( *this ) ) { + const islot_armor *t = find_armor_data(); + + if( t != nullptr && t->max_encumber != 0 ) { + units::volume char_storage( 0_ml ); + + for( const item &e : p.worn ) { + char_storage += e.get_storage(); + } + + if( char_storage != 0_ml ) { + // Cast up to 64 to prevent overflow. Dividing before would prevent this but lose data. + contents_volume += units::from_milliliter( static_cast( t->storage.value() ) * + p.inv.volume().value() / char_storage.value() ); + } + } + } + return get_encumber_when_containing( p, contents_volume ); } @@ -4483,9 +4506,23 @@ int item::get_encumber_when_containing( // Non-rigid items add additional encumbrance proportional to their volume if( !type->rigid ) { - encumber += contents_volume / 250_ml; + const int capacity = get_total_capacity().value(); + + if( t->max_encumber != 0 ) { + + if( capacity > 0 ) { + // Cast up to 64 to prevent overflow. Dividing before would prevent this but lose data. + encumber += static_cast( t->max_encumber - t->encumber ) * contents_volume.value() / + capacity; + } else { + debugmsg( "Non-rigid item (%s) without storage capacity.", tname() ); + } + } else { + encumber += contents_volume / 250_ml; + } } + // Fit checked before changes, fitting shouldn't reduce penalties from patching. if( has_flag( "FIT" ) && has_flag( "VARSIZE" ) ) { encumber = std::max( encumber / 2, encumber - 10 ); @@ -6959,7 +6996,7 @@ units::volume item::get_container_capacity() const units::volume item::get_total_capacity() const { - units::volume result = get_container_capacity(); + units::volume result = get_storage() + get_container_capacity(); // Consider various iuse_actors which add containing capability // Treating these two as special cases for now; if more appear in the @@ -8777,6 +8814,8 @@ bool item::on_drop( const tripoint &pos, map &m ) !item_tags.count( "DIRTY" ) ) { item_tags.insert( "DIRTY" ); } + + g->u.flag_encumbrance(); return type->drop_action && type->drop_action.call( g->u, *this, false, pos ); } diff --git a/src/item_factory.cpp b/src/item_factory.cpp index 422085e6effa7..703b1f175091a 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -1501,6 +1501,7 @@ void Item_factory::load( islot_armor &slot, JsonObject &jo, const std::string &s bool strict = src == "dda"; assign( jo, "encumbrance", slot.encumber, strict, 0 ); + assign( jo, "max_encumbrance", slot.max_encumber, strict, slot.encumber ); assign( jo, "coverage", slot.coverage, strict, 0, 100 ); assign( jo, "material_thickness", slot.thickness, strict, 0 ); assign( jo, "environmental_protection", slot.env_resist, strict, 0 ); diff --git a/src/itype.h b/src/itype.h index 00faf24b00e7b..3c3b3dca7ea98 100644 --- a/src/itype.h +++ b/src/itype.h @@ -222,6 +222,10 @@ struct islot_armor { * How much this item encumbers the player. */ int encumber = 0; + /** + * When storage is full, how much it encumbers the player. + */ + int max_encumber = 0; /** * Percentage of the body part area that this item covers. * This determines how likely it is to hit the item instead of the player.