diff options
38 files changed, 930 insertions, 1647 deletions
diff --git a/0.F_backport-inhaler-mission-no-autofail.patch b/0.F_backport-inhaler-mission-no-autofail.patch deleted file mode 100644 index 32983d7..0000000 --- a/0.F_backport-inhaler-mission-no-autofail.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/src/mission.cpp -+++ b/src/mission.cpp -@@ -230,6 +230,9 @@ - } else if( type->goal == MGOAL_KILL_MONSTER_SPEC ) { - kill_count_to_reach = kills.kill_count( monster_species ) + monster_kill_goal; - } -+ if( type->deadline_low != 0_turns || type->deadline_high != 0_turns ) { -+ deadline = calendar::turn + rng( type->deadline_low, type->deadline_high ); -+ } - type->start( this ); - status = mission_status::in_progress; - } diff --git a/0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch b/0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch deleted file mode 100644 index 8eac7f0..0000000 --- a/0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- a/data/json/recipes/basecamps/recipe_modular_firestation1.json -+++ b/data/json/recipes/basecamps/recipe_modular_firestation1.json -@@ -50,7 +50,13 @@ - "construction_blueprint": "fbmc_firestation1_well", - "blueprint_name": "build a well", - "blueprint_requires": [ { "id": "fbmc_firestation1_0" } ], -- "blueprint_provides": [ { "id": "fbmc_firestation1_well" }, { "id": "relaying" }, { "id": "scouting" }, { "id": "patrolling" } ], -+ "blueprint_provides": [ -+ { "id": "fbmc_firestation1_well" }, -+ { "id": "water_well" }, -+ { "id": "relaying" }, -+ { "id": "scouting" }, -+ { "id": "patrolling" } -+ ], - "blueprint_excludes": [ { "id": "fbmc_firestation1_well" } ], - "blueprint_needs": { - "time": "11 h", ---- a/data/json/recipes/basecamps/recipe_modular_shelter_1/recipe_modular_shelter_1_common.json -+++ b/data/json/recipes/basecamps/recipe_modular_shelter_1/recipe_modular_shelter_1_common.json -@@ -136,7 +136,13 @@ - "construction_blueprint": "fbmc_shelter_1_well", - "blueprint_name": "build a well", - "blueprint_requires": [ { "id": "fbmc_shelter_1_fire" } ], -- "blueprint_provides": [ { "id": "fbmc_shelter_1_well" }, { "id": "relaying" }, { "id": "scouting" }, { "id": "patrolling" } ], -+ "blueprint_provides": [ -+ { "id": "fbmc_shelter_1_well" }, -+ { "id": "water_well" }, -+ { "id": "relaying" }, -+ { "id": "scouting" }, -+ { "id": "patrolling" } -+ ], - "blueprint_excludes": [ { "id": "fbmc_shelter_1_well" } ], - "blueprint_needs": { - "time": "11 h", ---- a/data/json/recipes/basecamps/recipe_modular_shelter/recipe_modular_shelter_common.json -+++ b/data/json/recipes/basecamps/recipe_modular_shelter/recipe_modular_shelter_common.json -@@ -136,7 +136,13 @@ - "construction_blueprint": "fbmc_shelter_well", - "blueprint_name": "build a well", - "blueprint_requires": [ { "id": "fbmc_shelter_fire" } ], -- "blueprint_provides": [ { "id": "fbmc_shelter_well" }, { "id": "relaying" }, { "id": "scouting" }, { "id": "patrolling" } ], -+ "blueprint_provides": [ -+ { "id": "fbmc_shelter_well" }, -+ { "id": "water_well" }, -+ { "id": "relaying" }, -+ { "id": "scouting" }, -+ { "id": "patrolling" } -+ ], - "blueprint_excludes": [ { "id": "fbmc_shelter_well" } ], - "blueprint_needs": { - "time": "11 h", diff --git a/0.F_backport-radio-can-use-ups.patch b/0.F_backport-radio-can-use-ups.patch deleted file mode 100644 index ee146e5..0000000 --- a/0.F_backport-radio-can-use-ups.patch +++ /dev/null @@ -1,55 +0,0 @@ ---- a/src/iuse.cpp -+++ b/src/iuse.cpp -@@ -289,6 +289,7 @@ - static const std::string flag_HEATS_FOOD( "HEATS_FOOD" ); - static const std::string flag_PLANT( "PLANT" ); - static const std::string flag_PLOWABLE( "PLOWABLE" ); -+static const std::string flag_USE_UPS( "USE_UPS" ); - - // how many characters per turn of radio - static constexpr int RADIO_PER_TURN = 25; -@@ -2162,7 +2163,8 @@ - } - } else { // Activated - int ch = 1; -- if( it->ammo_remaining() > 0 ) { -+ if( it->ammo_remaining() > 0 || ( it->has_flag( flag_USE_UPS ) && -+ p->has_enough_charges( *it, false ) ) ) { - ch = uilist( _( "Radio:" ), { - _( "Scan" ), _( "Turn off" ) - } ); -@@ -4082,7 +4084,8 @@ - if( t ) { // Effects while simply on - - } else { -- if( !it->units_sufficient( *p ) ) { -+ if( !it->units_sufficient( *p ) || !( it->has_flag( flag_USE_UPS ) && -+ p->has_enough_charges( *it, false ) ) ) { - p->add_msg_if_player( m_info, _( "Your tactical tonfa is out of power." ) ); - it->convert( "shocktonfa_off" ).active = false; - } else { -@@ -4107,7 +4110,8 @@ - int iuse::mp3( player *p, item *it, bool, const tripoint & ) - { - // TODO: avoid item id hardcoding to make this function usable for pure json-defined devices. -- if( !it->units_sufficient( *p ) ) { -+ if( !it->units_sufficient( *p ) || !( it->has_flag( flag_USE_UPS ) && -+ p->has_enough_charges( *it, false ) ) ) { - p->add_msg_if_player( m_info, _( "The device's batteries are dead." ) ); - } else if( p->has_active_item( "mp3_on" ) || p->has_active_item( "smartphone_music" ) || - p->has_active_item( "afs_atomic_smartphone_music" ) || -@@ -6367,9 +6371,12 @@ - int iuse::einktabletpc( player *p, item *it, bool t, const tripoint &pos ) - { - if( t ) { -- if( !it->get_var( "EIPC_MUSIC_ON" ).empty() && ( it->ammo_remaining() > 0 ) ) { -+ if( !it->get_var( "EIPC_MUSIC_ON" ).empty() && -+ ( it->ammo_remaining() > 0 || ( it->has_flag( flag_USE_UPS ) && -+ p->has_enough_charges( *it, false ) ) ) ) { - if( calendar::once_every( 5_minutes ) ) { -- it->ammo_consume( 1, p->pos() ); -+ //it->ammo_consume( 1, p->pos() ); -+ p->consume_charges( *it, 1 ); - } - - //the more varied music, the better max mood. diff --git a/0.F_backport-tacoma-barn-door-position.patch b/0.F_backport-tacoma-barn-door-position.patch deleted file mode 100644 index d5f5642..0000000 --- a/0.F_backport-tacoma-barn-door-position.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json -+++ b/data/json/npcs/tacoma_ranch/NPC_ranch_foreman.json -@@ -122,7 +122,7 @@ - "place_nested": [ { "chunks": [ "tacoma_commune_west_wall_door" ], "x": 22, "y": 0 } ] - }, - { -- "om_terrain": "ranch_camp_66", -+ "om_terrain": "ranch_camp_75", - "translate_ter": [ { "from": "t_underbrush", "to": "t_dirt", "x": 0, "y": 0 } ], - "place_nested": [ - { "chunks": [ "tacoma_commune_east_wall_door" ], "x": 0, "y": 0 }, diff --git a/0001-quiverfull-house-correct-stairs.patch b/0001-quiverfull-house-correct-stairs.patch deleted file mode 100644 index ad40706..0000000 --- a/0001-quiverfull-house-correct-stairs.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/data/json/mapgen/house/house_quiverfull.json -+++ b/data/json/mapgen/house/house_quiverfull.json -@@ -29,7 +29,7 @@ - "%or E|R y| h F#.", - "%# + + O#.", - ".# |||R R|J 5o.", -- ".#HHsHH|< R|n 4o.", -+ ".#HHsHH|> R|n 4o.", - ".#|||||| |R R|JJ 123#.", - ".#q+ ||||+|||#.", - ".#q+ + d#.", diff --git a/0002-ankle-ammo-pouch-is-not-a-backpack.patch b/0002-ankle-ammo-pouch-is-not-a-backpack.patch deleted file mode 100644 index ca51551..0000000 --- a/0002-ankle-ammo-pouch-is-not-a-backpack.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/data/json/items/armor/ammo_pouch.json -+++ b/data/json/items/armor/ammo_pouch.json -@@ -192,7 +192,7 @@ - "price_postapoc": 4500, - "material": "cotton", - "symbol": "[", -- "looks_like": "ragpouch", -+ "looks_like": "bootstrap", - "color": "dark_gray", - "covers": [ "FOOT_EITHER" ], - "coverage": 5, diff --git a/0003-inconsistent-ammo-names.patch b/0003-inconsistent-ammo-names.patch deleted file mode 100644 index 61d17ac..0000000 --- a/0003-inconsistent-ammo-names.patch +++ /dev/null @@ -1,193 +0,0 @@ ---- a/data/json/items/ammo/223.json -+++ b/data/json/items/ammo/223.json -@@ -39,7 +39,7 @@ - "id": "556_incendiary", - "copy-from": "556", - "type": "AMMO", -- "name": { "str": "5.56 NATO tracer" }, -+ "name": { "str": "5.56 NATO M856 tracer" }, - "description": "This ammunition is a one-in-five mix of M855A1 and M856 tracer rounds to help keep the weapon they are fired from on target.", - "extend": { "effects": [ "INCENDIARY" ] } - }, -@@ -61,7 +61,7 @@ - "id": "bp_556", - "copy-from": "556", - "type": "AMMO", -- "name": { "str": "5.56 NATO, black powder" }, -+ "name": { "str": "5.56 NATO M855A1, black powder" }, - "proportional": { - "price": 0.3, - "damage": { "damage_type": "stab", "amount": 0.57, "armor_penetration": 0.5 }, -@@ -75,7 +75,7 @@ - "id": "bp_556_incendiary", - "copy-from": "556_incendiary", - "type": "AMMO", -- "name": { "str": "5.56 NATO tracer, black powder" }, -+ "name": { "str": "5.56 NATO M856 tracer, black powder" }, - "proportional": { - "price": 0.3, - "damage": { "damage_type": "stab", "amount": 0.57, "armor_penetration": 0.5 }, -@@ -98,7 +98,7 @@ - "id": "reloaded_556", - "copy-from": "556", - "type": "AMMO", -- "name": { "str": "5.56 NATO, reloaded" }, -+ "name": { "str": "5.56 NATO M885A1, reloaded" }, - "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } -@@ -107,7 +107,7 @@ - "id": "reloaded_556_incendiary", - "copy-from": "556_incendiary", - "type": "AMMO", -- "name": { "str": "5.56 NATO tracer, reloaded" }, -+ "name": { "str": "5.56 NATO M856 tracer, reloaded" }, - "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } ---- a/data/json/items/ammo/300blk.json -+++ b/data/json/items/ammo/300blk.json -@@ -26,7 +26,7 @@ - "id": "300blk_ss", - "copy-from": "300blk", - "type": "AMMO", -- "name": { "str": ".300 AAC Blackout" }, -+ "name": { "str": ".300 AAC Blackout SS" }, - "description": "A subsonic .300 AAC Blackout round with a 220gr open tip match bullet. 300 BLK is an intermediate cartridge necked up from 5.56x45mm, designed to achieve similar ballistics to 7.62x39mm. It is compatible with standard AR-15 lower receivers and will feed from STANAG magazines.", - "weight": "21 g", - "range": 40, ---- a/data/json/items/ammo/308.json -+++ b/data/json/items/ammo/308.json -@@ -26,7 +26,7 @@ - "id": "762_51", - "copy-from": "308", - "type": "AMMO", -- "name": { "str": "7.62x51mm M80" }, -+ "name": { "str": "7.62x51mm NATO M80" }, - "casing": "762_51_casing", - "description": "A 7.62x51mm NATO round with a 147gr FMJ bullet. It is a powerful rifle cartridge commonly used by hunters and military snipers because of its high accuracy and long range.", - "relative": { "damage": { "damage_type": "stab", "amount": -2, "armor_penetration": 4 }, "dispersion": -10 }, -@@ -37,7 +37,7 @@ - "id": "762_51_incendiary", - "copy-from": "762_51", - "type": "AMMO", -- "name": { "str": "7.62x51mm NATO tracer" }, -+ "name": { "str": "7.62x51mm NATO M62 tracer" }, - "description": "This ammunition is a one-in-five mix of M80 and M62 tracer rounds to help keep the weapon they are fired from on target.", - "extend": { "effects": [ "INCENDIARY" ] } - }, -@@ -59,7 +59,7 @@ - "id": "bp_762_51", - "copy-from": "762_51", - "type": "AMMO", -- "name": { "str": "7.62x51mm, black powder" }, -+ "name": { "str": "7.62x51mm NATO M80, black powder" }, - "proportional": { - "price": 0.3, - "damage": { "damage_type": "stab", "amount": 0.76, "armor_penetration": 0.5 }, -@@ -73,7 +73,7 @@ - "id": "bp_762_51_incendiary", - "copy-from": "762_51_incendiary", - "type": "AMMO", -- "name": { "str": "7.62x51mm tracer, black powder" }, -+ "name": { "str": "7.62x51mm NATO M62 tracer, black powder" }, - "proportional": { - "price": 0.3, - "damage": { "damage_type": "stab", "amount": 0.76, "armor_penetration": 0.5 }, -@@ -96,7 +96,7 @@ - "id": "reloaded_762_51", - "copy-from": "762_51", - "type": "AMMO", -- "name": { "str": "7.62x51mm, reloaded" }, -+ "name": { "str": "7.62x51mm NATO M80, reloaded" }, - "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } -@@ -105,7 +105,7 @@ - "id": "reloaded_762_51_incendiary", - "copy-from": "762_51_incendiary", - "type": "AMMO", -- "name": { "str": "7.62x51mm incendiary, reloaded" }, -+ "name": { "str": "7.62x51mm NATO M62 tracer, reloaded" }, - "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } ---- a/data/json/items/ammo/357mag.json -+++ b/data/json/items/ammo/357mag.json -@@ -2,8 +2,8 @@ - { - "id": "357mag_fmj", - "type": "AMMO", -- "name": { "str": ".357 magnum FMJ" }, -- "description": "Jacketed .357 magnum ammunition. The .357 magnum round is derived from the earlier .38 special, with a marginally longer case and generating greater pressure.", -+ "name": { "str": ".357 Magnum FMJ" }, -+ "description": "Jacketed .357 Magnum ammunition. The .357 Magnum round is derived from the earlier .38 special, with a marginally longer case and generating greater pressure.", - "weight": "8 g", - "volume": "250 ml", - "price": 140, -@@ -27,8 +27,8 @@ - "id": "357mag_jhp", - "copy-from": "357mag_fmj", - "type": "AMMO", -- "name": { "str": ".357 magnum JHP" }, -- "description": "Jacketed hollow point .357 magnum ammunition. The .357 magnum round is derived from the earlier .38 special, with a marginally longer case and generating greater pressure.", -+ "name": { "str": ".357 Magnum JHP" }, -+ "description": "Jacketed hollow point .357 Magnum ammunition. The .357 Magnum round is derived from the earlier .38 special, with a marginally longer case and generating greater pressure.", - "damage": { "damage_type": "stab", "amount": 42, "armor_penetration": 0 } - }, - { ---- a/data/json/items/ammo/45.json -+++ b/data/json/items/ammo/45.json -@@ -76,7 +76,7 @@ - "id": "reloaded_45_acp", - "copy-from": "45_acp", - "type": "AMMO", -- "name": { "str": ".45 FMJ, reloaded" }, -+ "name": { "str": ".45 ACP FMJ, reloaded" }, - "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, - "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] } ---- a/data/json/items/ammo/50.json -+++ b/data/json/items/ammo/50.json -@@ -70,7 +70,7 @@ - "id": "reloaded_50_incendiary", - "copy-from": "50_incendiary", - "type": "AMMO", -- "name": { "str": ".50 BMG tracer, reloaded" }, -+ "name": { "str": ".50 BMG M17 tracer, reloaded" }, - "description": "A tracer variant of the powerful .50 BMG round. Tracer rounds help to keep the weapon they are fired from on target at the risk of igniting flammable substances. This one has been hand-reloaded.", - "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, -@@ -90,7 +90,7 @@ - "id": "reloaded_50ss", - "copy-from": "50ss", - "type": "AMMO", -- "name": { "str": ".50 BMG AP, reloaded" }, -+ "name": { "str": ".50 BMG M2 AP, reloaded" }, - "description": "Variant of the .50 BMG round that uses a core hardened steel. Penetration is increased, but damage is reduced. This one has been hand-reloaded.", - "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9 }, "dispersion": 1.1 }, - "extend": { "effects": [ "RECYCLED" ] }, ---- a/data/json/items/ammo/5x50.json -+++ b/data/json/items/ammo/5x50.json -@@ -38,7 +38,7 @@ - "id": "reloaded_5x50dart", - "copy-from": "5x50dart", - "type": "AMMO", -- "name": { "str": "5x50mm flechette, reloaded" }, -+ "name": { "str": "RA110 5x50mm flechette, reloaded" }, - "price_postapoc": 1200, - "description": "Designed to defeat modern body armor, the Rivtech 5x50mm flechette round features a biodegradable sabot and a single, fin-stabilized penetrator. This one has been hand-reloaded.", - "effects": [ "COOKOFF", "RECYCLED" ], ---- a/data/json/items/ammo/762x25.json -+++ b/data/json/items/ammo/762x25.json -@@ -68,7 +68,8 @@ - "id": "reloaded_762_25", - "copy-from": "762_25hot", - "type": "AMMO", -- "name": { "str": "7.62x25mm, reloaded" }, -- "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9, "armor_penetration": 0.9 }, "dispersion": 1.1 } -+ "name": { "str": "7.62x25mm FMJ, reloaded" }, -+ "proportional": { "price": 0.7, "damage": { "damage_type": "stab", "amount": 0.9, "armor_penetration": 0.9 }, "dispersion": 1.1 }, -+ "extend": { "effects": [ "RECYCLED" ] } - } - ] diff --git a/0004-tacoma-clinic-add-missing-floor.patch b/0004-tacoma-clinic-add-missing-floor.patch deleted file mode 100644 index 9accf88..0000000 --- a/0004-tacoma-clinic-add-missing-floor.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json -+++ b/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json -@@ -543,7 +543,7 @@ - "[......wwwwwww.....[", - "w......w.....w.....w", - "w..............tt..w", -- "[..... w.....w.....[", -+ "[......w.....w.....[", - "w......wwwwwww.....w", - "www++www wwwwwww", - " ", diff --git a/0005-lumbermill-gasoline-not-spilled.patch b/0005-lumbermill-gasoline-not-spilled.patch deleted file mode 100644 index 05e63ac..0000000 --- a/0005-lumbermill-gasoline-not-spilled.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/data/json/mapgen/lumbermill.json -+++ b/data/json/mapgen/lumbermill.json -@@ -51,7 +51,7 @@ - "v 2 __________________________________", - "v vvvvv *___________________________1 1 ____", - "v vooov______________________ ____ 121 1 v", -- "v voGoV_____________ #.......# ____ 1 1*1 1 1 v", -+ "v voooV_____________ #.......# ____ 1 1*1 1 1 v", - "v vooov_________ #L.....L#* ____* 1 1 1 2 v", - "v vvvvv ______ * *wL.....Lw ____1 1 1 1 *v", - "v 1____ 2 #L.....L# * ____1 1* 1 v", diff --git a/0006-community-garden-fertilizer-not-spilled.patch b/0006-community-garden-fertilizer-not-spilled.patch deleted file mode 100644 index dfc3d29..0000000 --- a/0006-community-garden-fertilizer-not-spilled.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/data/json/mapgen/garden_community.json -+++ b/data/json/mapgen/garden_community.json -@@ -141,10 +141,10 @@ - "|": "f_null" - }, - "place_liquids": [ -- { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 4, "y": 4 }, -- { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 4, "y": 5 }, -- { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 5, "y": 4 }, -- { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 5, "y": 5 } -+ { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 9, "y": 9 }, -+ { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 10, "y": 9 }, -+ { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 9, "y": 10 }, -+ { "liquid": "fertilizer_liquid", "chance": 1, "amount": [ 2, 3 ], "x": 10, "y": 10 } - ], - "items": { "D": { "item": "hydro", "chance": 15 }, "#": { "item": "hydro", "chance": 15 } }, - "place_items": [ diff --git a/0007-oxyacetylene-from-oxygen.patch b/0007-oxyacetylene-from-oxygen.patch deleted file mode 100644 index 8da7688..0000000 --- a/0007-oxyacetylene-from-oxygen.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/data/json/recipes/ammo/weldgas.json -+++ b/data/json/recipes/ammo/weldgas.json -@@ -7,8 +8,9 @@ - "charges": 120, - "book_learn": [ [ "textbook_chemistry", 4 ], [ "textbook_gaswarfare", 5 ], [ "atomic_survival", 3 ] ], - "qualities": [ { "id": "PRESSURIZATION", "level": 1 } ], -+ "tools": [ [ [ "oxygen_tank", 24 ], [ "oxygen_cylinder", 24 ], [ "smoxygen_tank", 24 ] ] ], -- "components": [ [ [ "oxygen", 24 ] ], [ [ "acetylene", 96 ] ] ] -+ "components": [ [ [ "acetylene", 96 ] ] ] - }, - { - "result": "acetylene", diff --git a/0008-npc-can-use-more-bionics.patch b/0008-npc-can-use-more-bionics.patch deleted file mode 100644 index d140ab1..0000000 --- a/0008-npc-can-use-more-bionics.patch +++ /dev/null @@ -1,48 +0,0 @@ ---- a/data/json/bionics.json -+++ b/data/json/bionics.json -@@ -338,7 +338,7 @@ - "name": { "str": "Enhanced Hearing" }, - "description": "When this bionic is active, your hearing will be drastically improved, allowing you to hear ten times better than the average person. Additionally, high-intensity sounds will be automatically dampened before they can damage your hearing.", - "occupied_bodyparts": [ [ "head", 3 ] ], -- "flags": [ "BIONIC_TOGGLED" ], -+ "flags": [ "BIONIC_TOGGLED", "BIONIC_NPC_USABLE" ], - "included_bionics": [ "bio_earplugs" ] - }, - { -@@ -1200,6 +1200,6 @@ - "name": { "str": "Soporific Induction" }, - "description": "An electrode has been implanted into your brain's ventrolateral preoptic nucleus. It turns on whenever you're trying to fall asleep, creating an artificial but effective sensation of fatigue.", - "occupied_bodyparts": [ [ "head", 1 ] ], -- "flags": [ "BIONIC_TOGGLED" ] -+ "flags": [ "BIONIC_TOGGLED", "BIONIC_NPC_USABLE" ] - } - ] ---- a/data/json/items/bionics.json -+++ b/data/json/items/bionics.json -@@ -268,7 +268,7 @@ - }, - { - "id": "bio_ears", -- "copy-from": "bionic_general", -+ "copy-from": "bionic_general_npc_usable", - "type": "BIONIC_ITEM", - "name": { "str": "Enhanced Hearing CBM" }, - "looks_like": "bio_int_enhancer", -@@ -743,7 +743,7 @@ - }, - { - "id": "bio_fuel_cell_gasoline", -- "copy-from": "bionic_general", -+ "copy-from": "bionic_general_npc_usable", - "type": "BIONIC_ITEM", - "name": { "str": "Gasoline Fuel Cell CBM" }, - "looks_like": "bio_int_enhancer", -@@ -841,7 +841,7 @@ - }, - { - "id": "bio_surgical_razor", -- "copy-from": "bionic_general", -+ "copy-from": "bionic_general_npc_usable", - "type": "BIONIC_ITEM", - "name": { "str": "Autonomous Surgical Scalpels CBM" }, - "looks_like": "bio_int_enhancer", diff --git a/0009-22-casings-can-stack.patch b/0009-22-casings-can-stack.patch deleted file mode 100644 index e52b8bb..0000000 --- a/0009-22-casings-can-stack.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/data/json/items/generic/casing.json -+++ b/data/json/items/generic/casins.json -@@ -31,13 +31,11 @@ - }, - { - "id": "22_casing_new", -+ "copy-from": "casing", - "type": "GENERIC", -- "category": "spare_parts", - "price": 100, - "price_postapoc": 0, - "name": { "str": "unused .22 casing" }, -- "symbol": "=", -- "color": "yellow", - "description": "An unfired, like-new .22 round casing, with the primer still intact.", - "material": [ "powder", "brass" ], - "volume": "3 ml", diff --git a/0010-4570-dragon-can-be-dismantled.patch b/0010-4570-dragon-can-be-dismantled.patch deleted file mode 100644 index 2db6e2a..0000000 --- a/0010-4570-dragon-can-be-dismantled.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- a/data/json/recipes/ammo/rifle.json -+++ b/data/json/recipes/ammo/rifle.json -@@ -385,6 +385,7 @@ - "batch_time_factors": [ 60, 5 ], - "book_learn": [ [ "recipe_bullets", 2 ], [ "mag_rifle", 4 ] ], - "charges": 1, -+ "reversible": true, - "using": [ [ "bullet_forming", 15 ], [ "ammo_bullet", 8 ] ], - "components": [ - [ [ "4570_casing", 1 ] ], -@@ -406,6 +407,7 @@ - "batch_time_factors": [ 60, 5 ], - "book_learn": [ [ "recipe_bullets", 2 ], [ "mag_rifle", 4 ] ], - "charges": 1, -+ "reversible": true, - "using": [ [ "bullet_forming", 15 ], [ "ammo_bullet", 8 ] ], - "components": [ - [ [ "4570_casing", 1 ] ], -@@ -426,6 +428,7 @@ - "batch_time_factors": [ 60, 5 ], - "book_learn": [ [ "recipe_bullets", 2 ], [ "mag_rifle", 4 ] ], - "charges": 1, -+ "reversible": true, - "using": [ [ "bullet_forming", 15 ], [ "ammo_bullet", 8 ] ], - "components": [ - [ [ "4570_casing", 1 ] ], -@@ -446,6 +449,7 @@ - "batch_time_factors": [ 60, 5 ], - "book_learn": [ [ "recipe_bullets", 2 ], [ "mag_rifle", 4 ] ], - "charges": 1, -+ "reversible": true, - "using": [ [ "bullet_forming", 15 ], [ "ammo_bullet", 8 ] ], - "components": [ [ [ "4570_casing", 1 ] ], [ [ "lgrifle_primer", 1 ] ], [ [ "chem_black_powder", 12 ] ], [ [ "lead", 9 ] ] ] - }, ---- a/data/json/recipes/ammo/shot.json -+++ b/data/json/recipes/ammo/shot.json -@@ -62,6 +62,7 @@ - "batch_time_factors": [ 60, 5 ], - "book_learn": [ [ "recipe_bullets", 3 ], [ "manual_shotgun", 3 ] ], - "charges": 1, -+ "reversible": true, - "using": [ [ "ammo_shot", 1 ] ], - "tools": [ [ [ "press", -1 ] ] ], - "components": [ [ [ "gunpowder", 3 ], [ "gunpowder_pistol", 3 ], [ "gunpowder_shotgun", 3 ] ], [ [ "magnesium", 5 ] ] ] diff --git a/0011-add-missing-mre.patch b/0011-add-missing-mre.patch deleted file mode 100644 index f776e12..0000000 --- a/0011-add-missing-mre.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- a/data/json/itemgroups/Food/food.json -+++ b/data/json/itemgroups/Food/food.json -@@ -550,8 +550,10 @@ - { "item": "mre_cheesetort_box" }, - { "item": "mre_mushroomfettuccine_box" }, - { "item": "mre_mexicanchickenstew_box" }, -+ { "item": "mre_chickenburritobowl_box" }, - { "item": "mre_maplesausage_box" }, - { "item": "mre_ravioli_box" }, -+ { "item": "mre_pepperjackbeef_box" }, - { "item": "mre_hashbrownbacon_box" }, - { "item": "mre_lemontuna_box" }, - { "item": "mre_asianbeef_box" }, ---- a/data/json/npcs/items_generic.json -+++ b/data/json/npcs/items_generic.json -@@ -812,8 +812,10 @@ - [ "mre_cheesetort_box", 6 ], - [ "mre_mushroomfettuccine_box", 6 ], - [ "mre_mexicanchickenstew_box", 6 ], -+ [ "mre_chickenburritobowl_box", 6 ], - [ "mre_maplesausage_box", 6 ], - [ "mre_ravioli_box", 6 ], -+ [ "mre_pepperjackbeef_box", 6 ], - [ "mre_hashbrownbacon_box", 6 ], - [ "mre_lemontuna_box", 6 ], - [ "mre_asianbeef_box", 6 ], ---- a/data/json/npcs/NC_SOLDIER.json -+++ b/data/json/npcs/NC_SOLDIER.json -@@ -162,8 +162,10 @@ - { "item": "mre_cheesetort_box", "prob": 45 }, - { "item": "mre_mushroomfettuccine_box", "prob": 45 }, - { "item": "mre_mexicanchickenstew_box", "prob": 45 }, -+ { "item": "mre_chickenburritobowl_box", "prob": 45 }, - { "item": "mre_maplesausage_box", "prob": 45 }, - { "item": "mre_ravioli_box", "prob": 45 }, -+ { "item": "mre_pepperjackbeef_box", "prob": 45 }, - { "item": "mre_hashbrownbacon_box", "prob": 45 }, - { "item": "mre_lemontuna_box", "prob": 45 }, - { "item": "mre_asianbeef_box", "prob": 45 }, diff --git a/0012-fix-doors-for-npcs.patch b/0012-fix-doors-for-npcs.patch deleted file mode 100644 index 54f1f47..0000000 --- a/0012-fix-doors-for-npcs.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/data/json/furniture_and_terrain/terrain-fences-gates.json -+++ b/data/json/furniture_and_terrain/terrain-fences-gates.json -@@ -243,7 +243,7 @@ - "color": "brown", - "looks_like": "t_chickenwire_gate_o", - "move_cost": 2, -- "flags": [ "TRANSPARENT", "DOOR", "PERMEABLE", "BURROWABLE", "CONNECT_TO_WALL" ], -+ "flags": [ "TRANSPARENT", "PERMEABLE", "BURROWABLE", "CONNECT_TO_WALL" ], - "close": "t_screen_door_c", - "deconstruct": { - "ter_set": "t_floor", -@@ -732,7 +732,7 @@ - "looks_like": "t_fencegate_o", - "move_cost": 1, - "coverage": 60, -- "flags": [ "TRANSPARENT", "DOOR", "BURROWABLE", "FLAT", "ROAD" ], -+ "flags": [ "TRANSPARENT", "BURROWABLE", "FLAT", "ROAD" ], - "connects_to": "WOODFENCE", - "close": "t_gate_metal_c", - "deconstruct": { diff --git a/0013-fix-20x66mm-loudness.patch b/0013-fix-20x66mm-loudness.patch deleted file mode 100644 index c9128cd..0000000 --- a/0013-fix-20x66mm-loudness.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/data/json/items/ammo/20x66mm.json -+++ b/data/json/items/ammo/20x66mm.json -@@ -124,6 +124,7 @@ - "range": 12, - "damage": 60, - "recoil": 2500, -+ "loudness": 160, - "effects": [ "COOKOFF", "SHOT", "NEVER_MISFIRES" ] - }, - { diff --git a/0014-portable-generator-engine.patch b/0014-portable-generator-engine.patch deleted file mode 100644 index 70e1c2d..0000000 --- a/0014-portable-generator-engine.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/data/json/vehicles/utility.json -+++ b/data/json/vehicles/utility.json -@@ -120,7 +120,7 @@ - "parts": [ - { "x": 0, "y": 0, "part": "frame_cover" }, - { "x": 0, "y": 0, "part": "small_storage_battery" }, -- { "x": 0, "y": 0, "part": "engine_vtwin" }, -+ { "x": 0, "y": 0, "part": "engine_1cyl_large" }, - { "x": 0, "y": 0, "part": "generator_7500w" }, - { "x": 0, "y": 0, "parts": [ "wheel_mount_light", "wheel_small" ] }, - { "x": 1, "y": 0, "part": "frame_cover" }, diff --git a/0015-normalize-drone-volume.patch b/0015-normalize-drone-volume.patch deleted file mode 100644 index a45ebf0..0000000 --- a/0015-normalize-drone-volume.patch +++ /dev/null @@ -1,56 +0,0 @@ ---- a/data/json/items/corpses/inactive_bots.json -+++ b/data/json/items/corpses/inactive_bots.json -@@ -5,7 +5,7 @@ - "name": { "str": "inactive EMP hack" }, - "description": "This is an inactive EMP hack. EMP hacks are fist-sized robots that fly through the air. This one contains an EMP grenade and attacks by flying at its target and detonating. Use this item to reprogram and release the EMP hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": "4700 g", -- "volume": "750 ml", -+ "volume": "250 ml", - "price": 64500, - "to_hit": -3, - "bashing": 6, -@@ -31,7 +31,7 @@ - "name": { "str": "inactive C-4 hack" }, - "description": "This is an inactive C-4 hack. C-4 hacks are fist-sized robots that fly through the air. This one contains some C-4 and attacks by flying at its target and detonating. Use this item to reprogram and activate the C-4 hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": "5870 g", -- "volume": "250 ml", -+ "volume": "1000 ml", - "price": 67500, - "to_hit": -3, - "bashing": 6, -@@ -57,7 +57,7 @@ - "name": { "str": "inactive flashbang hack" }, - "description": "This is an inactive flashbang hack. Flashbang hacks are fist-sized robots that fly through the air. This one contains a flashbang and attacks by flying at its target and detonating. Use this item to reprogram and activate the flashbang hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": "4536 g", -- "volume": "750 ml", -+ "volume": "250 ml", - "price": 59500, - "to_hit": -3, - "bashing": 6, -@@ -83,7 +83,7 @@ - "name": { "str": "inactive tear gas hack" }, - "description": "This is an inactive tear gas hack. Tear gas hacks are fist-sized robots that fly through the air. This one contains a tear gas canister and attacks by flying at its target and releasing tear gas. Use this item to reprogram and activate the tear gas hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": "5360 g", -- "volume": "750 ml", -+ "volume": "250 ml", - "price": 60500, - "to_hit": -3, - "bashing": 6, -@@ -179,7 +179,7 @@ - "name": { "str": "inactive manhack" }, - "description": "This is an inactive manhack. Manhacks are fist-sized robots that fly through the air. They are covered with whirring blades and attack by throwing themselves against their target. Use this item to reprogram and activate the manhack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": "5400 g", -- "volume": "750 ml", -+ "volume": "250 ml", - "price": 60000, - "to_hit": -3, - "bashing": 6, -@@ -205,7 +205,7 @@ - "name": { "str": "inactive mininuke hack" }, - "description": "This is an inactive mininuke hack. Many times as large as a normal manhack, a mininuke hack contains a mininuke and attack by flying at their target and detonating. Use this item to reprogram and activate the mininuke hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": "25000 g", -- "volume": "18750 ml", -+ "volume": "16000 ml", - "price": 2677500, - "to_hit": -3, - "bashing": 6, diff --git a/0016-medical-zombies-called-zombies.patch b/0016-medical-zombies-called-zombies.patch deleted file mode 100644 index fe0b222..0000000 --- a/0016-medical-zombies-called-zombies.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/data/json/monsters/zed_medical.json -+++ b/data/json/monsters/zed_medical.json -@@ -2,7 +2,7 @@ - { - "id": "mon_zombie_nurse", - "type": "MONSTER", -- "name": { "str": "nurse" }, -+ "name": { "str": "zombie nurse" }, - "description": "Instead of one of its forearms, this zombie has a muscular tube ending in a stinger that is moist with stringy slime. It is single-mindedly focused on using just that one limb to fight.", - "default_faction": "zombie", - "bodytype": "human", -@@ -33,7 +33,7 @@ - "id": "mon_zombie_surgeon", - "type": "MONSTER", - "copy-from": "mon_zombie_nurse", -- "name": { "str": "surgeon" }, -+ "name": { "str": "zombie surgeon" }, - "description": "A dripping stinger where one hand would be, a set of razor-like claws in place of the other one. This zombie's cold, focused eyes look down at you from above a \"mask\" of melded flesh.", - "default_faction": "zombie", - "hp": 150, -@@ -58,7 +58,7 @@ - "id": "mon_zombie_vivisector", - "type": "MONSTER", - "copy-from": "mon_zombie_surgeon", -- "name": { "str": "vivisector" }, -+ "name": { "str": "zombie vivisector" }, - "description": "This humanoid has a long bone \"syringe\" in place of one forearm, a large saw as the opposing hand, and a pair of digitigrade legs ending in raptor-like feet. Its head is featureless, except for its \"human\" eyes, which smile with inhuman malice and scorn.", - "default_faction": "zombie", - "color": "light_green_white", diff --git a/0017-nerf-lightstep.patch b/0017-nerf-lightstep.patch deleted file mode 100644 index 8fa46cd..0000000 --- a/0017-nerf-lightstep.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- a/data/json/mutations/mutations.json -+++ b/data/json/mutations/mutations.json -@@ -507,11 +507,11 @@ - "id": "LIGHTSTEP", - "name": { "str": "Light Step" }, - "points": 1, -- "description": "You make no noise while walking.", -+ "description": "You make less noise while walking.", - "starting_trait": true, - "category": [ "BIRD", "ELFA", "FELINE" ], - "cancels": [ "CLUMSY" ], -- "noise_modifier": 0.0 -+ "noise_modifier": 0.4 - }, - { - "type": "mutation", diff --git a/0018-rehide-redacted.patch b/0018-rehide-redacted.patch deleted file mode 100644 index 6dacdbf..0000000 --- a/0018-rehide-redacted.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/data/json/overmap/overmap_terrain/overmap_terrain_lab.json -+++ b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json -@@ -168,9 +168,9 @@ - { - "type": "overmap_terrain", - "id": "central_lab_entrance", -- "name": "access shaft", -- "sym": "0", -- "color": "light_gray", -+ "name": "forest", -+ "sym": "F", -+ "color": "green", - "see_cost": 3, - "flags": [ "NO_ROTATE", "RISK_HIGH" ] - }, diff --git a/0019-derelict-shed-is-s.patch b/0019-derelict-shed-is-s.patch deleted file mode 100644 index d97550c..0000000 --- a/0019-derelict-shed-is-s.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/data/json/overmap/map_extras.json -+++ b/data/json/overmap/map_extras.json -@@ -256,6 +256,7 @@ - "name": "Derelict shed", - "description": "A collapsed shed.", - "generator": { "generator_method": "update_mapgen", "generator_id": "mx_fallen_shed_map" }, -+ "sym": "s", - "color": "brown", - "autonote": true - }, diff --git a/0020-hk46-is-milspec.patch b/0020-hk46-is-milspec.patch deleted file mode 100644 index 3df910d..0000000 --- a/0020-hk46-is-milspec.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/data/json/itemgroups/Weapons_Mods_Ammo/magazines.json -+++ b/data/json/itemgroups/Weapons_Mods_Ammo/magazines.json -@@ -69,7 +69,6 @@ - [ "fn57mag", 15 ], - [ "glockmag", 40 ], - [ "glock40mag", 30 ], -- [ "hk46mag", 5 ], - [ "m9mag", 5 ], - [ "mp5mag", 10 ], - [ "sig40mag", 20 ], -@@ -92,7 +91,6 @@ - [ "fnp90mag", 20 ], - [ "glockbigmag", 10 ], - [ "glock40bigmag", 10 ], -- [ "hk46bigmag", 5 ], - [ "m9bigmag", 10 ], - [ "mp5bigmag", 20 ], - [ "stanag30", 20 ], diff --git a/0021-foldable-bottle-is-container.patch b/0021-foldable-bottle-is-container.patch deleted file mode 100644 index 95b3d0f..0000000 --- a/0021-foldable-bottle-is-container.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/data/json/items/tool/container.json -+++ b/data/json/items/tool/container.json -@@ -2,7 +2,7 @@ - { - "id": "bottle_metal", - "type": "CONTAINER", -- "category": "other", -+ "category": "container", - "name": { "str": "steel bottle" }, - "description": "A stainless steel water bottle, holds 750ml of liquid.", - "weight": "200 g", -@@ -22,7 +22,7 @@ - { - "id": "bottle_folding", - "type": "CONTAINER", -- "category": "other", -+ "category": "container", - "name": { "str": "foldable plastic bottle" }, - "description": "A non-rigid plastic bottle for easy storage, holds 500 ml of liquid.", - "weight": "13 g", diff --git a/0022-fix-evac3-background-visible.patch b/0022-fix-evac3-background-visible.patch deleted file mode 100644 index 7c61c9e..0000000 --- a/0022-fix-evac3-background-visible.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/data/json/npcs/BG_traits.json -+++ b/data/json/npcs/BG_traits.json -@@ -153,6 +153,7 @@ - "name": { "str": "Survivor Story" }, - "points": 0, - "description": "This NPC could tell you about how they survived the Cataclysm", -+ "player_display": false, - "valid": false, - "purifiable": false, - "types": [ "BACKGROUND_SURVIVAL_STORY" ], diff --git a/0023-fix-rubbersplosion.patch b/0023-fix-rubbersplosion.patch deleted file mode 100644 index ef06b41..0000000 --- a/0023-fix-rubbersplosion.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/data/json/items/ammo.json -+++ b/data/json/items/ammo.json -@@ -686,7 +686,7 @@ - "count": 25 - }, - { -- "type": "AMMO", -+ "type": "TOOL", - "id": "chunk_rubber", - "category": "spare_parts", - "price": 75, -@@ -697,7 +697,6 @@ - "material": "rubber", - "volume": "250 ml", - "weight": "38 g", -- "ammo_type": "components", - "flags": [ "NO_SALVAGE" ] - }, - { diff --git a/0024-ammo-order-fix.patch b/0024-ammo-order-fix.patch deleted file mode 100644 index 01c91fb..0000000 --- a/0024-ammo-order-fix.patch +++ /dev/null @@ -1,167 +0,0 @@ ---- a/data/json/items/ammo/22.json -+++ b/data/json/items/ammo/22.json -@@ -1,16 +1,5 @@ - [ - { -- "id": "22_cphp", -- "copy-from": "22_lr", -- "type": "AMMO", -- "name": { "str": ".22 CPHP" }, -- "description": ".22 Long Rifle ammunition with 30gr copper-plated, hollow-point bullets. Has a higher velocity and slightly more stopping power than lead round-nose ammunition, but armor will have a magnified effect on its already-low penetration.", -- "//": "Hollowpoint damage increase of 25%", -- "damage": { "damage_type": "stab", "amount": 20, "armor_penetration": 0 }, -- "relative": { "range": 3 }, -- "proportional": { "recoil": 1.5 } -- }, -- { - "id": "22_lr", - "type": "AMMO", - "name": { "str": ".22 LR" }, -@@ -35,6 +24,17 @@ - "effects": [ "COOKOFF" ] - }, - { -+ "id": "22_cphp", -+ "copy-from": "22_lr", -+ "type": "AMMO", -+ "name": { "str": ".22 CPHP" }, -+ "description": ".22 Long Rifle ammunition with 30gr copper-plated, hollow-point bullets. Has a higher velocity and slightly more stopping power than lead round-nose ammunition, but armor will have a magnified effect on its already-low penetration.", -+ "//": "Hollowpoint damage increase of 25%", -+ "damage": { "damage_type": "stab", "amount": 20, "armor_penetration": 0 }, -+ "relative": { "range": 3 }, -+ "proportional": { "recoil": 1.5 } -+ }, -+ { - "id": "22_ratshot", - "copy-from": "22_cphp", - "type": "AMMO", ---- a/data/json/items/ammo/38.json -+++ b/data/json/items/ammo/38.json -@@ -1,14 +1,5 @@ - [ - { -- "id": "38_fmj", -- "copy-from": "38_special", -- "type": "AMMO", -- "name": { "str": ".38 FMJ" }, -- "description": ".38 Special ammunition with brass jacketed 130gr bullets. The .38 Special round has been known from its inception for its accuracy and low recoil.", -- "//": "Base damage of 20, balance increase of two-nineths.", -- "relative": { "damage": { "damage_type": "stab", "amount": -6, "armor_penetration": 14 } } -- }, -- { - "id": "38_special", - "type": "AMMO", - "name": { "str": ".38 Special" }, -@@ -33,6 +24,15 @@ - "effects": [ "COOKOFF" ] - }, - { -+ "id": "38_fmj", -+ "copy-from": "38_special", -+ "type": "AMMO", -+ "name": { "str": ".38 FMJ" }, -+ "description": ".38 Special ammunition with brass jacketed 130gr bullets. The .38 Special round has been known from its inception for its accuracy and low recoil.", -+ "//": "Base damage of 20, balance increase of two-nineths.", -+ "relative": { "damage": { "damage_type": "stab", "amount": -6, "armor_penetration": 14 } } -+ }, -+ { - "id": "reloaded_38_fmj", - "copy-from": "38_fmj", - "type": "AMMO", ---- a/data/json/items/ammo/40.json -+++ b/data/json/items/ammo/40.json -@@ -1,14 +1,5 @@ - [ - { -- "id": "40fmj", -- "copy-from": "40sw", -- "type": "AMMO", -- "name": { "str": ".40 S&W FMJ" }, -- "description": ".40 S&W ammunition with 180gr FMJ bullets. Designed to retain the 10mm Auto cartridge's power with lower recoil, the .40 S&W round became popular for law enforcement and personal defense.", -- "//": "Base damage of 23, balance increase of two-nineths.", -- "relative": { "damage": { "damage_type": "stab", "amount": -7, "armor_penetration": 16 } } -- }, -- { - "id": "40sw", - "type": "AMMO", - "name": { "str": ".40 S&W JHP" }, -@@ -33,6 +24,15 @@ - "effects": [ "COOKOFF" ] - }, - { -+ "id": "40fmj", -+ "copy-from": "40sw", -+ "type": "AMMO", -+ "name": { "str": ".40 S&W FMJ" }, -+ "description": ".40 S&W ammunition with 180gr FMJ bullets. Designed to retain the 10mm Auto cartridge's power with lower recoil, the .40 S&W round became popular for law enforcement and personal defense.", -+ "//": "Base damage of 23, balance increase of two-nineths.", -+ "relative": { "damage": { "damage_type": "stab", "amount": -7, "armor_penetration": 16 } } -+ }, -+ { - "id": "bp_40fmj", - "copy-from": "40fmj", - "type": "AMMO", ---- a/data/json/items/ammo/45.json -+++ b/data/json/items/ammo/45.json -@@ -1,14 +1,5 @@ - [ - { -- "id": "45_acp", -- "copy-from": "45_jhp", -- "type": "AMMO", -- "name": { "str": ".45 ACP FMJ" }, -- "description": ".45 ACP ammunition with 230gr FMJ bullets. Noted for its stopping power, the .45 ACP round has been common for almost 150 years.", -- "//": "Base damage of 27, balance increase of two-nineths.", -- "relative": { "damage": { "damage_type": "stab", "amount": -8, "armor_penetration": 18 } } -- }, -- { - "id": "45_jhp", - "type": "AMMO", - "name": { "str": ".45 ACP JHP" }, -@@ -32,6 +23,15 @@ - "effects": [ "COOKOFF" ] - }, - { -+ "id": "45_acp", -+ "copy-from": "45_jhp", -+ "type": "AMMO", -+ "name": { "str": ".45 ACP FMJ" }, -+ "description": ".45 ACP ammunition with 230gr FMJ bullets. Noted for its stopping power, the .45 ACP round has been common for almost 150 years.", -+ "//": "Base damage of 27, balance increase of two-nineths.", -+ "relative": { "damage": { "damage_type": "stab", "amount": -8, "armor_penetration": 18 } } -+ }, -+ { - "id": "45_super", - "copy-from": "45_jhp", - "type": "AMMO", ---- a/data/json/items/ammo/460.json -+++ b/data/json/items/ammo/460.json -@@ -1,13 +1,5 @@ - [ - { -- "id": "460_fmj", -- "copy-from": "460_rowland", -- "type": "AMMO", -- "name": { "str": ".460 Rowland HCFN" }, -- "description": "A plated, hard cast flat nosed variant of the .460 Rowland round. This increases penetration slightly at the cost of reduced damage from expansion.", -- "relative": { "damage": { "damage_type": "stab", "amount": -4, "armor_penetration": 8 } } -- }, -- { - "id": "460_rowland", - "copy-from": "44magnum", - "type": "AMMO", -@@ -18,6 +10,14 @@ - "proportional": { "range": 0.95, "damage": { "damage_type": "stab", "amount": 0.95, "armor_penetration": 0.95 }, "recoil": 0.95 } - }, - { -+ "id": "460_fmj", -+ "copy-from": "460_rowland", -+ "type": "AMMO", -+ "name": { "str": ".460 Rowland HCFN" }, -+ "description": "A plated, hard cast flat nosed variant of the .460 Rowland round. This increases penetration slightly at the cost of reduced damage from expansion.", -+ "relative": { "damage": { "damage_type": "stab", "amount": -4, "armor_penetration": 8 } } -+ }, -+ { - "id": "bp_460_fmj", - "copy-from": "460_fmj", - "type": "AMMO", @@ -1,21 +1,24 @@ # Maintainer: jc_gargma <jc_gargma@iserlohn-fortress.net> +# Contributor: aqua <aqua@iserlohn-fortress.net> # Maintainer (Arch): Kyle Keen <keenerd@gmail.com> # # I maintain this because: # Arch version is not BN +# BN version has done enough changes I dislike to force me to fork # Arch version has non-functional desktop file # Arch version lacks additional optimization and hardening flags -# Arch version lacks the MSX++UnDeadPeopleEdition tileset -# Arch version lacks the @ soundpack -# Arch version lacks the CO.AG musicpack +# Arch version segfaults due to -Wp,-D_GLIBCXX_ASSERTIONS pkgbase=cataclysm-bn pkgname=(cataclysm-bn cataclysm-bn-tiles) pkgname=cataclysm-bn -_pkgname=Cataclysm-BN-cbn-experimental -pkgver=202107310434 -_pkgver=2021-07-31-0434 -pkgrel=1 +#_pkgname=Cataclysm-BN-cbn +#_pkgname=Cataclysm-BN +#pkgver=0.6.0 +pkgver=0.6.3 +#pkgver=202310040030 +#_pkgver=2023-10-04-0030 +pkgrel=2 pkgdesc="A post-apocalyptic roguelike." #url="http://cataclysmrl.blogspot.com/" #url="http://www.cataclysm.glyphgryph.com/" @@ -23,267 +26,122 @@ pkgdesc="A post-apocalyptic roguelike." url="https://github.com/cataclysmbnteam/Cataclysm-BN" arch=('x86_64' 'aarch64') license=("CCPL:by-sa") -depends=('ncurses' 'hicolor-icon-theme' 'gettext') -makedepends=('sdl2_image' 'sdl2_ttf' 'sdl2_mixer' 'freetype2' 'astyle') -source=("$pkgname-$_pkgver.tar.gz::https://github.com/cataclysmbnteam/Cataclysm-BN/archive/refs/tags/cbn-experimental-$_pkgver.tar.gz" +options=('lto') +depends=( + 'gettext' + 'hicolor-icon-theme' + 'ncurses' +) +makedepends=( + 'astyle' + 'freetype2' + 'lzip' + 'sdl2_image' + 'sdl2_mixer' + 'sdl2_ttf' +) +#source=("$pkgname-$_pkgver.tar.gz::https://github.com/cataclysmbnteam/Cataclysm-BN/archive/refs/tags/cbn-experimental-$_pkgver.tar.gz" +#source=("$pkgname-$pkgver.tar.gz::https://github.com/cataclysmbnteam/Cataclysm-BN/archive/refs/tags/cbn-$pkgver.tar.gz" # Pre 0.5.2 +#source=("$pkgname-$pkgver.tar.gz::https://github.com/cataclysmbnteam/Cataclysm-BN/archive/refs/tags/v$pkgver.tar.gz" +source=( + "cataclysm-jc-0.0.3.tar.lz" "cataclysm-bn.desktop" "cataclysm-bn-tiles.desktop" "icon_128x128.png" - "0.F_backport-tacoma-barn-door-position.patch" - "0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch" - "0.F_backport-inhaler-mission-no-autofail.patch" - "0.F_backport-radio-can-use-ups.patch" - - "0001-quiverfull-house-correct-stairs.patch" - "0002-ankle-ammo-pouch-is-not-a-backpack.patch" - "0003-inconsistent-ammo-names.patch" - "0004-tacoma-clinic-add-missing-floor.patch" - "0005-lumbermill-gasoline-not-spilled.patch" - "0006-community-garden-fertilizer-not-spilled.patch" - "0007-oxyacetylene-from-oxygen.patch" - "0008-npc-can-use-more-bionics.patch" - "0009-22-casings-can-stack.patch" - "0010-4570-dragon-can-be-dismantled.patch" - "0011-add-missing-mre.patch" - "0012-fix-doors-for-npcs.patch" - "0013-fix-20x66mm-loudness.patch" - "0014-portable-generator-engine.patch" - "0015-normalize-drone-volume.patch" - "0016-medical-zombies-called-zombies.patch" - "0017-nerf-lightstep.patch" - "0018-rehide-redacted.patch" - "0019-derelict-shed-is-s.patch" - "0020-hk46-is-milspec.patch" - "0021-foldable-bottle-is-container.patch" - "0022-fix-evac3-background-visible.patch" - "0023-fix-rubbersplosion.patch" - "0024-ammo-order-fix.patch" - - "jc_ammo-loudness-ap-times-2.patch" - "jc_allow-bio-firestarter-on-smoker.patch" - "jc_npcs-eat-when-hungry.patch" - "jc_stop-non-faction-npc-sleep-depirvation.patch" - "jc_stop-non-faction-npc-malnourishment.patch" - "jc_stop-sleeping-on-tables.patch" - "jc_allow-hacker-laptop.patch" - "jc_restore-inf-immune.patch" - - "custom.patch" - - "cataclysm-dda-tileset_undeadpeople.tar.xz::https://library.iserlohn-fortress.net/cataclysm-dda-tileset_undeadpeople.git/snapshot/cataclysm-dda-tileset_undeadpeople-master.tar.xz" - "cataclysm-dda-mod_battle-maid-redone-tileset.tar.xz::https://library.iserlohn-fortress.net/cataclysm-dda-mod_battle-maid-redone-tileset.git/snapshot/cataclysm-dda-mod_battle-maid-redone-tileset-master.tar.xz" - "cataclysm-dda-soundpack_jcsoundpack.tar.xz::https://library.iserlohn-fortress.net/cataclysm-dda-soundpack_jcsoundpack.git/snapshot/cataclysm-dda-soundpack_jcsoundpack-master.tar.xz" - "cataclysm-dda-musicpack_coag-musicpack.tar.xz::https://library.iserlohn-fortress.net/cataclysm-dda-musicpack_coag-musicpack.git/snapshot/cataclysm-dda-musicpack_coag-musicpack-master.tar.xz" + #"src-18-v7_monsters-can-go-up-stairs.patch" + #"src-19_triffids-do-not-burrow-v2.patch" + #"src-20_prevent-holstering-gunmods.patch" + + "vampirism.patch" ) -b2sums=('ebb0aba2614372af488322cf9b445ea20c17e76699cd019ecb73b7dc07ecdd7d1ef98fc4bab3cb67d88dec6c45034323d80b8ed79ded32c32a04342d6cf8e3df' +b2sums=('8d66556c1f16a34f885c231922ae797bd38fd0de9d914f132e759e0d8329a89bab5c678177f253e9006158923a8ae26a8df11a975f661ade37135237dd4b85b4' '069ecde58859b3d44cd687c4b6e718610cefb693ff86e66f199ebfb1b3072023ad2b6f0c28e27ef9c1ce4997f6a5b2ca0d45046996b3ff35a4aeaeb1a7cf9421' 'ad88bc6c1e3c8183a313b5eec42f98d6956afea349feff34a86e4536c9921fa99d2594282caf27de8ebb7ffb56376ed2e76d572227bfd6d8173c7bb1f01e23b8' '6f70e90359a14e4839d9a2683debb88850e5dd387add911ad68fd87e5512cfcdd435da63e1e370358153673fd5a72a9b1e9c94f1979edb7948b4da8c82407bad' - 'ce0dd5121e814e0fcd79d68362c80a83bfe70f970be9d5d6f6fe5f6a56ed3f041be4d560aaf02225c3ce7c457dc63bc3adf0709d4b89a81c18184ff5341eb5d3' - '2cdcf9ab03eb92f384caf1a2d90f82c75f880cb6286811e83217c883e421c116e7844ca193a010dc35e12eec46ede3663171a2f45f660ef5a8be95c474f61bfc' - '9e2c26bf0e2bb4fd60de8cad1f9c05f329d99a56c64189bc2747915c48d208b63038d45a90f7a1c8e8bb0ac33461f217acf7e57f752f0acff117e2062459e9bb' - '51b1324506179f7fadd8bc187eb8db939494483597b0b7b63909cec66f4e94b27888ccfa926bbd2ff8b0e80108ecc373118c202a177fc2ebd4f5231f87f09a83' - '8232c6a10fd1f608304982ae7f03eb8afc663be76cdc00aee46ecb58de838e21fdc8673841266ccd00153263f7b15b59dcd1fc6ece86834509d7ccb2cacf08fa' - '025213998583972e7551bd7bd7376ab65857e28d4338fab60ae792a6b3bd48983aec77e5143baaa63d4f3feb7cd590c4bded529c410e4d18f2b8c5813f25daa3' - '57e830004122ad835f84fd45c0965b7801b7355dcfef22c4e83969460f181d86110a7e37cc87a196238aa745ac8c9db99f97cf87edf7ef0fd8cfd16cf38d22cc' - 'b8a64accada87ee5be989c5307805610c9b5c0327bc107aab237ac3225dd9e4c51b6c79a2a7de15fe187d3c32d7cbe1c462f9b0e9fb5d5a55a74236c7061e96e' - '85aeb5920ee5879848be4057324153a077fe907bed527ed8f9b80a3c5ee1ef64786f63ee2999f5ba74e80a43e99ded3280ce27759c1f7b73259a6e2b5e584aa8' - '58a94409205f7b670ab5745b8cbc234a38efd6a6217cef4efb7e397f091092e3e0c7790706b0a42accaa83d7509b8e244a98b9f0ba78349ee85f3164745c3501' - 'd34d673fe04d4317ef3c1ac3f088b6614f7c20414cfe44aa0ff71bdc932c517c4e6295492f158ced84232af8f54d1672ae56078b156593d58bf8fe7ffc3d475d' - 'f3bdbaac5dbe9384571fe5ec14d2d25035f227a977c25349b8188e7343804e3973b898b44c34f9abe9318666294f4fdfe780fd516dcbdb29c4ac52f6d0ed6cad' - '67cdb7e097bbb46da5cf04708bc2858b080d1a85742afc4c088da3e4e3fdeb6e4c51240fc5a6b9a1c7d927b30b3d251236e025ee4e5496142a7716d4ba51b82c' - '9ad2986261e6613e80b4bb61b89e2d0c703d7c4d28fda98e58fbcc2623a05c05e253cd2045e64c140e5de99aa2278165948e717739eb803849ea17745e974620' - '417cd957f188b2b06e41d5413bea5f13481c6d5bfa8f184157379d5ac2afa9ba6f7ebc966856f50603f89b9173b6fbfdb3ccf4e3cc0b1bedb53f935591e4a35c' - '80da2c341d8564a47bc460fcdaf9196ac3bb77f0f2ba56bd71089e80e7481728a3ccbdcfcbc3bf70a9c9e5d9d9b01f2ca6615b67c7ab61003808ce00f6545ba3' - 'c1b6e59c840aee812570d9fb30f045b371473282c2289aaefe66483e6aae995fb93549882811fcb869d77f1c27a62ba4e486a8e20327846fd0602926739296ae' - '74a51f04237fba3caa25b2e0d49659f2e8330ce82288de866943d06b53690f31d48a77a4dd2e57db1f435b715fbca792268f2e191ffb59e57170d327ed41ac0a' - '8203bb062d72559da908a5020963503303c0aaa4a2ab61e57cfb713f58de40f1cb50b8b6dfbeec3a9addc41cbec5ae17fbf57230c3614f9b69fe6b0c55bf3fad' - '7e49f473cd5c5811ff6456b58be6f8cb438ec712b388c156902f837b556550710bb79924f94f6818a6332e653ec0740d7688165ca105b159faeeeeec2b105dd6' - '08f4746882b927bdff6b728630cf1e04a2b79924f694ca2d841e3115c3399feb87a8d363e4d2a0f59179c109cb6be6e840f912aadd44abb0bdb35afd2838cc4d' - '651de880cefd51665d854414c451cc80a33ed8f34e7559a95514abd81a2f58348c37dd75f272468eefd56562ba8c99093a6dd9af3ea57796a9db15164a40eda3' - '7e41fc3a95073008ca2d71c2266d6d1a17af7803d493b447d40b15a86184c8ce3728b8d3d36765d408b1c46633d1bfa980d878cbac2e04b51ef518d44dfb7295' - '76c816df10aceec8f1a7d1356220eb3f00b16fac455e84eb8aefe76db29cd037dc74fb5cfa344b8d283b188951bd100c26e351ce2e27c16c836a547fe2c99e46' - '7cae5e42b6e16f3c4bf64dca3c7573c1b552424ff70bb6da0a21f121b53b2546b239c87953a090cd90f46a1c3c124e2fe19c560b1830b11334f8e64c92fb614d' - 'ab35d6663b864449d46da4a9e1c51e11956ff4c38e16db58c831b71f7b964fc25b0283122dbc8aa0549f240f01c4a910fb5c6c82937258c6b736c05b54bcf768' - 'e1d03f68918d03f980f4c2dd966e3788afe63f14e2d18dbd4dab2cdbfa1253e4823c0f5daa3a579e47319a3c2af35bc5af0a390e2ba91fe7621f6db8b1a60994' - 'c47d002dc55af6c74a830205626eab57922f3f79143a5e1ddbc9ac8dc75c1ef4f2adf6a1816f8abe0b43e9a81a9021d1c9c7f62d76fdf67fa5fe00bbeca73962' - '92cde696eec00e6758b58e73e8bc60ad1a73bb2a18d4fdfd24a19b5be715305a047943a02d94a9703c101ca0c769dbeb816f1f28809345bae0fec42fbc27bb34' - 'edfccb4ccb70e174648101d68432ea14ee1e7cc9304d4545dddb65184eeafb708a898cc90778e44cf7464c82c9d350209e5ad262c50a50fa0b8ae3a22fca9ff9' - '8e9bf6ff4bafc6397c6631392aaddd2866537943ae3bbdb95282945acba385d66f6d9879fd283eeafbb8df4e927f3ecc061fb36ecb5d38dbddecd2fd9c735e56' - 'ce82294e480ad42f0001c799fd8131b60024b6097653f3c57564c75e54596616e376f0d7f1cf4e54d8c302a61ef164b4323f795bfa19b2c13ab9e927d37f1600' - 'e5d7b75d3bced70d5f77bd8860c53f888b1f2495b4a6bf0b1284e3fc1e831a58bc691b4a11419cd7d14427165158d7ebf3f5c690733e4f3ee5194b9bf9bd001a' - 'd723fcc6cce65aa296bc519a07a5d003122ad698a73a3d046dac3780ea5a00fef28f78da251bb46f80f2e0577baa26a6ae13cabf525f22a7a742435e95716dae' - 'e9c8decf0ab74ac2dd02ddd537ca80ad2aa02d97faf6cfcb983965b4c3f400b47b2e0517f2927d1b2463c14370fd1a0bad5b4d00710b2b415b45d1a81724a9c9' - '0bc675f798113cc744337ac2864c54510af89fc59450a3bf250cc49c1a1b17ebeddc007e38491978d367555ed7f4895266d68f50f01d30f79a7cacdc01f0f207' - '0dc275d5e1aa79b2cf73f7e997ea2b602690787ae15e3abdd3b9195bb409d511c74d4f7dca4bf1753a9afb4618f04cb462769c24999357dea62593a379411f42' - '59665e75f28e04a7c1da4dca3242626bab8298849fec5af099550fc3ee36cc6badd7794aaad7b8b3f1b85790df3b89b4d0bb91dcda809b109bf729bb40b0a972' - 'ba0bd9be874e134914334a5baaef843162003adc0253dae32f1a052da6da59e108808852f51b05350ae6ae074f8d15d88cfcf93f49174c47b924f0f9d7fbd206' - '2b506d69016b5eac7b72341d30900dded43b5c54471547db43968c7b8724d95aff622aa133afb161e200b1b8e470b47422966230458e7b41a112d47fdcdf27f0' - 'b9309da09b165fb57e83f84e3584d2479bd3336ed86e181e5df2d27daa92bd55d03d7f3fc226f03696af5f0f32d8e0e7ecd26ae7e50eed0200d0b0feaad07efb') + '11ed6cc089964c4dc171b91f83f5ac041ced4b480151f77b21febafe392342ba4931af9c71266d4694a0ed236012ce2cbbb6ad58ff32721766cc4b88f9abe7e4') prepare() { - cd "${_pkgname}-${_pkgver}" - sed -i 's/-Werror//' Makefile - sed -i 's/ncursesw5-config/ncursesw6-config/' Makefile - sed -i 's/shell git/shell false/' Makefile - sed -i 's/-Os/-O3/' Makefile - - # Fix filenames - sed -i 's|cataclysm-dda|cataclysm-bn|' CMakeLists.txt - sed -i 's|TARGET_NAME = cataclysm|TARGET_NAME = cataclysm-bn|' Makefile - sed -i 's|cataclysm.a|cataclysm-bn.a|' Makefile - sed -i 's|cataclysm.a|cataclysm-bn.a|' tests/Makefile - sed -i 's|cataclysm-dda|cataclysm-bn|' src/path_info.cpp + #cd "${_pkgname}-${pkgver}" + cd "repo" + + # Assorted workarounds + sed \ + -e 's/-Werror//' \ + -e 's/shell git/shell false/' \ + -i Makefile + + # Disable default optimizations + sed \ + -e 's/-Os/-O3/' \ + -e 's/-O0/-O3/' \ + -e 's/-Og/-O3/' \ + -i Makefile # Fix version - sed -i 's|VERSION = unstable|VERSION = 2021-07-31-0434|' Makefile - - - # Backports from 0.F - # Fix tacoma barn doors being placed in the same spot twice - patch -Np1 -i "$srcdir"/0.F_backport-tacoma-barn-door-position.patch - - # Fix npcs unable to drink from firestation and shelter basecamps wells - patch -Np1 -i "$srcdir"/0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch - - # Fix npcs with the inhaler mission instantly dying upon mission acceptance - patch -Np1 -i "$srcdir"/0.F_backport-inhaler-mission-no-autofail.patch - - # Fix radio, e-ink reader music, tactical tonfa not working with UPS - patch -Np1 -i "$srcdir"/0.F_backport-radio-can-use-ups.patch - - - # Various other fixes for bugs I came across - # Fix Quiverfull house to have the correct stairs that modify json - patch -Np1 -i "$srcdir"/0001-quiverfull-house-correct-stairs.patch - - # Fix Ankle Ammo Pouch to not look like a backpack - patch -Np1 -i "$srcdir"/0002-ankle-ammo-pouch-is-not-a-backpack.patch - - # Fix mulitple inconsistent ammuntion names and handloaded status - patch -Np1 -i "$srcdir"/0003-inconsistent-ammo-names.patch - - # Fix missing floor in tacoma clinic - patch -Np1 -i "$srcdir"/0004-tacoma-clinic-add-missing-floor.patch - - # Fix lumbermill gasoline being spilled instead of being inside the gas pump - patch -Np1 -i "$srcdir"/0005-lumbermill-gasoline-not-spilled.patch - - # Fix community garden liquid fertilizer being in a pit instead of in the storage tanks - patch -Np1 -i "$srcdir"/0006-community-garden-fertilizer-not-spilled.patch - - # Fix oxyacetylene to be craftable from oxygen tanks - patch -Np1 -i "$srcdir"/0007-oxyacetylene-from-oxygen.patch - - # Fix npc not being able to install some additional CBMs: - # ie, soporific inducer, gasoline fuel cell, enhanced hearing, surgical scalpels - patch -Np1 -i "$srcdir"/0008-npc-can-use-more-bionics.patch - - # Fix .22 casings not stacking when every other casing stacks - patch -Np1 -i "$srcdir"/0009-22-casings-can-stack.patch - - # Fix reloaded 45-70 rounds and reloaded dragon shot were not allowing dismantling when every other non-caseless does - patch -Np1 -i "$srcdir"/0010-4570-dragon-can-be-dismantled.patch - - # Fix the pepperjack beef and burrito bowl MREs never dropping - patch -Np1 -i "$srcdir"/0011-add-missing-mre.patch - - # Fix some doors being unusable by npcs (incorrect door flag) - patch -Np1 -i "$srcdir"/0012-fix-doors-for-npcs.patch - - # Fix the loudness of 20x66mm shotgun shells like other shotguns - patch -Np1 -i "$srcdir"/0013-fix-20x66mm-loudness.patch - - # Replace the portable generator twin engine with a large 1 cylinder so it can actually function as is - patch -Np1 -i "$srcdir"/0014-portable-generator-engine.patch +# sed -i 's|VERSION = unstable|VERSION = "0.2-experimental 2023-10-04-0030"|' Makefile +# sed -i 's|VERSION = unstable|VERSION = "0.6.0"|' Makefile + sed -i 's|VERSION = 0.6.0|VERSION = "0.0.3"|' Makefile - # Normalize the manhack volumes to that of the base grenade/explosive - patch -Np1 -i "$srcdir"/0015-normalize-drone-volume.patch - # Prefix medical zombies with "zombie" like other zombies. - patch -Np1 -i "$srcdir"/0016-medical-zombies-called-zombies.patch + # # # Hotfixes + #echo "Applying hotfixes" - # Light Step feels too powerful in Bright Nights - patch -Np1 -i "$srcdir"/0017-nerf-lightstep.patch - # Re-hide something that feels like spoilers - patch -Np1 -i "$srcdir"/0018-rehide-redacted.patch + # # # Various other fixes for bugs I came across that modify src + #echo "Applying source code fixes" - # Set the overmap note for Derelict Shed to s to better match use of the first letter - patch -Np1 -i "$srcdir"/0019-derelict-shed-is-s.patch + # Fix monsters not travelling up stairs: (Still in testing) FIXME + #patch -Np1 --no-backup-if-mismatch -i "$srcdir"/src-18-v7_monsters-can-go-up-stairs.patch - # Stop police and SWAT carrying 4.6mm magazines despite having no compatible weapons - patch -Np1 -i "$srcdir"/0020-hk46-is-milspec.patch + # Fix triffid queens from destroying terrain and burrowing to the center of the Earth: FIXME + # The growplants function was destroying the terrain, not the furniture. + # And since p is somehow being lost, the new terrain was never added. + # This workaround has the side effect of making triffid terraforming silent, but its better than burrowing. + #patch -Np1 --no-backup-if-mismatch -i "$srcdir"/src-19_triffids-do-not-burrow.patch - # Mark the foldable plastic bottle and steel water bottle as containers - patch -Np1 -i "$srcdir"/0021-foldable-bottle-is-container.patch + # Prevent gunmods from being holstered: (Still in testing) FIXME + # This is a hack fix due to how drawing a holstered gunmod that accepts magazines crashes the game. + #patch -Np1 --no-backup-if-mismatch -i "$srcdir"/src-20_prevent-holstering-gunmods.patch - # Fix Evacuee 3 background 3 being player visible - patch -Np1 -i "$srcdir"/0022-fix-evac3-background-visible.patch - - # Fix rubber items dismantling into 10x item volume of rubber - patch -Np1 -i "$srcdir"/0023-fix-rubbersplosion.patch - - # Fix ammo ordering so as to not prevent those items being modded - patch -Np1 -i "$srcdir"/0024-ammo-order-fix.patch - - - # Various other fixes for bugs I came across that modify src - # Fix ammo loudness mulitplying by six instead of two - patch -Np1 -i "$srcdir"/jc_ammo-loudness-ap-times-2.patch - - # Fix smoker racks not accepting bionic firestarter - patch -Np1 -i "$srcdir"/jc_allow-bio-firestarter-on-smoker.patch - - # Fix NPCs not eating until they drop below normal weight and not becoming full from eating the basecamp stockpile - patch -Np1 -i "$srcdir"/jc_npcs-eat-when-hungry.patch - - # Fix Non-Player facton NPCs from becoming sleep deprived - patch -Np1 -i "$srcdir"/jc_stop-non-faction-npc-sleep-depirvation.patch - - # Fix Non-Player facton NPCs from becoming malnourished - patch -Np1 -i "$srcdir"/jc_stop-non-faction-npc-malnourishment.patch - - # Fix NPCs preferring tables to cots or woodstoves to the floor - patch -Np1 -i "$srcdir"/jc_stop-sleeping-on-tables.patch - - # Allow the hacker_laptop to utilize the extra functions - patch -Np1 -i "$srcdir"/jc_allow-hacker-laptop.patch - - # Restore the Infection Immune Trait and Revert Infection Resistant to as before - patch -Np1 -i "$srcdir"/jc_restore-inf-immune.patch - - - # Some personal quirks that simply lack a means short of patching the source - patch -Np1 -i "$srcdir"/custom.patch + # # # Additional changes + echo "Applying vampirism patch" + # Add vampire mutation lines and modify a number of functions to facilitate these traits. + patch -Np1 --no-backup-if-mismatch -i "$srcdir"/vampirism.patch } build() { - cd "${_pkgname}-${_pkgver}" + #cd "${_pkgname}-${pkgver}" + cd "repo" #export CFLAGS="$CFLAGS -fPIE" export CXXFLAGS="$CXXFLAGS -fPIE" export LDFLAGS="$LDFLAGS,-pie" - # tests "ifdef TILES" so "TILES=0" will enable tiles! - # DYNAMIC_LINKING appears to be a windows flag? - make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 LTO=1 LOCALIZE=1 LANGUAGES=all - make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 LTO=1 LOCALIZE=1 LANGUAGES=all TILES=1 SOUND=1 - ./lang/compile_mo.sh + # Prevent segfaults when examine tile->search returns no results. + #export CXXFLAGS="$(echo $CXXFLAGS | sed -i 's/-Wp,-D_GLIBCXX_ASSERTIONS//' - )" # No longer works + export CXXFLAGS="$(echo $CXXFLAGS | sed 's/-Wp,-D_GLIBCXX_ASSERTIONS//')" + #echo $CXXFLAGS + + # Disable astyle until I can custom build a copy of 3.1 + # And disable json linting for the moment + make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 LOCALIZE=1 LANGUAGES=all RUNTESTS=0 ASTYLE=0 LINTJSON=0 VERBOSE=1 PCH=0 LUA=0 CCACHE=0 + make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 LOCALIZE=1 LANGUAGES=all RUNTESTS=0 ASTYLE=0 LINTJSON=0 VERBOSE=1 PCH=0 LUA=0 CCACHE=0 TILES=1 SOUND=1 + #./lang/compile_mo.sh } package_cataclysm-bn() { - cd "${_pkgname}-${_pkgver}" + #cd "${_pkgname}-${pkgver}" + cd "repo" - make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 USE_HOME_DIR=1 LTO=1 LOCALIZE=1 LANGUAGES=all install + make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 USE_HOME_DIR=1 LOCALIZE=1 LANGUAGES=all RUNTESTS=0 ASTYLE=0 LINTJSON=0 VERBOSE=1 PCH=0 LUA=0 CCACHE=0 install # Docs install -d "$pkgdir/usr/share/doc/cataclysm-bn" cp --reflink -r doc/* "$pkgdir/usr/share/doc/cataclysm-bn" - # undo symlink - rm "$pkgdir/usr/share/doc/cataclysm-bn/JSON_LOADING_ORDER.md" - cp --reflink 'data/json/LOADING_ORDER.md' "$pkgdir/usr/share/doc/cataclysm-bn/JSON_LOADING_ORDER.md" + + # Fix tileset readme being duplicated in curses package + rm "$pkgdir/usr/share/cataclysm-bn/json/external_tileset/README.md" # License install -Dm644 LICENSE.txt "$pkgdir/usr/share/licenses/$pkgname/LICENSE" @@ -304,45 +162,40 @@ package_cataclysm-bn() { package_cataclysm-bn-tiles() { pkgdesc="A graphical post-apocalyptic roguelike." - depends=('cataclysm-bn' 'sdl2_image' 'sdl2_ttf' 'freetype2' 'sdl2_mixer') - cd "${_pkgname}-${_pkgver}" + depends=( + 'cataclysm-bn' + 'freetype2' + 'sdl2_image' + 'sdl2_mixer' + 'sdl2_ttf' + ) + #cd "${_pkgname}-${pkgver}" + cd "repo" - make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 LTO=1 LOCALIZE=1 LANGUAGES=all TILES=1 SOUND=1 install + make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 LOCALIZE=1 LANGUAGES=all RUNTESTS=0 ASTYLE=0 LINTJSON=0 VERBOSE=1 PCH=0 LUA=0 CCACHE=0 TILES=1 SOUND=1 install # Icon #install -D 'data/osx/AppIcon.iconset/icon_128x128.png' "$pkgdir/usr/share/icons/hicolor/128x128/apps/$pkgname.png" #install -D 'data/osx/AppIcon.iconset/icon_128x128.png' "$pkgdir/usr/share/pixmaps/$pkgname.png" - install -D "${srcdir}/icon_128x128.png" "$pkgdir/usr/share/icons/hicolor/128x128/apps/$pkgname.png" - install -D "${srcdir}/icon_128x128.png" "$pkgdir/usr/share/pixmaps/$pkgname.png" + install -Dm644 "${srcdir}/icon_128x128.png" "$pkgdir/usr/share/icons/hicolor/128x128/apps/$pkgname.png" + install -Dm644 "${srcdir}/icon_128x128.png" "$pkgdir/usr/share/pixmaps/$pkgname.png" install -Dm644 "${srcdir}/$pkgname.desktop" "${pkgdir}/usr/share/applications/$pkgname.desktop" install -Dm644 LICENSE.txt "$pkgdir/usr/share/licenses/$pkgname/LICENSE" - # Tileset - mv "$srcdir/cataclysm-dda-tileset_undeadpeople-master" "$srcdir/undeadpeople" - cp --reflink -r "$srcdir/undeadpeople" "$pkgdir/usr/share/cataclysm-bn/gfx" + # Remove unmaintained UDP tileset + # Use my forked cataclysm-bn-tileset package for a working UDP tileset rm -rf "$pkgdir/usr/share/cataclysm-bn/gfx/MSX++UnDeadPeopleEdition" - #mv "$srcdir/cataclysm-dda-mod_battle-maid-redone-tileset-master" "$srcdir/battle-maid-redone-tileset" - cp --reflink -r "$srcdir/cataclysm-dda-mod_battle-maid-redone-tileset-master/battle-maid-redone-tileset-pt1" "$pkgdir/usr/share/cataclysm-bn/mods" - cp --reflink -r "$srcdir/cataclysm-dda-mod_battle-maid-redone-tileset-master/battle-maid-redone-tileset-pt2" "$pkgdir/usr/share/cataclysm-bn/mods" - - - # Sound - mv "$srcdir/cataclysm-dda-soundpack_jcsoundpack-master" "$srcdir/jcsoundpack" - cp --reflink -r "$srcdir/jcsoundpack" "$pkgdir/usr/share/cataclysm-bn/sound" - - # Music - mv "$srcdir/cataclysm-dda-musicpack_coag-musicpack-master" "$srcdir/coag-musicpack" - install -Dm644 "$srcdir/coag-musicpack/musicset.json" "$pkgdir/usr/share/cataclysm-bn/sound/jcsoundpack/musicset.json" - cp --reflink -r "$srcdir/coag-musicpack/music" "$pkgdir/usr/share/cataclysm-bn/sound/jcsoundpack" - # hack: remove overlapping files cd "$pkgdir/../cataclysm-bn" find . -type f -exec rm -f "$pkgdir"/{} \; cd "$pkgdir" find . -type d -empty -delete + + # Fix mapgen readme being duplicated in tileset package + rm "$pkgdir/usr/share/cataclysm-bn/json/mapgen/lab/README.md" } diff --git a/custom.patch b/custom.patch deleted file mode 100644 index d669295..0000000 --- a/custom.patch +++ /dev/null @@ -1,254 +0,0 @@ ---- 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/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/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" ) ) { -@@ -759,6 +763,17 @@ - } - } - -+ if( has_trait( trait_VAMP_CURSE ) && one_in( 10 ) ) { -+ if( !( weapon.has_flag( "RAIN_PROTECT" ) ) ) { -+ add_msg_if_player( m_bad, _( "The sunlight sears your skin!" ) ); -+ if( has_effect( effect_sleep ) && !has_effect( effect_narcosis ) ) { -+ wake_up(); -+ } -+ mod_pain( 5 ); -+ hurtall( 5, nullptr ); -+ } -+ } -+ - if( ( has_trait( trait_TROGLO ) || has_trait( trait_TROGLO2 ) ) && - g->weather.weather == WEATHER_SUNNY ) { - mod_str_bonus( -1 ); ---- a/src/monattack.cpp -+++ b/src/monattack.cpp -@@ -143,6 +143,7 @@ - static const trait_id trait_TAIL_CATTLE( "TAIL_CATTLE" ); - 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 mtype_id mon_ant_acid_larva( "mon_ant_acid_larva" ); - static const mtype_id mon_ant_acid_queen( "mon_ant_acid_queen" ); -@@ -2758,6 +2759,9 @@ - damage_instance dam = damage_instance(); - dam.add_damage( DT_STAB, 6, 10, 0.6, 1 ); - bool hit = sting_shoot( z, target, dam, range ); -+ if( target->has_trait( trait_THRESH_VAMP ) ) { -+ return true; -+ } - if( hit ) { - //Add checks if previous NPC/player conditions are removed - dynamic_cast<player *>( target )->mutate(); ---- 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/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/mutations/mutation_ordering.json -+++ b/data/json/mutations/mutation_ordering.json -@@ -73,6 +73,7 @@ - "TROGLO2", - "TROGLO3", - "URSINE_FUR", -+ "VAMP_SKIN", - "VISCOUS" - ], - "order": 1500 diff --git a/jc_allow-bio-firestarter-on-smoker.patch b/jc_allow-bio-firestarter-on-smoker.patch deleted file mode 100644 index 6ced728..0000000 --- a/jc_allow-bio-firestarter-on-smoker.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- a/src/iexamine.cpp -+++ b/src/iexamine.cpp -@@ -4866,18 +4866,30 @@ - return; - } - -- if( !p.has_charges( "fire", 1 ) ) { -+ const bool has_bionic_firestarter = p.has_bionic( bio_lighter ) && -+ p.enough_power_for( bio_lighter ); -+ -+ if( !has_bionic_firestarter && !p.has_charges( "fire", 1 ) ) { - add_msg( _( "This smoking rack is ready to be fired, but you have no fire source." ) ); - return; - } else if( !query_yn( _( "Fire the smoking rack?" ) ) ) { - return; - } - -- p.use_charges( "fire", 1 ); -- for( auto &it : g->m.i_at( examp ) ) { -- if( it.has_flag( flag_SMOKABLE ) ) { -- it.process_rot( 1, false, examp, nullptr ); -- it.set_flag( flag_PROCESSING ); -+ if( has_bionic_firestarter ) { -+ for( auto &it : g->m.i_at( examp ) ) { -+ if( it.has_flag( flag_SMOKABLE ) ) { -+ it.process_rot( 1, false, examp, nullptr ); -+ it.set_flag( flag_PROCESSING ); -+ } -+ } -+ } else { -+ p.use_charges( "fire", 1 ); -+ for( auto &it : g->m.i_at( examp ) ) { -+ if( it.has_flag( flag_SMOKABLE ) ) { -+ it.process_rot( 1, false, examp, nullptr ); -+ it.set_flag( flag_PROCESSING ); -+ } - } - } - g->m.furn_set( examp, next_smoker_type ); diff --git a/jc_allow-hacker-laptop.patch b/jc_allow-hacker-laptop.patch deleted file mode 100644 index 69ca8b2..0000000 --- a/jc_allow-hacker-laptop.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/src/game.cpp -+++ b/src/game.cpp -@@ -2432,7 +2432,8 @@ - remoteveh_cache_time = calendar::turn; - std::stringstream remote_veh_string( u.get_value( "remote_controlling_vehicle" ) ); - if( remote_veh_string.str().empty() || -- ( !u.has_active_bionic( bio_remote ) && !u.has_active_item( "remotevehcontrol" ) ) ) { -+ ( !u.has_active_bionic( bio_remote ) && !u.has_active_item( "remotevehcontrol" ) -+ && !u.has_active_item( "hacker_laptop" ) ) ) { - remoteveh_cache = nullptr; - } else { - tripoint vp; -@@ -2452,7 +2453,7 @@ - remoteveh_cache_time = calendar::turn; - remoteveh_cache = veh; - if( veh != nullptr && !u.has_active_bionic( bio_remote ) && -- !u.has_active_item( "remotevehcontrol" ) ) { -+ !u.has_active_item( "remotevehcontrol" ) && !u.has_active_item( "hacker_laptop" ) ) { - debugmsg( "Tried to set remote vehicle without bio_remote or remotevehcontrol" ); - veh = nullptr; - } diff --git a/jc_ammo-loudness-ap-times-2.patch b/jc_ammo-loudness-ap-times-2.patch deleted file mode 100644 index 3def080..0000000 --- a/jc_ammo-loudness-ap-times-2.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/src/item_factory.cpp -+++ b/src/item_factory.cpp -@@ -221,7 +221,7 @@ - if( obj.ammo->loudness < 0 ) { - obj.ammo->loudness = obj.ammo->range * 2; - for( const damage_unit &du : obj.ammo->damage ) { -- obj.ammo->loudness += ( du.amount + du.res_pen ) * 2; -+ obj.ammo->loudness += ( du.amount * 2 ) + ( du.res_pen * 2 / 3 ); - } - } - diff --git a/jc_npcs-eat-when-hungry.patch b/jc_npcs-eat-when-hungry.patch deleted file mode 100644 index 1c7bf0c..0000000 --- a/jc_npcs-eat-when-hungry.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/src/npcmove.cpp -+++ b/src/npcmove.cpp -@@ -1858,7 +1858,9 @@ - } - - if( one_in( 3 ) && ( get_thirst() > thirst_levels::thirsty || -- get_stored_kcal() + stomach.get_calories() < get_healthy_kcal() * 0.95 ) ) { -+ get_stored_kcal() + stomach.get_calories() < get_healthy_kcal() * 0.95 || -+ ( get_hunger() > 160 && -+ ( get_stored_kcal() + stomach.get_calories() < get_healthy_kcal() ) ) ) ) { - if( consume_food_from_camp() ) { - return npc_noop; - } -@@ -3820,13 +3822,14 @@ - return true; - } - faction *yours = g->u.get_faction(); -- int camp_kcals = std::min( std::max( 0, 19 * get_healthy_kcal() / 20 - get_stored_kcal() - -+ int camp_kcals = std::min( std::max( 0, get_healthy_kcal() - get_stored_kcal() - - stomach.get_calories() ), yours->food_supply ); - if( camp_kcals > 0 ) { - complain_about( "camp_food_thanks", 1_hours, "<camp_food_thanks>", false ); - mod_hunger( -camp_kcals ); - mod_stored_kcal( camp_kcals ); - yours->food_supply -= camp_kcals; -+ stomach.mod_calories( camp_kcals ); - return true; - } - complain_about( "camp_larder_empty", 1_hours, "<camp_larder_empty>", false ); diff --git a/jc_stop-non-faction-npc-malnourishment.patch b/jc_stop-non-faction-npc-malnourishment.patch deleted file mode 100644 index 33781d7..0000000 --- a/jc_stop-non-faction-npc-malnourishment.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/src/npcmove.cpp -+++ b/src/npcmove.cpp -@@ -116,6 +116,14 @@ - static const efftype_id effect_onfire( "onfire" ); - static const efftype_id effect_stunned( "stunned" ); - -+const vitamin_id vitamin_calcium( "calcium" ); -+const vitamin_id vitamin_iron( "iron" ); -+const vitamin_id vitamin_vitA( "vitA" ); -+const vitamin_id vitamin_vitB( "vitB" ); -+const vitamin_id vitamin_vitC( "vitC" ); -+const vitamin_id vitamin_mutant_toxin( "mutant_toxin" ); -+const vitamin_id vitamin_bad_food( "bad_food" ); -+ - static constexpr float NPC_DANGER_VERY_LOW = 5.0f; - static constexpr float NPC_DANGER_MAX = 150.0f; - static constexpr float MAX_FLOAT = 5000000000.0f; -@@ -3856,6 +3864,14 @@ - // TODO: Remove this and let player "exploit" hungry NPCs - set_hunger( 0 ); - set_thirst( 0 ); -+ set_stored_kcal( get_healthy_kcal() ); -+ vitamin_set( vitamin_calcium, 0 ); -+ vitamin_set( vitamin_iron, 0 ); -+ vitamin_set( vitamin_vitA, 0 ); -+ vitamin_set( vitamin_vitB, 0 ); -+ vitamin_set( vitamin_vitC, 0 ); -+ vitamin_set( vitamin_mutant_toxin, 0 ); -+ vitamin_set( vitamin_bad_food, 0 ); - } - return false; - } diff --git a/jc_stop-non-faction-npc-sleep-depirvation.patch b/jc_stop-non-faction-npc-sleep-depirvation.patch deleted file mode 100644 index fb8941c..0000000 --- a/jc_stop-non-faction-npc-sleep-depirvation.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/src/npcmove.cpp -+++ b/src/npcmove.cpp -@@ -1871,6 +1871,7 @@ - if( !is_player_ally() ) { - // TODO: Make tired NPCs handle sleep offscreen - set_fatigue( 0 ); -+ set_sleep_deprivation( 0 ); - return npc_undecided; - } - diff --git a/jc_stop-sleeping-on-tables.patch b/jc_stop-sleeping-on-tables.patch deleted file mode 100644 index d60e950..0000000 --- a/jc_stop-sleeping-on-tables.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- a/src/character.cpp -+++ b/src/character.cpp -@@ -5328,20 +5328,24 @@ - } - } - // Not in a vehicle, start checking furniture/terrain/traps at this point in decreasing order -- else if( furn_at_pos != f_null ) { -+ else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 5 ) { - comfort += 0 + furn_at_pos.obj().comfort; - } - // Web sleepers can use their webs if better furniture isn't available - else if( websleep && web >= 3 ) { - comfort += 1 + static_cast<int>( comfort_level::slightly_comfortable ); -+ } else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 4 ) { -+ comfort += 0 + furn_at_pos.obj().comfort; -+ } else if( !trap_at_pos.is_null() ) { -+ comfort += 0 + trap_at_pos.comfort; - } else if( ter_at_pos == t_improvised_shelter ) { - comfort += 0 + static_cast<int>( comfort_level::slightly_comfortable ); -- } else if( ter_at_pos == t_floor || ter_at_pos == t_floor_waxed || -+ } else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 1 ) { -+ comfort += 0 + furn_at_pos.obj().comfort; -+ } else if( ter_at_pos == t_carpet_concrete || ter_at_pos == t_carpet_metal || - ter_at_pos == t_carpet_red || ter_at_pos == t_carpet_yellow || - ter_at_pos == t_carpet_green || ter_at_pos == t_carpet_purple ) { - comfort += 1 + static_cast<int>( comfort_level::neutral ); -- } else if( !trap_at_pos.is_null() ) { -- comfort += 0 + trap_at_pos.comfort; - } else { - // Not a comfortable sleeping spot - comfort -= g->m.move_cost( p ); ---- a/src/mapdata.h -+++ b/src/mapdata.h -@@ -407,7 +407,7 @@ - t_thconc_floor, t_thconc_floor_olight, t_strconc_floor, - t_floor, t_floor_waxed, - t_dirtfloor,//Dirt floor(Has roof) -- t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, -+ t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, t_carpet_concrete, t_carpet_metal, - t_grate, - t_slime, - t_bridge, ---- a/src/mapdata.cpp -+++ b/src/mapdata.cpp -@@ -490,7 +490,7 @@ - t_thconc_floor, t_thconc_floor_olight, t_strconc_floor, - t_floor, t_floor_waxed, - t_dirtfloor,//Dirt floor(Has roof) -- t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, -+ t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, t_carpet_concrete, t_carpet_metal, - t_linoleum_white, t_linoleum_gray, - t_grate, - t_slime, diff --git a/vampirism.patch b/vampirism.patch new file mode 100644 index 0000000..79487e2 --- /dev/null +++ b/vampirism.patch @@ -0,0 +1,823 @@ +--- a/src/activity_handlers.cpp ++++ b/src/activity_handlers.cpp +@@ -238,6 +238,7 @@3 + static const species_id HUMAN( "HUMAN" ); + static const species_id ZOMBIE( "ZOMBIE" ); + ++static const trait_flag_str_id trait_flag_VAMPIRE( "VAMPIRE" ); + static const trait_flag_str_id trait_flag_CANNIBAL( "CANNIBAL" ); + static const trait_flag_str_id trait_flag_PSYCHOPATH( "PSYCHOPATH" ); + static const trait_flag_str_id trait_flag_SAPIOVORE( "SAPIOVORE" ); +@@ -667,7 +667,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 +@@ -311,6 +311,9 @@ + 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_HEARING( "VAMP_HEARING" ); ++static const trait_id trait_VAMP_HUNGER( "VAMP_HUNGER" ); ++static const trait_id trait_VAMP_SKIN( "VAMP_SKIN" ); + static const trait_id trait_VISCOUS( "VISCOUS" ); + static const trait_id trait_WATERSLEEP( "WATERSLEEP" ); + static const trait_id trait_WEBBED( "WEBBED" ); +@@ -4631,6 +4631,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 ); +@@ -4661,7 +4661,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 ); + } + } +@@ -4861,15 +4861,17 @@ + void Character::check_needs_extremes() + { + // Check if we've overdosed... in any deadly way. +- if( get_stim() > 250 ) { ++ if( ( get_stim() > 250 ) && !( has_trait( trait_VAMP_SKIN ) ) ) { + add_msg_if_player( m_bad, _( "You have a sudden heart attack!" ) ); + g->events().send<event_type::dies_from_drug_overdose>( getID(), efftype_id() ); + set_part_hp_cur( bodypart_id( "torso" ), 0 ); +- } else if( get_stim() < -200 || get_painkiller() > 240 ) { ++ } else if( ( get_stim() < -200 || get_painkiller() > 240 ) && !( has_trait( trait_VAMP_SKIN ) ) ) { + add_msg_if_player( m_bad, _( "Your breathing stops completely." ) ); + g->events().send<event_type::dies_from_drug_overdose>( getID(), efftype_id() ); + set_part_hp_cur( bodypart_id( "torso" ), 0 ); +- } else if( has_effect( effect_jetinjector ) && get_effect_dur( effect_jetinjector ) > 40_minutes ) { ++ } else if( ( has_effect( effect_jetinjector ) && ++ get_effect_dur( effect_jetinjector ) > 40_minutes ) && ++ !( has_trait( trait_VAMP_SKIN ) ) ) { + if( !( has_trait( trait_NOPAIN ) ) ) { + add_msg_if_player( m_bad, _( "Your heart spasms painfully and stops." ) ); + } else { +@@ -4879,7 +4879,7 @@ + } + g->events().send<event_type::dies_from_drug_overdose>( getID(), effect_jetinjector ); + set_part_hp_cur( bodypart_id( "torso" ), 0 ); +- } else if( get_effect_int( effect_drunk ) > 4 ) { ++ } else if( ( get_effect_int( effect_drunk ) > 4 ) && !( has_trait( trait_VAMP_SKIN ) ) ) { + add_msg_if_player( m_bad, _( "Your breathing slows down to a stop." ) ); + g->events().send<event_type::dies_from_drug_overdose>( getID(), effect_drunk ); + set_part_hp_cur( bodypart_id( "torso" ), 0 ); +@@ -4985,7 +4988,7 @@ + + void Character::update_bodytemp( const map &m, const weather_manager &weather ) + { +- if( has_trait( trait_DEBUG_NOTEMP ) ) { ++ if( has_trait( trait_DEBUG_NOTEMP ) || has_trait( trait_VAMP_SKIN ) ) { + temp_cur.fill( BODYTEMP_NORM ); + temp_conv.fill( BODYTEMP_NORM ); + return; +@@ -6629,6 +6629,7 @@ + } else if( eff == effect_deaf ) { + return worn_with_flag( flag_DEAF ) || worn_with_flag( flag_PARTIAL_DEAF ) || + has_bionic( bio_ears ) || ++ has_trait( trait_VAMP_HEARING ) || + is_wearing( itype_rm13_armor_on ); + } else if( eff == effect_corroding ) { + return is_immune_damage( DT_ACID ) || has_trait( trait_SLIMY ) || has_trait( trait_VISCOUS ); + +--- a/src/character.h ++++ b/src/character.h +@@ -162,6 +162,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,8 +108,10 @@ + 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" ); + + static const trait_flag_str_id trait_flag_CANNIBAL( "CANNIBAL" ); ++static const trait_flag_str_id trait_flag_VAMPIRE( "VAMPIRE" ); + +@@ -126,6 +126,15 @@ + flag_id( "ALLERGEN_WHEAT" ), flag_id( "ALLERGEN_NUT" ) + }}; + ++static const std::array<flag_id, 12> vamp_blacklist {{ ++ flag_id( "ALLERGEN_VEGGY" ), flag_id( "ALLERGEN_FRUIT" ), ++ flag_id( "ALLERGEN_WHEAT" ), flag_id( "ALLERGEN_NUT" ), ++ flag_id( "ALLERGEN_MEAT" ), flag_id( "ALLERGEN_EGG" ), ++ flag_id( "ALLERGEN_JUNK" ), flag_id( "ALLERGEN_MILK" ), ++ flag_id( "ALLERGEN_HONEY" ), flag_id( "ALLERGEN_FOODSTUFF" ), ++ flag_id( "ALLERGEN_ALCOHOL" ), flag_id( "ALLERGEN_WATER" ) ++ }}; ++ + static const std::array<flag_id, 2> herbivore_blacklist {{ + flag_id( "ALLERGEN_MEAT" ), flag_id( "ALLERGEN_EGG" ) + }}; +@@ -712,6 +712,12 @@ + _( "Eww. Inedible plant stuff!" ) ); + } + ++ if( has_trait_flag( trait_flag_VAMPIRE ) && 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! +@@ -744,8 +744,15 @@ + } + } + ++ if( food.has_flag( flag_VAMPIRISM ) && ( !has_trait_flag( trait_flag_VAMPIRE ) && ++ !has_trait_flag( trait_flag_CANNIBAL ) ) ) { ++ add_consequence( _( "The thought of drinking human blood makes you feel sick." ), ++ edible_rating::vampirism ); ++ } ++ + const bool carnivore = has_trait( trait_CARNIVORE ); +- if( food.has_flag( flag_CANNIBALISM ) && !has_trait_flag( trait_flag_CANNIBAL ) ) { ++ if( ( food.has_flag( flag_CANNIBALISM ) && !food.has_flag( flag_VAMPIRISM ) ) && ++ !has_trait_flag( trait_flag_CANNIBAL ) ) { + add_consequence( _( "The thought of eating human flesh makes you feel sick." ), + edible_rating::cannibalism ); + } +@@ -1084,7 +1091,28 @@ + } + } + +- if( food.has_flag( flag_CANNIBALISM ) ) { ++ if( food.has_flag( flag_VAMPIRISM ) ) { ++ const bool vamp = has_trait( trait_VAMP_HUNGER ); ++ const bool cannibal = has_trait( trait_CANNIBAL ); ++ const bool psycho = has_trait( trait_PSYCHOPATH ); ++ const bool sapiovore = has_trait( trait_SAPIOVORE ); ++ if( !vamp && !cannibal && !psycho && !sapiovore ) { ++ 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 ); ++ } else if( vamp ) { ++ add_msg_if_player( m_good, _( "You relish drinking the human blood." ) ); ++ add_morale( MORALE_VAMPIRE, 30, 300 ); ++ } else if( cannibal ) { ++ add_msg_if_player( m_good, _( "You indulge your shameful hunger." ) ); ++ add_morale( MORALE_CANNIBAL, 20, 200 ); ++ } else if( psycho || sapiovore ) { ++ // Nothing - doesn't care enough to print a message ++ } else { ++ add_msg_if_player( m_bad, _( "You found a bug drinking human blood." ) ); ++ } ++ } ++ ++ if( food.has_flag( flag_CANNIBALISM ) && !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 ); +@@ -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/flag.cpp ++++ b/src/flag.cpp +@@ -15,13 +15,17 @@ + const flag_id flag_ACT_IN_FIRE( "ACT_IN_FIRE" ); + const flag_id flag_ACT_ON_RANGED_HIT( "ACT_ON_RANGED_HIT" ); + const flag_id flag_ALARMCLOCK( "ALARMCLOCK" ); ++const flag_id flag_ALLERGEN_ALCOHOL( "ALLERGEN_ALCOHOL" ); + const flag_id flag_ALLERGEN_EGG( "ALLERGEN_EGG" ); ++const flag_id flag_ALLERGEN_FOODSTUFF( "ALLERGEN_FOODSTUFF" ); + const flag_id flag_ALLERGEN_FRUIT( "ALLERGEN_FRUIT" ); ++const flag_id flag_ALLERGEN_HONEY( "ALLERGEN_HONEY" ); + const flag_id flag_ALLERGEN_JUNK( "ALLERGEN_JUNK" ); + const flag_id flag_ALLERGEN_MEAT( "ALLERGEN_MEAT" ); + const flag_id flag_ALLERGEN_MILK( "ALLERGEN_MILK" ); + const flag_id flag_ALLERGEN_NUT( "ALLERGEN_NUT" ); + const flag_id flag_ALLERGEN_VEGGY( "ALLERGEN_VEGGY" ); ++const flag_id flag_ALLERGEN_WATER( "ALLERGEN_WATER" ); + const flag_id flag_ALLERGEN_WHEAT( "ALLERGEN_WHEAT" ); + const flag_id flag_ALLERGEN_WOOL( "ALLERGEN_WOOL" ); + const flag_id flag_ALLOWS_NATURAL_ATTACKS( "ALLOWS_NATURAL_ATTACKS" ); +@@ -326,6 +330,8 @@ + const flag_id flag_USE_UPS( "USE_UPS" ); + const flag_id flag_VARSIZE( "VARSIZE" ); + const flag_id flag_VEHICLE( "VEHICLE" ); ++const flag_id flag_VAMPIRISM( "VAMPIRISM" ); ++const flag_id flag_VAMPIRISM_OK( "VAMPIRISM_OK" ); + const flag_id flag_VERY_COLD( "VERY_COLD" ); + const flag_id flag_WAIST( "WAIST" ); + const flag_id flag_WATCH( "WATCH" ); + +--- a/src/flag.h ++++ b/src/flag.h +@@ -17,13 +17,17 @@ + extern const flag_id flag_ACT_IN_FIRE; + extern const flag_id flag_ACT_ON_RANGED_HIT; + extern const flag_id flag_ALARMCLOCK; ++extern const flag_id flag_ALLERGEN_ALCOHOL; + extern const flag_id flag_ALLERGEN_EGG; ++extern const flag_id flag_ALLERGEN_FOODSTUFF; + extern const flag_id flag_ALLERGEN_FRUIT; ++extern const flag_id flag_ALLERGEN_HONEY; + extern const flag_id flag_ALLERGEN_JUNK; + extern const flag_id flag_ALLERGEN_MEAT; + extern const flag_id flag_ALLERGEN_MILK; + extern const flag_id flag_ALLERGEN_NUT; + extern const flag_id flag_ALLERGEN_VEGGY; ++extern const flag_id flag_ALLERGEN_WATER; + extern const flag_id flag_ALLERGEN_WHEAT; + extern const flag_id flag_ALLERGEN_WOOL; + extern const flag_id flag_ALLOWS_NATURAL_ATTACKS; +@@ -327,6 +331,8 @@ + extern const flag_id flag_USE_PLAYER_ENERGY; + extern const flag_id flag_USE_UPS; + extern const flag_id flag_VARSIZE; ++extern const flag_id flag_VAMPIRISM; ++extern const flag_id flag_VAMPIRISM_OK; + extern const flag_id flag_VERY_COLD; + extern const flag_id flag_VEHICLE; + extern const flag_id flag_WAIST; + +--- a/src/game.cpp ++++ b/src/game.cpp +@@ -1040,8 +1040,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_REAL_VAMP" ) ) ) { ++ if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) || ++ u.has_trait( trait_id( "THRESH_REAL_VAMP" ) ) ) ) { + vRip.emplace_back( " _______ ___" ); + vRip.emplace_back( " < `/ |" ); + vRip.emplace_back( " > _ _ (" ); + +--- a/src/item.cpp ++++ b/src/item.cpp +@@ -148,6 +148,7 @@ + static const species_id ROBOT( "ROBOT" ); + + static const trait_flag_str_id trait_flag_CANNIBAL( "CANNIBAL" ); ++static const trait_flag_str_id trait_flag_VAMPIRE( "VAMPIRE" ); + + static const bionic_id bio_digestion( "bio_digestion" ); + +@@ -1720,18 +1722,34 @@ + _( "* This food will cause an <bad>allergic reaction</bad>." ) ); + } + ++ if( food_item->has_flag( flag_VAMPIRISM ) && ++ parts->test( iteminfo_parts::FOOD_VAMPIRISM ) ) { ++ if( you.has_trait_flag( trait_flag_VAMPIRE ) ) { ++ info.emplace_back( "DESCRIPTION", ++ _( "* This food contains <good>human blood</good>." ) ); ++ } else if( you.has_trait_flag( trait_flag_CANNIBAL ) ) { ++ info.emplace_back( "DESCRIPTION", ++ _( "* This food contains <good>human flesh</good>." ) ); ++ } else { ++ info.emplace_back( "DESCRIPTION", ++ _( "* This food contains <bad>human flesh</bad>." ) ); ++ } ++ } ++ + if( food_item->has_flag( flag_CANNIBALISM ) && ++ !food_item->has_flag( flag_VAMPIRISM ) && + parts->test( iteminfo_parts::FOOD_CANNIBALISM ) ) { +- if( !you.has_trait_flag( trait_flag_CANNIBAL ) ) { ++ if( !you.has_trait_flag( trait_flag_CANNIBAL ) && !you.has_trait_flag( trait_flag_VAMPIRE ) ) { + info.emplace_back( "DESCRIPTION", +- _( "* This food contains <bad>human flesh</bad>." ) ); ++ _( "* This food contains <good>human flesh</good>." ) ); + } else { + info.emplace_back( "DESCRIPTION", +- _( "* This food contains <good>human flesh</good>." ) ); ++ _( "* This food contains <bad>human flesh</bad>." ) ); + } + } + +- if( food_item->is_tainted() && parts->test( iteminfo_parts::FOOD_CANNIBALISM ) ) { ++ if( food_item->is_tainted() && ( parts->test( iteminfo_parts::FOOD_CANNIBALISM ) || ++ parts->test( iteminfo_parts::FOOD_VAMPIRISM ) ) ) { + info.emplace_back( "DESCRIPTION", + _( "* This food is <bad>tainted</bad> and will poison you." ) ); + } +@@ -4041,6 +4059,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 +@@ -2470,6 +2470,7 @@ + // First allergens: + // An item is an allergen even if it has trace amounts of allergenic material + std::make_pair( material_id( "hflesh" ), flag_CANNIBALISM ), ++ std::make_pair( material_id( "blood" ), flag_VAMPIRISM ), + + std::make_pair( material_id( "hflesh" ), flag_ALLERGEN_MEAT ), + std::make_pair( material_id( "iflesh" ), flag_ALLERGEN_MEAT ), +@@ -2484,10 +2485,16 @@ + std::make_pair( material_id( "mushroom" ), flag_ALLERGEN_VEGGY ), + std::make_pair( material_id( "milk" ), flag_ALLERGEN_MILK ), + std::make_pair( material_id( "egg" ), flag_ALLERGEN_EGG ), ++ std::make_pair( material_id( "alcohol" ), flag_ALLERGEN_ALCOHOL ), ++ std::make_pair( material_id( "foodplace_foodstuff" ), flag_ALLERGEN_FOODSTUFF ), ++ std::make_pair( material_id( "water" ), flag_ALLERGEN_WATER ), ++ std::make_pair( material_id( "honey" ), flag_ALLERGEN_HONEY ), + std::make_pair( material_id( "junk" ), flag_ALLERGEN_JUNK ), + // Not food, but we can keep it here + std::make_pair( material_id( "wool" ), flag_ALLERGEN_WOOL ), + // Now "made of". Those flags should not be passed ++ std::make_pair( material_id( "blood" ), flag_VAMPIRISM_OK ), ++ std::make_pair( material_id( "blood" ), flag_CARNIVORE_OK ), + std::make_pair( material_id( "flesh" ), flag_CARNIVORE_OK ), + std::make_pair( material_id( "hflesh" ), flag_CARNIVORE_OK ), + std::make_pair( material_id( "iflesh" ), flag_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 +@@ -91,6 +91,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_VAMP_SKIN( "VAMP_SKIN" ); + static const trait_id trait_WEB_WALKER( "WEB_WALKER" ); + + void map::create_burnproducts( const tripoint &p, const item &fuel, const units::mass &burned_mass ) +@@ -1405,7 +1405,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_VAMP_SKIN ) ) && cur.get_field_intensity() > 1 && ( !inside || ++ one_in( 3 ) ) ) { + u.add_env_effect( effect_blind, bp_eyes, cur.get_field_intensity() * 2, 10_seconds ); + } + } +@@ -1539,7 +1539,7 @@ + // 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( STATIC( flag_id( "GAS_PROOF" ) ) ) && ++ if( !( u.has_trait( trait_VAMP_SKIN ) ) && !( u.worn_with_flag( STATIC( flag_id( "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(); + +--- a/src/memorial_logger.cpp ++++ b/src/memorial_logger.cpp +@@ -79,6 +79,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_REAL_VAMP( "THRESH_REAL_VAMP" ); + static const trait_id trait_CANNIBAL( "CANNIBAL" ); + static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" ); + static const trait_id trait_SAPIOVORE( "SAPIOVORE" ); +@@ -488,6 +488,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_REAL_VAMP ); + bool cannibal = g->u.has_trait( trait_CANNIBAL ); + bool psycho = g->u.has_trait( trait_PSYCHOPATH ); + if( g->u.has_trait( trait_SAPIOVORE ) ) { +@@ -512,6 +512,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 +@@ -36,6 +36,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_VAMP_SKIN( "VAMP_SKIN" ); + 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" ); +@@ -860,6 +860,11 @@ + if( !mutagen ) { + return; + } ++ if( has_trait( trait_VAMP_SKIN ) ) { ++ 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 ); +@@ -904,6 +904,10 @@ + { + bool force_bad = one_in( 3 ); + bool force_good = false; ++ if( has_trait( trait_VAMP_SKIN ) ) { ++ 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 +@@ -118,6 +118,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_REAL_VAMP( "THRESH_REAL_VAMP" ); + + class monfaction; + +@@ -2492,12 +2492,15 @@ + } + + if( get_killer() == &g->u && ( !guaranteed_hostile() || hit_by_player ) ) { ++ bool vampire = g->u.has_trait( trait_THRESH_REAL_VAMP ); + bool cannibal = g->u.has_trait( trait_CANNIBAL ); + bool psycho = g->u.has_trait( trait_PSYCHOPATH ) || g->u.has_trait( trait_KILLER ); + if( g->u.has_trait( trait_SAPIOVORE ) || psycho ) { + // No morale penalty + } 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 +@@ -105,6 +105,8 @@ + static const trait_id trait_SEESLEEP( "SEESLEEP" ); + static const trait_id trait_SCHIZOPHRENIC( "SCHIZOPHRENIC" ); + static const trait_id trait_THRESH_MYCUS( "THRESH_MYCUS" ); ++static const trait_id trait_THRESH_REAL_VAMP( "THRESH_REAL_VAMP" ); ++static const trait_id trait_VAMP_SKIN( "VAMP_SKIN" ); + static const trait_id trait_WATERSLEEP( "WATERSLEEP" ); + + static void eff_fun_onfire( player &u, effect &it ) +@@ -841,7 +841,9 @@ + } + + if( dur > 1800_minutes && one_in( 300 * 512 ) ) { +- if( !has_trait( trait_NOPAIN ) ) { ++ if( has_trait( trait_VAMP_SKIN ) ) { ++ return; ++ } else if( !has_trait( trait_NOPAIN ) ) { + add_msg_if_player( m_bad, + _( "Your heart spasms painfully and stops, dragging you back to reality as you die." ) ); + } else { + +--- a/src/suffer.cpp ++++ b/src/suffer.cpp +@@ -153,6 +153,8 @@ + 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_VAMP_SKIN( "VAMP_SKIN" ); + 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" ); +@@ -251,7 +251,8 @@ + if( has_trait( trait_DEBUG_STAMINA ) ) { + return; + } +- if( !has_trait( trait_GILLS ) && !has_trait( trait_GILLS_CEPH ) ) { ++ if( !has_trait( trait_GILLS ) && !has_trait( trait_GILLS_CEPH ) && ++ !has_trait( trait_VAMP_SKIN ) ) { + oxygen--; + } + if( oxygen < 12 && worn_with_flag( flag_REBREATHER ) ) { +@@ -751,7 +751,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(); + } + +@@ -778,6 +778,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() +@@ -816,7 +816,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; + } + +@@ -834,6 +834,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. +@@ -917,7 +917,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 ) { +@@ -1663,7 +1664,7 @@ + + healing_factor *= mutation_value( "mending_modifier" ); + +- if( has_trait( trait_REGEN_LIZ ) ) { ++ if( has_trait( trait_REGEN_LIZ ) || has_trait( trait_VAMP_SKIN ) ) { + needs_splint = false; + } + + +--- a/data/json/field_type.json ++++ b/data/json/field_type.json +@@ -299,7 +299,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": [ "VAMP_SKIN" ] }, + "priority": 8, + "half_life": "2 minutes", + "phase": "gas", +@@ -385,7 +385,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": [ "VAMP_SKIN" ] }, + "priority": 8, + "half_life": "10 minutes", + "phase": "gas", +@@ -414,7 +414,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": [ "VAMP_SKIN" ] }, + "priority": 8, + "half_life": "5 minutes", + "phase": "gas", +@@ -460,7 +460,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": [ "VAMP_SKIN" ] }, + "phase": "gas", + "display_items": false, + "display_field": true, +@@ -577,7 +577,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": [ "VAMP_SKIN" ] }, + "priority": 8, + "half_life": "10 minutes", + "phase": "gas", +@@ -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": [ "VAMP_SKIN" ] }, + "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": [ "VAMP_SKIN" ] }, + "priority": 8, + "half_life": "15 minutes", + "phase": "gas", +@@ -1225,7 +1225,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": [ "VAMP_SKIN" ] }, + "priority": -1, + "half_life": "10 minutes", + "phase": "gas" +@@ -1245,7 +1245,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": [ "VAMP_SKIN" ] }, + "priority": 8, + "half_life": "30 minutes", + "phase": "gas", +@@ -1267,7 +1267,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": [ "VAMP_SKIN" ] }, + "priority": 8, + "half_life": "30 minutes", + "phase": "gas", + +--- a/data/json/flags.json ++++ b/data/json/flags.json +@@ -1117,6 +1117,26 @@ + "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_WATER", ++ "type": "json_flag", ++ "context": [ "COMESTIBLE" ] ++ }, ++ { + "id": "ALLERGEN_JUNK", + "type": "json_flag", + "context": [ "COMESTIBLE" ] +@@ -1197,6 +1197,16 @@ + "context": [ ] + }, + { ++ "id": "VAMPIRISM", ++ "type": "json_flag", ++ "context": [ ] ++ }, ++ { ++ "id": "VAMPIRISM_OK", ++ "type": "json_flag", ++ "context": [ ] ++ }, ++ { + "id": "CASING", + "type": "json_flag", + "context": [ ] + +--- a/data/json/flags_mutation.json ++++ b/data/json/flags_mutation.json +@@ -128,5 +132,9 @@ + { + "id": "UNARMED_BONUS", + "type": "mutation_flag" ++ }, ++ { ++ "id": "VAMPIRE", ++ "type": "mutation_flag" + } + ] +--- 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 +@@ -180,7 +181,7 @@ + { "id": [ "FLOWERS" ], "order": 5000 }, + { "id": [ "ELFA_EARS", "FELINE_EARS", "LUPINE_EARS", "URSINE_EARS" ], "order": 5500 }, + { "id": [ "ANTENNAE", "ANTLERS", "CURVED_HORNS", "HORNS", "POINTED_HORNS" ], "order": 6000 }, +- { "id": [ "COMPOUND_EYES", "ELFAEYES", "FEL_EYE", "LIZ_EYE" ], "order": 6500 }, ++ { "id": [ "COMPOUND_EYES", "ELFAEYES", "FEL_EYE", "LIZ_EYE", "REAL_VAMP_EYES" ], "order": 6500 }, + { + "id": [ + "BEAK", |