summaryrefslogtreecommitdiff
path: root/custom.patch
diff options
context:
space:
mode:
authorjc_gargma <jc_gargma@iserlohn-fortress.net>2022-01-15 17:39:54 -0800
committerjc_gargma <jc_gargma@iserlohn-fortress.net>2022-01-15 17:39:54 -0800
commitf062a829b661fed17d860cb3b167dad254244a00 (patch)
tree7eb71fc923a56312e9620b4278b145c5da20b90d /custom.patch
parentFix ammo-10_ammo-order-fix.patch (diff)
downloadcataclysm-bn-f062a829b661fed17d860cb3b167dad254244a00.tar.xz
Updated to 2022-01-14-1901
Fix drone volume patch. Remove obsolete quiverfull stairs fix. Fix dialogue typos. Fix duplicate Isherwood Farm mission. Rename custom patch to actually describe the purpose. Implement faster pain recovery traits.
Diffstat (limited to 'custom.patch')
-rw-r--r--custom.patch655
1 files changed, 0 insertions, 655 deletions
diff --git a/custom.patch b/custom.patch
deleted file mode 100644
index 7ed870d..0000000
--- a/custom.patch
+++ /dev/null
@@ -1,655 +0,0 @@
---- a/src/activity_handlers.cpp
-+++ b/src/activity_handlers.cpp
-@@ -220,6 +220,7 @@
- static const species_id HUMAN( "HUMAN" );
- static const species_id ZOMBIE( "ZOMBIE" );
-
-+static const std::string trait_flag_VAMPIRE( "CANNIBAL" );
- static const std::string trait_flag_CANNIBAL( "CANNIBAL" );
- static const std::string trait_flag_PSYCHOPATH( "PSYCHOPATH" );
- static const std::string trait_flag_SAPIOVORE( "SAPIOVORE" );
-@@ -259,6 +260,8 @@
- static const std::string flag_SUPPORTS_ROOF( "SUPPORTS_ROOF" );
- static const std::string flag_TREE( "TREE" );
- static const std::string flag_USE_UPS( "USE_UPS" );
-+static const std::string flag_VAMPIRISM( "VAMPIRE" );
-+static const std::string flag_VAMPIRISM_OK( "VAMPIRISM_OK" );
-
- using namespace activity_handlers;
-
-@@ -651,7 +654,8 @@
- !corpse.in_species( ZOMBIE ) );
- if( is_human && !( u.has_trait_flag( trait_flag_CANNIBAL ) ||
- u.has_trait_flag( trait_flag_PSYCHOPATH ) ||
-- u.has_trait_flag( trait_flag_SAPIOVORE ) ) ) {
-+ u.has_trait_flag( trait_flag_SAPIOVORE ) ||
-+ u.has_trait_flag( trait_flag_VAMPIRE ) ) ) {
- need_confirm( _( "Would you dare desecrate the mortal remains of a fellow human being?" ),
- butcherable_rating::warn_cannibalism );
- }
-
---- a/src/character.cpp
-+++ b/src/character.cpp
-@@ -288,9 +288,11 @@
- static const trait_id trait_THRESH_INSECT( "THRESH_INSECT" );
- static const trait_id trait_THRESH_PLANT( "THRESH_PLANT" );
- static const trait_id trait_THRESH_SPIDER( "THRESH_SPIDER" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
- static const trait_id trait_TOUGH_FEET( "TOUGH_FEET" );
- static const trait_id trait_TRANSPIRATION( "TRANSPIRATION" );
- static const trait_id trait_URSINE_EYE( "URSINE_EYE" );
-+static const trait_id trait_VAMP_HUNGER( "VAMP_HUNGER" );
- static const trait_id trait_VISCOUS( "VISCOUS" );
- static const trait_id trait_WATERSLEEP( "WATERSLEEP" );
- static const trait_id trait_WEBBED( "WEBBED" );
-@@ -4545,6 +4547,7 @@
- const bool npc_no_food = is_npc() && get_option<bool>( "NO_NPC_FOOD" );
- const bool foodless = debug_ls || npc_no_food;
- const bool mouse = has_trait( trait_NO_THIRST );
-+ const bool vamp = has_trait( trait_VAMP_HUNGER );
- const bool mycus = has_trait( trait_M_DEPENDENT );
- const float kcal_per_time = bmr() / ( 12.0f * 24.0f );
- const int five_mins = ticks_between( from, to, 5_minutes );
-@@ -4568,7 +4571,7 @@
- }
- // Mycus and Metabolic Rehydration makes thirst unnecessary
- // since water is not limited by intake but by absorption, we can just set thirst to zero
-- if( mycus || mouse ) {
-+ if( mycus || mouse || vamp ) {
- set_thirst( 0 );
- }
- }
-@@ -4985,7 +4988,7 @@
-
- void Character::update_bodytemp( const map &m, weather_manager &weather )
- {
-- if( has_trait( trait_DEBUG_NOTEMP ) ) {
-+ if( has_trait( trait_DEBUG_NOTEMP ) || has_trait( trait_THRESH_VAMP ) ) {
- temp_cur.fill( BODYTEMP_NORM );
- temp_conv.fill( BODYTEMP_NORM );
- return;
-
---- a/src/character.h
-+++ b/src/character.h
-@@ -163,6 +163,8 @@
- allergy_weak,
- // Cannibalism (unless psycho/cannibal)
- cannibalism,
-+ // Vampirism (unless psycho/cannibal)
-+ vampirism,
- // Rotten or not rotten enough (for saprophages)
- rotten,
- // Can provoke vomiting if you already feel nauseous.
-
---- a/src/consumption.cpp
-+++ b/src/consumption.cpp
-@@ -108,6 +108,7 @@
- static const trait_id trait_THRESH_LUPINE( "THRESH_LUPINE" );
- static const trait_id trait_THRESH_PLANT( "THRESH_PLANT" );
- static const trait_id trait_THRESH_URSINE( "THRESH_URSINE" );
-+static const trait_id trait_VAMP_HUNGER( "VAMP_HUNGER" );
- static const trait_id trait_VEGETARIAN( "VEGETARIAN" );
- static const trait_id trait_WATERSLEEP( "WATERSLEEP" );
-
-@@ -114,6 +114,9 @@
- static const std::string flag_HIDDEN_HALLU( "HIDDEN_HALLU" );
-+static const std::string flag_ALLERGEN_ALCOHOL( "ALLERGEN_ALCOHOL" );
- static const std::string flag_ALLERGEN_EGG( "ALLERGEN_EGG" );
-+static const std::string flag_ALLERGEN_FOODSTUFF( "ALLERGEN_FOODSTUFF" );
- static const std::string flag_ALLERGEN_FRUIT( "ALLERGEN_FRUIT" );
-+static const std::string flag_ALLERGEN_HONEY( "ALLERGEN_HONEY" );
- static const std::string flag_ALLERGEN_JUNK( "ALLERGEN_JUNK" );
- static const std::string flag_ALLERGEN_MEAT( "ALLERGEN_MEAT" );
- static const std::string flag_ALLERGEN_MILK( "ALLERGEN_MILK" );
-@@ -143,11 +144,17 @@
- static const std::string flag_RAW( "RAW" );
- static const std::string flag_URSINE_HONEY( "URSINE_HONEY" );
- static const std::string flag_USE_EAT_VERB( "USE_EAT_VERB" );
-+static const std::string flag_VAMPIRISM( "VAMPIRISM" );
-+static const std::string flag_VAMPIRISM_OK( "VAMPIRISM_OK" );
-
- const std::vector<std::string> carnivore_blacklist {{
- flag_ALLERGEN_VEGGY, flag_ALLERGEN_FRUIT, flag_ALLERGEN_WHEAT, flag_ALLERGEN_NUT,
- }
- };
-+const std::vector<std::string> vamp_blacklist {{
-+ flag_ALLERGEN_VEGGY, flag_ALLERGEN_FRUIT, flag_ALLERGEN_WHEAT, flag_ALLERGEN_NUT, flag_ALLERGEN_MEAT, flag_ALLERGEN_EGG, flag_ALLERGEN_JUNK, flag_ALLERGEN_MILK, flag_ALLERGEN_HONEY, flag_ALLERGEN_FOODSTUFF, flag_ALLERGEN_ALCOHOL,
-+ }
-+};
- // This ugly temp array is here because otherwise it goes
- // std::vector(char*, char*)->vector(InputIterator,InputIterator) or some such
- const std::array<std::string, 2> temparray {{flag_ALLERGEN_MEAT, flag_ALLERGEN_EGG}};
-@@ -719,6 +726,12 @@
- _( "Eww. Inedible plant stuff!" ) );
- }
-
-+ if( has_trait( trait_VAMP_HUNGER ) && food.has_any_flag( vamp_blacklist ) &&
-+ !food.has_flag( flag_VAMPIRISM_OK ) ) {
-+ return ret_val<edible_rating>::make_failure( edible_rating::inedible_mutation,
-+ _( "Bleh. This isn't blood!" ) );
-+ }
-+
- if( ( has_trait( trait_HERBIVORE ) || has_trait( trait_RUMINANT ) ) &&
- food.has_any_flag( herbivore_blacklist ) ) {
- // Like non-cannibal, but more strict!
-@@ -767,6 +780,12 @@
- edible_rating::cannibalism );
- }
-
-+ if( food.has_flag( flag_VAMPIRISM ) && ( !has_trait_flag( "VAMPIRE" ) &&
-+ !has_trait_flag( "CANNIBAL" ) ) ) {
-+ add_consequence( _( "The thought of drinking human blood makes you feel sick." ),
-+ edible_rating::vampirism );
-+ }
-+
- const bool edible = comest->comesttype == comesttype_FOOD || food.has_flag( flag_USE_EAT_VERB );
-
- int food_kcal = compute_effective_nutrients( food ).kcal;
-@@ -1116,6 +1135,25 @@
- }
- }
-
-+ if( food.has_flag( flag_VAMPIRISM ) ) {
-+ const bool cannibal = has_trait( trait_CANNIBAL );
-+ const bool psycho = has_trait( trait_PSYCHOPATH );
-+ const bool sapiovore = has_trait( trait_SAPIOVORE );
-+ const bool vamp = has_trait( trait_VAMP_HUNGER );
-+ if( cannibal ) {
-+ add_msg_if_player( m_good, _( "You indulge your shameful hunger." ) );
-+ add_morale( MORALE_CANNIBAL, 20, 200 );
-+ } else if( vamp ) {
-+ add_msg_if_player( m_good, _( "You relish drinking the human blood." ) );
-+ add_morale( MORALE_VAMPIRE, 30, 300 );
-+ } else if( psycho || sapiovore ) {
-+ // Nothing - doesn't care enough to print a message
-+ } else {
-+ add_msg_if_player( m_bad, _( "You feel horrible for drinking the blood of a person." ) );
-+ add_morale( MORALE_CANNIBAL, -60, -400, 60_minutes, 30_minutes );
-+ }
-+ }
-+
- // Allergy check for food that is ingested (not gum)
- if( !food.has_flag( "NO_INGEST" ) ) {
- const auto allergy = allergy_type( food );
-@@ -1123,6 +1161,11 @@
- add_msg_if_player( m_bad, _( "Yuck! How can anybody eat this stuff?" ) );
- add_morale( allergy, -75, -400, 30_minutes, 24_minutes );
- }
-+ if( allergy != MORALE_NULL && has_trait( trait_VAMP_HUNGER ) ) {
-+ add_msg_if_player( m_bad, _( "I can't stomach anything but blood!" ) );
-+ add_morale( allergy, -75, -400, 30_minutes, 24_minutes );
-+ vomit();
-+ }
- if( food.has_flag( flag_ALLERGEN_JUNK ) ) {
- if( has_trait( trait_PROJUNK ) ) {
- add_msg_if_player( m_good, _( "Mmm, junk food." ) );
-
---- a/src/game.cpp
-+++ b/src/game.cpp
-@@ -1008,8 +1008,9 @@
- int iInfoLine = 0;
-
- if( u.has_amount( itype_holybook_bible1, 1 ) || u.has_amount( itype_holybook_bible2, 1 ) ||
-- u.has_amount( itype_holybook_bible3, 1 ) ) {
-- if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) ) ) {
-+ u.has_amount( itype_holybook_bible3, 1 ) || u.has_trait( trait_id( "THRESH_VAMP" ) ) ) {
-+ if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) ||
-+ u.has_trait( trait_id( "THRESH_VAMP" ) ) ) ) {
- vRip.emplace_back( " _______ ___" );
- vRip.emplace_back( " < `/ |" );
- vRip.emplace_back( " > _ _ (" );
-
---- a/src/item.cpp
-+++ b/src/item.cpp
-@@ -3947,6 +3947,7 @@
- case edible_rating::allergy:
- case edible_rating::allergy_weak:
- case edible_rating::cannibalism:
-+ case edible_rating::vampirism:
- ret = c_red;
- break;
- case edible_rating::rotten:
-
---- a/src/item_factory.cpp
-+++ b/src/item_factory.cpp
-@@ -2219,6 +2219,7 @@
- // First allergens:
- // An item is an allergen even if it has trace amounts of allergenic material
- std::make_pair( material_id( "hflesh" ), "CANNIBALISM" ),
-+ std::make_pair( material_id( "blood" ), "VAMPIRISM" ),
-
- std::make_pair( material_id( "hflesh" ), "ALLERGEN_MEAT" ),
- std::make_pair( material_id( "iflesh" ), "ALLERGEN_MEAT" ),
-@@ -2233,10 +2234,15 @@
- std::make_pair( material_id( "mushroom" ), "ALLERGEN_VEGGY" ),
- std::make_pair( material_id( "milk" ), "ALLERGEN_MILK" ),
- std::make_pair( material_id( "egg" ), "ALLERGEN_EGG" ),
-+ std::make_pair( material_id( "alcohol" ), "ALLERGEN_ALCOHOL" ),
-+ std::make_pair( material_id( "foodplace_foodstuff" ), "ALLERGEN_FOODSTUFF" ),
-+ std::make_pair( material_id( "honey" ), "ALLERGEN_HONEY" ),
- std::make_pair( material_id( "junk" ), "ALLERGEN_JUNK" ),
- // Not food, but we can keep it here
- std::make_pair( material_id( "wool" ), "ALLERGEN_WOOL" ),
- // Now "made of". Those flags should not be passed
-+ std::make_pair( material_id( "blood" ), "VAMPIRISM_OK" ),
-+ std::make_pair( material_id( "blood" ), "CARNIVORE_OK" ),
- std::make_pair( material_id( "flesh" ), "CARNIVORE_OK" ),
- std::make_pair( material_id( "hflesh" ), "CARNIVORE_OK" ),
- std::make_pair( material_id( "iflesh" ), "CARNIVORE_OK" ),
-
---- a/src/iteminfo_query.h
-+++ b/src/iteminfo_query.h
-@@ -36,6 +36,7 @@
- FOOD_VITAMINS,
- FOOD_VIT_EFFECTS,
- FOOD_CANNIBALISM,
-+ FOOD_VAMPIRISM,
- FOOD_TAINT,
- FOOD_POISON,
- FOOD_HALLUCINOGENIC,
-
---- a/src/map_field.cpp
-+++ b/src/map_field.cpp
-@@ -88,6 +88,7 @@
- static const trait_id trait_M_SKIN3( "M_SKIN3" );
- static const trait_id trait_THRESH_MARLOSS( "THRESH_MARLOSS" );
- static const trait_id trait_THRESH_MYCUS( "THRESH_MYCUS" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
- static const trait_id trait_WEB_WALKER( "WEB_WALKER" );
-
- void map::create_burnproducts( const tripoint &p, const item &fuel, const units::mass &burned_mass )
-@@ -1395,7 +1396,8 @@
- if( ( cur.get_field_intensity() > 1 || !one_in( 3 ) ) && ( !inside || one_in( 3 ) ) ) {
- u.add_env_effect( effect_teargas, bp_mouth, 5, 20_seconds );
- }
-- if( cur.get_field_intensity() > 1 && ( !inside || one_in( 3 ) ) ) {
-+ if( !( u.has_trait( trait_THRESH_VAMP ) ) && cur.get_field_intensity() > 1 && ( !inside ||
-+ one_in( 3 ) ) ) {
- u.add_env_effect( effect_blind, bp_eyes, cur.get_field_intensity() * 2, 10_seconds );
- }
- }
-@@ -1526,8 +1528,9 @@
- // The gas won't harm you inside a vehicle.
- if( !inside ) {
- // Full body suits protect you from the effects of the gas.
-- if( !( u.worn_with_flag( flag_GAS_PROOF ) && u.get_env_resist( bodypart_id( "mouth" ) ) >= 15 &&
-- u.get_env_resist( bodypart_id( "eyes" ) ) >= 15 ) ) {
-+ if( !( u.has_trait( trait_THRESH_VAMP ) ) && !( u.worn_with_flag( flag_GAS_PROOF ) &&
-+ u.get_env_resist( bodypart_id( "mouth" ) ) >= 15 &&
-+ u.get_env_resist( bodypart_id( "eyes" ) ) >= 15 ) ) {
- const int intensity = cur.get_field_intensity();
- bool inhaled = u.add_env_effect( effect_poison, bp_mouth, 5, intensity * 1_minutes );
- if( u.has_trait( trait_THRESH_MYCUS ) || u.has_trait( trait_THRESH_MARLOSS ) ||
-
---- a/src/memorial_logger.cpp
-+++ b/src/memorial_logger.cpp
-@@ -80,6 +80,7 @@
- static const trap_str_id tr_snake( "tr_snake" );
- static const trap_str_id tr_glass_pit( "tr_glass_pit" );
-
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
- static const trait_id trait_CANNIBAL( "CANNIBAL" );
- static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" );
- static const trait_id trait_SAPIOVORE( "SAPIOVORE" );
-@@ -486,6 +487,7 @@
- character_id ch = e.get<character_id>( "killer" );
- if( ch == g->u.getID() ) {
- std::string name = e.get<cata_variant_type::string>( "victim_name" );
-+ bool vampire = g->u.has_trait( trait_THRESH_VAMP );
- bool cannibal = g->u.has_trait( trait_CANNIBAL );
- bool psycho = g->u.has_trait( trait_PSYCHOPATH );
- if( g->u.has_trait( trait_SAPIOVORE ) ) {
-@@ -509,6 +511,10 @@
- add( pgettext( "memorial_male", "Killed an innocent, %s." ),
- pgettext( "memorial_female", "Killed an innocent, %s." ),
- name );
-+ } else if( vampire ) {
-+ add( pgettext( "memorial_male", "Killed an innocent human, %s." ),
-+ pgettext( "memorial_female", "Killed an innocent human, %s." ),
-+ name );
- } else {
- add( pgettext( "memorial_male",
- "Killed an innocent person, %s, in cold blood and "
-
---- a/src/morale_types.cpp
-+++ b/src/morale_types.cpp
-@@ -138,6 +139,7 @@
- const morale_type MORALE_CRAVING_MARLOSS( "morale_craving_marloss" );
- const morale_type MORALE_FOOD_BAD( "morale_food_bad" );
- const morale_type MORALE_CANNIBAL( "morale_cannibal" );
-+const morale_type MORALE_VAMPIRE( "morale_vampire" );
- const morale_type MORALE_VEGETARIAN( "morale_vegetarian" );
- const morale_type MORALE_MEATARIAN( "morale_meatarian" );
- const morale_type MORALE_ANTIFRUIT( "morale_antifruit" );
-
---- a/src/morale_types.h
-+++ b/src/morale_types.h
-@@ -62,6 +62,7 @@
- extern const morale_type MORALE_CRAVING_MARLOSS;
- extern const morale_type MORALE_FOOD_BAD;
- extern const morale_type MORALE_CANNIBAL;
-+extern const morale_type MORALE_VAMPIRE;
- extern const morale_type MORALE_VEGETARIAN;
- extern const morale_type MORALE_MEATARIAN;
- extern const morale_type MORALE_ANTIFRUIT;
-
---- a/src/mutation.cpp
-+++ b/src/mutation.cpp
-@@ -80,6 +80,7 @@
- static const trait_id trait_STR_ALPHA( "STR_ALPHA" );
- static const trait_id trait_THRESH_MARLOSS( "THRESH_MARLOSS" );
- static const trait_id trait_THRESH_MYCUS( "THRESH_MYCUS" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
- static const trait_id trait_TREE_COMMUNION( "TREE_COMMUNION" );
- static const trait_id trait_VOMITOUS( "VOMITOUS" );
- static const trait_id trait_WEB_WEAVER( "WEB_WEAVER" );
-@@ -887,6 +888,11 @@
- if( !mutagen ) {
- return;
- }
-+ if( has_trait( trait_THRESH_VAMP ) ) {
-+ add_msg_if_player( m_good, _( "Your Vampire blood quickly destroys the mutagenic contagion." ) );
-+ remove_effect( effect_accumulated_mutagen );
-+ return;
-+ }
- float mut_power = to_turns<float>( mutagen.get_duration() ) / to_turns<float>
- ( mutagen.get_int_dur_factor() );
- add_msg_if_player( m_debug, "Mutation accumulation: %.1f", mut_power );
-@@ -926,6 +932,10 @@
- {
- bool force_bad = one_in( 3 );
- bool force_good = false;
-+ if( has_trait( trait_THRESH_VAMP ) ) {
-+ add_msg_if_player( m_good, _( "Your Vampire blood quickly destroys the mutagenic contagion." ) );
-+ return;
-+ }
- if( has_trait( trait_ROBUST ) && force_bad ) {
- // Robust Genetics gives you a 33% chance for a good mutation,
- // instead of the 33% chance of a bad one.
-
---- a/src/npc.cpp
-+++ b/src/npc.cpp
-@@ -116,6 +116,7 @@
- static const trait_id trait_SAPIOVORE( "SAPIOVORE" );
- static const trait_id trait_SCHIZOPHRENIC( "SCHIZOPHRENIC" );
- static const trait_id trait_TERRIFYING( "TERRIFYING" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
-
- static const std::string flag_NPC_SAFE( "NPC_SAFE" );
-
-@@ -2486,12 +2487,15 @@
- }
-
- if( killer == &g->u && ( !guaranteed_hostile() || hit_by_player ) ) {
-+ bool vampire = g->u.has_trait( trait_THRESH_VAMP );
- bool cannibal = g->u.has_trait( trait_CANNIBAL );
- bool psycho = g->u.has_trait( trait_PSYCHOPATH );
- if( g->u.has_trait( trait_SAPIOVORE ) || psycho ) {
- // No morale effect
- } else if( cannibal ) {
- g->u.add_morale( MORALE_KILLED_INNOCENT, -5, 0, 2_days, 3_hours );
-+ } else if( vampire ) {
-+ g->u.add_morale( MORALE_KILLED_INNOCENT, -5, 0, 2_days, 3_hours );
- } else {
- g->u.add_morale( MORALE_KILLED_INNOCENT, -100, 0, 2_days, 3_hours );
- }
-
---- a/src/player_hardcoded_effects.cpp
-+++ b/src/player_hardcoded_effects.cpp
-@@ -114,7 +114,9 @@
- static const trait_id trait_NOPAIN( "NOPAIN" );
- static const trait_id trait_SEESLEEP( "SEESLEEP" );
- static const trait_id trait_SCHIZOPHRENIC( "SCHIZOPHRENIC" );
-+static const trait_id trait_THRESH_GYNOID( "THRESH_GYNOID" );
- static const trait_id trait_THRESH_MYCUS( "THRESH_MYCUS" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
- static const trait_id trait_WATERSLEEP( "WATERSLEEP" );
-
- static void eff_fun_onfire( player &u, effect &it )
-@@ -1095,6 +1097,11 @@
- // Determine the strength of effects or dreams based upon category strength
- int strength = 0; // Category too weak for any effect or dream
- if( crossed_threshold() ) {
-+ if( has_trait( trait_THRESH_VAMP ) ) {
-+ highcat = "VAMP";
-+ } else if( has_trait( trait_THRESH_GYNOID ) ) {
-+ highcat = "GYNOID";
-+ }
- strength = 4; // Post-human.
- } else if( highest >= 20 && highest < 35 ) {
- strength = 1; // Low strength
-
---- a/src/suffer.cpp
-+++ b/src/suffer.cpp
-@@ -143,10 +143,13 @@
- static const trait_id trait_SHOUT3( "SHOUT3" );
- static const trait_id trait_SORES( "SORES" );
- static const trait_id trait_SUNBURN( "SUNBURN" );
-+static const trait_id trait_THRESH_GYNOID( "THRESH_GYNOID" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
- static const trait_id trait_TROGLO( "TROGLO" );
- static const trait_id trait_TROGLO2( "TROGLO2" );
- static const trait_id trait_TROGLO3( "TROGLO3" );
- static const trait_id trait_UNSTABLE( "UNSTABLE" );
-+static const trait_id trait_VAMP_CURSE( "VAMP_CURSE" );
- static const trait_id trait_VOMITOUS( "VOMITOUS" );
- static const trait_id trait_WEB_SPINNER( "WEB_SPINNER" );
- static const trait_id trait_WEB_WEAVER( "WEB_WEAVER" );
-@@ -243,7 +246,8 @@
-
- void Character::suffer_while_underwater()
- {
-- if( !has_trait( trait_GILLS ) && !has_trait( trait_GILLS_CEPH ) ) {
-+ if( !has_trait( trait_GILLS ) && !has_trait( trait_GILLS_CEPH ) &&
-+ !has_trait( trait_THRESH_GYNOID ) && !has_trait( trait_THRESH_VAMP ) ) {
- oxygen--;
- }
- if( oxygen < 12 && worn_with_flag( "REBREATHER" ) ) {
-@@ -742,7 +746,8 @@
- return;
- }
-
-- if( has_trait( trait_ALBINO ) || has_effect( effect_datura ) || has_trait( trait_SUNBURN ) ) {
-+ if( has_trait( trait_ALBINO ) || has_effect( effect_datura ) || has_trait( trait_SUNBURN ) ||
-+ has_trait( trait_VAMP_CURSE ) ) {
- suffer_from_sunburn();
- }
-
-@@ -768,6 +773,13 @@
- mod_int_bonus( -4 );
- mod_per_bonus( -4 );
- }
-+ if( has_trait( trait_VAMP_CURSE ) ) {
-+ mod_str_bonus( -4 );
-+ mod_dex_bonus( -4 );
-+ add_miss_reason( _( "You can't tolerate the sunlight!" ), 4 );
-+ mod_int_bonus( -4 );
-+ mod_per_bonus( -4 );
-+ }
- }
-
- std::map<bodypart_id, float> Character::bodypart_exposure()
-@@ -799,7 +811,8 @@
-
- void Character::suffer_from_sunburn()
- {
-- if( !has_trait( trait_ALBINO ) && !has_effect( effect_datura ) && !has_trait( trait_SUNBURN ) ) {
-+ if( !has_trait( trait_ALBINO ) && !has_effect( effect_datura ) && !has_trait( trait_SUNBURN ) &&
-+ !has_trait( trait_VAMP_CURSE ) ) {
- return;
- }
-
-@@ -816,6 +829,12 @@
- return;
- }
- sunlight_effect = _( "The sunlight burns" );
-+ } else if( has_trait( trait_VAMP_CURSE ) ) {
-+ // Sunburn effects occur about 10 times per minute
-+ if( !one_turn_in( 6_seconds ) ) {
-+ return;
-+ }
-+ sunlight_effect = _( "The sunlight sears" );
- }
-
- // Sunglasses can keep the sun off the eyes.
-@@ -893,7 +912,7 @@
- }
-
- // Solar Sensitivity (SUNBURN) trait causes injury to exposed parts
-- if( has_trait( trait_SUNBURN ) ) {
-+ if( has_trait( trait_SUNBURN ) || has_trait( trait_VAMP_CURSE ) ) {
- mod_pain( 1 );
- // Check exposure of all body parts
- for( const std::pair<const bodypart_id, float> &bp_exp : bp_exposure ) {
-
---- a/data/json/field_type.json
-+++ b/data/json/field_type.json
-@@ -303,7 +303,7 @@
- "dirty_transparency_cache": true,
- "percent_spread": 10,
- "outdoor_age_speedup": "0 turns",
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 7 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 7 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "2 minutes",
- "phase": "gas",
-@@ -389,7 +389,7 @@
- "outdoor_age_speedup": "3 minutes",
- "dirty_transparency_cache": true,
- "has_fume": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "10 minutes",
- "phase": "gas",
-@@ -418,7 +418,7 @@
- "outdoor_age_speedup": "0 turns",
- "dirty_transparency_cache": true,
- "has_fume": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ], [ "eyes", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "5 minutes",
- "phase": "gas",
-@@ -464,7 +464,7 @@
- "wandering_field": "fd_toxic_gas",
- "gas_absorption_factor": 15,
- "dirty_transparency_cache": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "phase": "gas",
- "display_items": false,
- "display_field": true,
-@@ -956,7 +956,7 @@
- "outdoor_age_speedup": "5 minutes",
- "dirty_transparency_cache": true,
- "has_fume": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "50 minutes",
- "phase": "gas",
-@@ -978,7 +978,7 @@
- "outdoor_age_speedup": "1 minutes",
- "dirty_transparency_cache": true,
- "has_fume": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "15 minutes",
- "phase": "gas",
-@@ -1233,7 +1233,7 @@
- "outdoor_age_speedup": "3 minutes",
- "dirty_transparency_cache": true,
- "has_fume": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "10 minutes",
- "phase": "gas"
-@@ -1253,7 +1253,7 @@
- "outdoor_age_speedup": "1 minutes",
- "dirty_transparency_cache": true,
- "has_fume": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "30 minutes",
- "phase": "gas",
-@@ -1275,7 +1275,7 @@
- "outdoor_age_speedup": "1 minutes",
- "dirty_transparency_cache": true,
- "has_fume": true,
-- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
-+ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "THRESH_VAMP" ] },
- "priority": 8,
- "half_life": "30 minutes",
- "phase": "gas",
-
---- a/data/json/flags.json
-+++ b/data/json/flags.json
-@@ -1093,6 +1093,21 @@
- "context": [ "COMESTIBLE" ]
- },
- {
-+ "id": "ALLERGEN_HONEY",
-+ "type": "json_flag",
-+ "context": [ "COMESTIBLE" ]
-+ },
-+ {
-+ "id": "ALLERGEN_ALCOHOL",
-+ "type": "json_flag",
-+ "context": [ "COMESTIBLE" ]
-+ },
-+ {
-+ "id": "ALLERGEN_FOODSTUFF",
-+ "type": "json_flag",
-+ "context": [ "COMESTIBLE" ]
-+ },
-+ {
- "id": "ALLERGEN_JUNK",
- "type": "json_flag",
- "context": [ "COMESTIBLE" ]
-@@ -1173,6 +1173,16 @@
- "context": [ ]
- },
- {
-+ "id": "VAMPIRISM",
-+ "type": "json_flag",
-+ "context": [ ]
-+ },
-+ {
-+ "id": "VAMPIRISM_OK",
-+ "type": "json_flag",
-+ "context": [ ]
-+ },
-+ {
- "id": "CASING",
- "type": "json_flag",
- "context": [ ]
-
---- a/data/json/morale_types.json
-+++ b/data/json/morale_types.json
-@@ -125,6 +125,11 @@
- "text": "Ate Human Flesh"
- },
- {
-+ "id": "morale_vampire",
-+ "type": "morale_type",
-+ "text": "Drank Human Blood"
-+ },
-+ {
- "id": "morale_vegetarian",
- "type": "morale_type",
- "text": "Ate Meat"
-
---- a/data/json/mutations/mutation_ordering.json
-+++ b/data/json/mutations/mutation_ordering.json
-@@ -73,6 +73,7 @@
- "TROGLO2",
- "TROGLO3",
- "URSINE_FUR",
-+ "VAMP_SKIN",
- "VISCOUS"
- ],
- "order": 1500