From 3f5ade8d1022dc0d1f21688308b3df463d5460c4 Mon Sep 17 00:00:00 2001 From: anothersimulacrum Date: Wed, 4 Dec 2019 17:55:22 +0000 Subject: [PATCH] Fix Toxins not working with simplified nutrition This commit adds vitamin `types`, different variations of vitamins that can later be expanded to have different effects. These are dynamically loaded from JSON into 4 types, vitamin, toxin, drug, and counter. Only vitamin, toxin, and counter are used right now. Only the vitamin type has an effect, used with simplified nutrition to make it so that that vitamin has no effect. --- data/json/vitamin.json | 7 +++++++ src/consumption.cpp | 2 +- src/item_factory.cpp | 6 +++++- src/vitamin.cpp | 27 +++++++++++++++++++++++++++ src/vitamin.h | 18 ++++++++++++++++++ 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/data/json/vitamin.json b/data/json/vitamin.json index 7afb21569abb0..9e448c98b0337 100644 --- a/data/json/vitamin.json +++ b/data/json/vitamin.json @@ -2,6 +2,7 @@ { "id": "calcium", "type": "vitamin", + "vit_type": "vitamin", "name": "Calcium", "deficiency": "hypocalcemia", "min": -12000, @@ -11,6 +12,7 @@ { "id": "iron", "type": "vitamin", + "vit_type": "vitamin", "name": "Iron", "excess": "hypervitaminosis", "deficiency": "anemia", @@ -22,6 +24,7 @@ { "id": "vitA", "type": "vitamin", + "vit_type": "vitamin", "name": "Vitamin A", "excess": "hypervitaminosis", "deficiency": "hypovitA", @@ -33,6 +36,7 @@ { "id": "vitB", "type": "vitamin", + "vit_type": "vitamin", "name": "Vitamin B12", "deficiency": "hypovitB", "min": -5600, @@ -42,6 +46,7 @@ { "id": "vitC", "type": "vitamin", + "vit_type": "vitamin", "name": "Vitamin C", "deficiency": "scurvy", "min": -5600, @@ -51,6 +56,7 @@ { "id": "mutant_toxin", "type": "vitamin", + "vit_type": "toxin", "name": "Toxins", "excess": "toxin_buildup", "min": 0, @@ -61,6 +67,7 @@ { "id": "bad_food", "type": "vitamin", + "vit_type": "counter", "name": "Disgusting Diet", "excess": "bad_food_ennui", "min": 0, diff --git a/src/consumption.cpp b/src/consumption.cpp index 47e90619f2c05..8790d1c3da315 100644 --- a/src/consumption.cpp +++ b/src/consumption.cpp @@ -374,7 +374,7 @@ void player::vitamins_mod( const std::map &vitamins, bool cappe int Character::vitamin_get( const vitamin_id &vit ) const { - if( get_option( "NO_VITAMINS" ) ) { + if( get_option( "NO_VITAMINS" ) && vit->type() == vitamin_type::VITAMIN ) { return 0; } diff --git a/src/item_factory.cpp b/src/item_factory.cpp index 1e1bb80649f28..ee4945c339bcb 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -309,7 +309,11 @@ void Item_factory::finalize_pre( itype &obj ) if( obj.comestible ) { if( get_option( "NO_VITAMINS" ) ) { - obj.comestible->vitamins.clear(); + for( auto &vit : obj.comestible->vitamins ) { + if( vit.first->type() == vitamin_type::VITAMIN ) { + vit.second = 0; + } + } } else if( obj.comestible->vitamins.empty() && obj.comestible->healthy >= 0 ) { // Default vitamins of healthy comestibles to their edible base materials if none explicitly specified. auto healthy = std::max( obj.comestible->healthy, 1 ) * 10; diff --git a/src/vitamin.cpp b/src/vitamin.cpp index 2959ff66f4cfa..5f2f49ab337f4 100644 --- a/src/vitamin.cpp +++ b/src/vitamin.cpp @@ -61,6 +61,11 @@ void vitamin::load_vitamin( JsonObject &jo ) vit.max_ = jo.get_int( "max", 0 ); vit.rate_ = read_from_json_string( *jo.get_raw( "rate" ), time_duration::units ); + if( !jo.has_string( "vit_type" ) ) { + jo.throw_error( "vitamin must have a vitamin type", "vit_type" ); + } + vit.type_ = jo.get_enum_value( "vit_type" ); + if( vit.rate_ < 0_turns ) { jo.throw_error( "vitamin consumption rate cannot be negative", "rate" ); } @@ -102,3 +107,25 @@ void vitamin::reset() { vitamins_all.clear(); } + +namespace io +{ +template<> +std::string enum_to_string( vitamin_type data ) +{ + switch( data ) { + case vitamin_type::VITAMIN: + return "vitamin"; + case vitamin_type::TOXIN: + return "toxin"; + case vitamin_type::DRUG: + return "drug"; + case vitamin_type::COUNTER: + return "counter"; + case vitamin_type::num_vitamin_types: + break; + } + debugmsg( "Invalid vitamin_type" ); + abort(); +} +} // namespace io diff --git a/src/vitamin.h b/src/vitamin.h index 81e5019216a9d..7493b03bef350 100644 --- a/src/vitamin.h +++ b/src/vitamin.h @@ -14,6 +14,19 @@ class JsonObject; +enum vitamin_type { + VITAMIN, + TOXIN, + DRUG, + COUNTER, + num_vitamin_types +}; + +template<> +struct enum_traits { + static constexpr auto last = vitamin_type::num_vitamin_types; +}; + class vitamin { public: @@ -23,6 +36,10 @@ class vitamin return id_; } + const vitamin_type &type() const { + return type_; + } + bool is_null() const { return id_ == vitamin_id( "null" ); } @@ -76,6 +93,7 @@ class vitamin private: vitamin_id id_; + vitamin_type type_; translation name_; efftype_id deficiency_; efftype_id excess_;