summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjc_gargma <jc_gargma@iserlohn-fortress.net>2022-01-31 20:26:08 -0800
committerjc_gargma <jc_gargma@iserlohn-fortress.net>2022-01-31 20:26:08 -0800
commit5df800d05b7ca9e8d7d79ef33fcdcead0785b75a (patch)
tree4f49044af83273900da7a277a3e368762d0533cd
parentFix more inconsistent ammo names (diff)
downloadcataclysm-dda-5df800d05b7ca9e8d7d79ef33fcdcead0785b75a.tar.xz
Update to 0.F.3
Port various patches from BN
-rw-r--r--0.F_backport-map-note-colours.patch347
-rw-r--r--0.F_backport-tacoma-barn-door-position.patch11
-rw-r--r--0.F_backport-vehicle-heater-cooler-intensity-reduced.patch20
-rw-r--r--0001-quiverfull-house-correct-stairs.patch11
-rw-r--r--0003-inconsistent-ammo-names.patch164
-rw-r--r--0005-lumbermill-gasoline-not-spilled.patch11
-rw-r--r--0006-community-garden-fertilizer-not-spilled.patch17
-rw-r--r--0007-oxyacetylene-from-oxygen.patch12
-rw-r--r--0009-22-casings-can-stack.patch17
-rw-r--r--0010-4570-ammo-can-be-dismantled.patch34
-rw-r--r--0011-add-missing-mre.patch39
-rw-r--r--0012-fix-doors-for-npcs.patch20
-rw-r--r--0013-fix-20x66mm-loudness.patch10
-rw-r--r--0014-portable-generator-engine.patch11
-rw-r--r--PKGBUILD317
-rw-r--r--ammo-01_bugs.patch486
-rw-r--r--armor-01_ankle-ammo-pouch-is-not-a-backpack.patch (renamed from 0002-ankle-ammo-pouch-is-not-a-backpack.patch)10
-rw-r--r--armor-02_fix-survivor-fingerless-gloves-warmth.patch11
-rw-r--r--bionics-01_npc-can-use-more-bionics.patch (renamed from 0008-npc-can-use-more-bionics.patch)31
-rw-r--r--custom.patch164
-rw-r--r--etc-01_fix-rubbersplosion.patch19
-rw-r--r--etc-02_add-missing-price-postapoc.patch82
-rw-r--r--foods-01_fix-food-materials.patch44
-rw-r--r--itemgroups-01_hk46-is-milspec.patch18
-rw-r--r--itemgroups-02_fix-shelter-batteries.patch41
-rw-r--r--jc_allow-bio-firestarter-on-smoker.patch26
-rw-r--r--jc_allow-hacker-laptop.patch29
-rw-r--r--jc_ammo-loudness-ap-times-2.patch2
-rw-r--r--jc_more-military-base-overmap.patch800
-rw-r--r--jc_npc-eat-from-further-camp.patch11
-rw-r--r--jc_npcs-eat-when-hungry.patch30
-rw-r--r--jc_stop-non-faction-npc-malnourishment.patch39
-rw-r--r--jc_stop-non-faction-npc-sleep-depirvation.patch2
-rw-r--r--jc_stop-sleeping-on-tables.patch10
-rw-r--r--meds-01_antibiotics-unhealthy.patch10
-rw-r--r--mutations-01_fix-evac3-background-visible.patch10
-rw-r--r--npc-01_dialogue-fixes.patch23
-rw-r--r--recipes-01_dragon-can-be-dismantled.patch10
-rw-r--r--terrain-01_tacoma-clinic-add-missing-floor.patch (renamed from 0004-tacoma-clinic-add-missing-floor.patch)0
-rw-r--r--terrain-02_make-firestation-shelter-wells-npc-drinkable.patch (renamed from 0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch)42
-rw-r--r--tools-01_foldable-bottle-is-container.patch20
-rw-r--r--tools-02_normalize-drone-volume.patch (renamed from 0015-normalize-drone-volume.patch)18
-rw-r--r--vampirism.patch911
-rw-r--r--vehicles-01_portable-generator-engine.patch11
44 files changed, 2853 insertions, 1098 deletions
diff --git a/0.F_backport-map-note-colours.patch b/0.F_backport-map-note-colours.patch
deleted file mode 100644
index fceec60..0000000
--- a/0.F_backport-map-note-colours.patch
+++ /dev/null
@@ -1,347 +0,0 @@
---- a/data/json/overmap/map_extras.json
-+++ b/data/json/overmap/map_extras.json
-@@ -12,8 +12,8 @@
- "name": "Crater",
- "description": "There is a crater here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_crater" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "o",
-+ "color": "red",
- "autonote": true
- },
- {
-@@ -32,8 +32,8 @@
- "name": "College Kids",
- "description": "Several corpses of college kids are here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_collegekids" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "c",
-+ "color": "light_red",
- "autonote": true
- },
- {
-@@ -42,8 +42,8 @@
- "name": "Drug Deal",
- "description": "Several corpses of drug dealers are here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_drugdeal" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "d",
-+ "color": "light_red",
- "autonote": true
- },
- {
-@@ -52,7 +52,7 @@
- "name": "Roadworks",
- "description": "Roadworks are here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_roadworks" },
-- "sym": "x",
-+ "sym": "X",
- "color": "yellow",
- "autonote": true
- },
-@@ -62,8 +62,8 @@
- "name": "Road Mayhem",
- "description": "Road mayhem is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_mayhem" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "M",
-+ "color": "light_red",
- "autonote": true
- },
- {
-@@ -72,8 +72,8 @@
- "name": "Roadblock (Military)",
- "description": "This road is blocked by military.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_roadblock" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "X",
-+ "color": "red",
- "autonote": true
- },
- {
-@@ -82,8 +82,8 @@
- "name": "Roadblock (Bandits)",
- "description": "This road is blocked by bandits.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_bandits_block" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "X",
-+ "color": "red",
- "autonote": true
- },
- {
-@@ -92,8 +92,8 @@
- "name": "Minefield",
- "description": "Mines are scattered here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_minefield" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "M",
-+ "color": "red",
- "autonote": true
- },
- {
-@@ -102,7 +102,7 @@
- "name": "Supply Drop",
- "description": "Several supply crates were dropped here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_supplydrop" },
-- "sym": "x",
-+ "sym": "C",
- "color": "yellow",
- "autonote": true
- },
-@@ -112,8 +112,8 @@
- "name": "Military",
- "description": "Several corpses of soldiers are here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_military" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "m",
-+ "color": "light_red",
- "autonote": true
- },
- {
-@@ -122,8 +122,8 @@
- "name": "Helicopter Crash",
- "description": "Helicopter crashed here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_helicopter" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "X",
-+ "color": "light_blue",
- "autonote": true
- },
- {
-@@ -132,8 +132,8 @@
- "name": "Scientists",
- "description": "Several corpses of scientists are here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_science" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "s",
-+ "color": "light_red",
- "autonote": true
- },
- {
-@@ -142,8 +142,8 @@
- "name": "Portal",
- "description": "Portal is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_portal" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "P",
-+ "color": "magenta",
- "autonote": true
- },
- {
-@@ -152,8 +152,8 @@
- "name": "Portal In",
- "description": "Another portal is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_portal_in" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "P",
-+ "color": "magenta",
- "autonote": true
- },
- {
-@@ -162,8 +162,8 @@
- "name": "Anomaly",
- "description": "Some anomaly is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_anomaly" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "O",
-+ "color": "light_red",
- "autonote": true
- },
- {
-@@ -172,7 +172,7 @@
- "name": "Spider Nest",
- "description": "Spider nest is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_house_spider" },
-- "sym": "x",
-+ "sym": "S",
- "color": "yellow",
- "autonote": true
- },
-@@ -182,7 +182,7 @@
- "name": "Wasp Nest",
- "description": "Wasp nest is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_house_wasp" },
-- "sym": "x",
-+ "sym": "W",
- "color": "yellow",
- "autonote": true
- },
-@@ -192,7 +192,7 @@
- "name": "Spiders",
- "description": "This area is covered with webs. Probably spiders are nearby",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_spider" },
-- "sym": "x",
-+ "sym": "S",
- "color": "yellow",
- "autonote": true
- },
-@@ -202,8 +202,8 @@
- "name": "Shia LaBeouf",
- "description": "Cannibal is nearby.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_shia" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "c",
-+ "color": "red",
- "autonote": true
- },
- {
-@@ -212,8 +212,8 @@
- "name": "Jabberwock",
- "description": "Jabberwock is nearby.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_jabberwock" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "J",
-+ "color": "red",
- "autonote": true
- },
- {
-@@ -222,8 +222,8 @@
- "name": "Grove",
- "description": "This area is covered with a single type of trees.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_grove" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "F",
-+ "color": "light_green",
- "autonote": true
- },
- {
-@@ -232,8 +232,8 @@
- "name": "Shrubberry",
- "description": "This area is covered with a single type of shrubs.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_shrubbery" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "s",
-+ "color": "light_green",
- "autonote": true
- },
- {
-@@ -242,8 +242,8 @@
- "name": "Clearcut",
- "description": "Most trees in this area were uniformly cut down.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_clearcut" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": ".",
-+ "color": "brown",
- "autonote": true
- },
- {
-@@ -252,8 +252,8 @@
- "name": "Pond",
- "description": "Small pond is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_pond" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "p",
-+ "color": "blue",
- "autonote": true
- },
- {
-@@ -283,8 +283,8 @@
- "name": "Clay Deposit",
- "description": "Small clay deposit is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_clay_deposit" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "c",
-+ "color": "brown",
- "autonote": true
- },
- {
-@@ -293,8 +293,8 @@
- "name": "Dead Vegetation",
- "description": "Dead vegetation is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_dead_vegetation" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": ".",
-+ "color": "brown",
- "autonote": true
- },
- {
-@@ -303,8 +303,8 @@
- "name": "Dead Vegetation (Point)",
- "description": "Dead vegetation is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_point_dead_vegetation" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": ".",
-+ "color": "brown",
- "autonote": true
- },
- {
-@@ -313,7 +313,7 @@
- "name": "Burned Ground",
- "description": "Burned ground is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_burned_ground" },
-- "sym": "x",
-+ "sym": ".",
- "color": "yellow",
- "autonote": true
- },
-@@ -323,7 +323,7 @@
- "name": "Burned Ground (Point)",
- "description": "Burned ground is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_point_burned_ground" },
-- "sym": "x",
-+ "sym": ".",
- "color": "yellow",
- "autonote": true
- },
-@@ -333,8 +333,8 @@
- "name": "Marloss Pilgrimage",
- "description": "Marloss Pilgrimage is here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_marloss_pilgrimage" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "F",
-+ "color": "dark_gray",
- "autonote": true
- },
- {
-@@ -343,7 +343,7 @@
- "name": "Casings",
- "description": "Several spent casings are here.",
- "generator": { "generator_method": "map_extra_function", "generator_id": "mx_casings" },
-- "sym": "x",
-+ "sym": "C",
- "color": "yellow",
- "autonote": true
- },
-@@ -367,7 +367,7 @@
- "name": "Wasp Nest",
- "description": "A wasp nest.",
- "generator": { "generator_method": "update_mapgen", "generator_id": "mx_nest_wasp" },
-- "sym": "x",
-+ "sym": "W",
- "color": "yellow",
- "autonote": true
- },
-@@ -377,8 +377,8 @@
- "name": "Dermatik Nest",
- "description": "A dermatik nest.",
- "generator": { "generator_method": "update_mapgen", "generator_id": "mx_nest_dermatik" },
-- "sym": "x",
-- "color": "yellow",
-+ "sym": "D",
-+ "color": "brown",
- "autonote": true
- },
- {
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/0.F_backport-vehicle-heater-cooler-intensity-reduced.patch b/0.F_backport-vehicle-heater-cooler-intensity-reduced.patch
deleted file mode 100644
index c3d16d5..0000000
--- a/0.F_backport-vehicle-heater-cooler-intensity-reduced.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/data/json/emit.json
-+++ b/data/json/emit.json
-@@ -185,7 +185,7 @@
- {
- "id": "emit_heater_vehicle",
- "type": "emit",
-- "field": "fd_hot_air3",
-+ "field": "fd_hot_air2",
- "intensity": 3,
- "qty": 3,
- "chance": 100
-@@ -193,7 +193,7 @@
- {
- "id": "emit_cooler_vehicle",
- "type": "emit",
-- "field": "fd_cold_air3",
-+ "field": "fd_cold_air2",
- "intensity": 3,
- "qty": 3,
- "chance": 100
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/0003-inconsistent-ammo-names.patch b/0003-inconsistent-ammo-names.patch
deleted file mode 100644
index 4b6dcb0..0000000
--- a/0003-inconsistent-ammo-names.patch
+++ /dev/null
@@ -1,164 +0,0 @@
---- a/data/json/items/ammo/45.json
-+++ b/data/json/items/ammo/45.json
-@@ -63,7 +63,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": 0.9, "dispersion": 1.1 },
- "extend": { "effects": [ "RECYCLED" ] },
- "delete": { "effects": [ "NEVER_MISFIRES" ] }
---- a/data/json/items/ammo/223.json
-+++ b/data/json/items/ammo/223.json
-@@ -55,7 +55,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": 0.57, "recoil": 0.57, "pierce": 0.5, "dispersion": 1.2 },
- "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] },
- "delete": { "effects": [ "NEVER_MISFIRES" ] }
-@@ -82,7 +82,7 @@
- "id": "reloaded_556",
- "copy-from": "556",
- "type": "AMMO",
-- "name": { "str": "5.56 NATO, reloaded" },
-+ "name": { "str": "5.56 NATO M855A1, reloaded" },
- "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 },
- "extend": { "effects": [ "RECYCLED" ] },
- "delete": { "effects": [ "NEVER_MISFIRES" ] }
---- 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": -2, "pierce": 4, "dispersion": -10 },
-@@ -54,7 +54,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": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 },
- "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] },
- "delete": { "effects": [ "NEVER_MISFIRES" ] }
-@@ -63,7 +63,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 tracer, black powder" },
- "proportional": { "price": 0.3, "damage": 0.76, "recoil": 0.76, "pierce": 0.5, "dispersion": 1.2 },
- "extend": { "effects": [ "RECYCLED", "BLACKPOWDER", "MUZZLE_SMOKE" ] },
- "delete": { "effects": [ "NEVER_MISFIRES" ] }
-@@ -81,7 +81,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": 0.9, "dispersion": 1.1 },
- "extend": { "effects": [ "RECYCLED" ] },
- "delete": { "effects": [ "NEVER_MISFIRES" ] }
-@@ -90,7 +90,7 @@
- "id": "reloaded_762_51_incendiary",
- "copy-from": "762_51_incendiary",
- "type": "AMMO",
-- "name": { "str": "7.62x51mm incendiary, reloaded" },
-+ "name": { "str": "7.62x51mm NATO incendiary, reloaded" },
- "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1 },
- "extend": { "effects": [ "RECYCLED" ] },
- "delete": { "effects": [ "NEVER_MISFIRES" ] }
---- 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" },
- "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" ],
- "relative": { "range": -15, "dispersion": 40 },
---- 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,
-@@ -26,8 +26,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.",
- "relative": { "damage": 4, "pierce": -2 }
- },
- {
-@@ -53,13 +53,15 @@
- "copy-from": "357mag_fmj",
- "type": "AMMO",
- "name": { "str": ".357 Magnum FMJ, reloaded", "str_pl": ".357 Magnum FMJ, reloaded" },
-- "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1, "recoil": 0.9 }
-+ "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1, "recoil": 0.9 },
-+ "extend": { "effects": [ "RECYCLED" ] }
- },
- {
- "id": "reloaded_357mag_jhp",
- "copy-from": "357mag_jhp",
- "type": "AMMO",
- "name": { "str": ".357 Magnum JHP, reloaded", "str_pl": ".357 Magnum JHP, reloaded" },
-- "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1, "recoil": 0.9 }
-+ "proportional": { "price": 0.7, "damage": 0.9, "dispersion": 1.1, "recoil": 0.9 },
-+ "extend": { "effects": [ "RECYCLED" ] }
- }
- ]
---- a/data/json/items/ammo/762x25.json
-+++ b/data/json/items/ammo/762x25.json
-@@ -26,7 +26,7 @@
- "id": "762_25hot",
- "copy-from": "762_25",
- "type": "AMMO",
-- "name": { "str": "7.62x25mm FMJ hot load" },
-+ "name": { "str": "7.62x25mm FMJ" },
- "description": "A high-pressure commercial version of the 7.62x25mm cartridge, loaded with an 85 gr. FMJ bullet. It is more powerful than the original.",
- "relative": { "price": 500, "range": 2, "damage": 4, "pierce": 3 },
- "proportional": { "recoil": 1.4 }
-@@ -55,7 +55,8 @@
- "id": "reloaded_762_25",
- "copy-from": "762_25hot",
- "type": "AMMO",
-- "name": { "str": "7.62x25mm, reloaded" },
-- "proportional": { "price": 0.7, "damage": 0.9, "pierce": 0.9, "dispersion": 1.1 }
-+ "name": { "str": "7.62x25mm FMJ, reloaded" },
-+ "proportional": { "price": 0.7, "damage": 0.9, "pierce": 0.9, "dispersion": 1.1 },
-+ "extend": { "effects": [ "RECYCLED" ] }
- }
- ]
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/0009-22-casings-can-stack.patch b/0009-22-casings-can-stack.patch
deleted file mode 100644
index 4085863..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
-@@ -32,13 +32,9 @@
- {
- "id": "22_casing_new",
-+ "copy-from": "casing",
- "type": "GENERIC",
-- "category": "spare_parts",
-- "price": 100,
- "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",
- "weight": "1 g"
- },
diff --git a/0010-4570-ammo-can-be-dismantled.patch b/0010-4570-ammo-can-be-dismantled.patch
deleted file mode 100644
index 3681df5..0000000
--- a/0010-4570-ammo-can-be-dismantled.patch
+++ /dev/null
@@ -1,34 +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 ] ] ]
- },
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/PKGBUILD b/PKGBUILD
index b7ecadc..82ef5d9 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -4,16 +4,16 @@
# # I maintain this because:
# Arch version lacks additional optimization and hardening flags
# Arch version has non-functional desktop file
-# Arch version lacks the MSX++UnDeadPeopleEdition Legacy tileset
+# Arch version lacks the MSX++UnDeadPeopleEdition tileset
# Arch version lacks the @ soundpack
# Arch version lacks the CO.AG musicpack
pkgbase=cataclysm-dda
pkgname=(cataclysm-dda cataclysm-dda-tiles)
pkgname=cataclysm-dda
-pkgver=0.E.3
-_pkgver=0.E-3
-pkgrel=2.10
+pkgver=0.F.3
+_pkgver=0.F-3
+pkgrel=1
pkgdesc="A post-apocalyptic roguelike."
#url="http://cataclysmrl.blogspot.com/"
#url="http://www.cataclysm.glyphgryph.com/"
@@ -27,74 +27,86 @@ source=("$pkgname-$_pkgver.tar.gz::https://github.com/CleverRaven/Cataclysm-DDA/
"cataclysm-dda.desktop"
"cataclysm-dda-tiles.desktop"
- "0.F_backport-vehicle-heater-cooler-intensity-reduced.patch"
- "0.F_backport-tacoma-barn-door-position.patch"
- "0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch"
- "0.F_backport-map-note-colours.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-ammo-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"
+ "ammo-01_bugs.patch"
+
+ "armor-01_ankle-ammo-pouch-is-not-a-backpack.patch"
+ "armor-02_fix-survivor-fingerless-gloves-warmth.patch"
+
+ "bionics-01_npc-can-use-more-bionics.patch"
+
+ "foods-01_fix-food-materials.patch"
+
+ "itemgroups-01_hk46-is-milspec.patch"
+ "itemgroups-02_fix-shelter-batteries.patch"
+
+ "meds-01_antibiotics-unhealthy.patch"
+
+ "mutations-01_fix-evac3-background-visible.patch"
+
+ "npc-01_dialogue-fixes.patch"
+
+ "recipes-01_dragon-can-be-dismantled.patch"
+
+ "terrain-01_tacoma-clinic-add-missing-floor.patch"
+ "terrain-02_make-firestation-shelter-wells-npc-drinkable.patch"
+
+ "tools-01_foldable-bottle-is-container.patch"
+ "tools-02_normalize-drone-volume.patch"
+
+ "vehicles-01_portable-generator-engine.patch"
+
+ "etc-01_fix-rubbersplosion.patch"
+ "etc-02_add-missing-price-postapoc.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_more-military-base-overmap.patch"
+ "jc_npc-eat-from-further-camp.patch"
- "custom.patch"
+ "vampirism.patch"
- "cataclysm-dda-tileset_undeadpeople-legacy.tar.xz::https://library.iserlohn-fortress.net/cataclysm-dda-tileset_undeadpeople-legacy.git/snapshot/cataclysm-dda-tileset_undeadpeople-legacy-master.tar.xz"
"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_vampire-stuff-redone-tileset.tar.xz::https://library.iserlohn-fortress.net/cataclysm-dda-mod_vampire-stuff-redone-tileset.git/snapshot/cataclysm-dda-mod_vampire-stuff-redone-tileset-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"
)
-b2sums=('7a825d8ce8827ccb45afb6005d4f33c6810e33e2fa375f2f7d1c878565fd61e00362e0dd45e3d81a46b908b08e07b58a11a42ece4dd306f3e282805da121299f'
+b2sums=('2e715ff131ce654b0ad6f18cb465b80ab55a09e5d48434a7d209454c9a2a952970f572bb81539bf071efe1292310f5b922c75a6c86ba360cca13dbeb91e13996'
'8cff87d80bf30b86f995f77a97cc1ddb7b809148d100f3c0d74e706fe59eac52de55710fb7aed1abd59836c05f2474c7d68455736aac4f229d1cdf806d7240a1'
'8ffff827ed464af678497da5129eb69d3d1a4c6994bbcc00ef7f7b240cd04e7961c3c0ac52d6940252241406c04e647fac19c9327847afced33988eb15973ba8'
- '3659d59eec3167bdb647cb622f15fe899516980ac92972393589574db23a580368b449812ec75ec74cfb86082a1c12896fc9f26b7c16c36ed9ad8506d41eac67'
- 'ce0dd5121e814e0fcd79d68362c80a83bfe70f970be9d5d6f6fe5f6a56ed3f041be4d560aaf02225c3ce7c457dc63bc3adf0709d4b89a81c18184ff5341eb5d3'
- '2cdcf9ab03eb92f384caf1a2d90f82c75f880cb6286811e83217c883e421c116e7844ca193a010dc35e12eec46ede3663171a2f45f660ef5a8be95c474f61bfc'
- 'd429bdf583ba6a69814f3a33a983650bcaa61b8edaed6560491972478515adb996482af248b10df8b4435bfad487ecba6c2ca0a249a4daee54994117a2742055'
- '8232c6a10fd1f608304982ae7f03eb8afc663be76cdc00aee46ecb58de838e21fdc8673841266ccd00153263f7b15b59dcd1fc6ece86834509d7ccb2cacf08fa'
- '025213998583972e7551bd7bd7376ab65857e28d4338fab60ae792a6b3bd48983aec77e5143baaa63d4f3feb7cd590c4bded529c410e4d18f2b8c5813f25daa3'
- '33a6f33ca9066ea7e190f017e0d57bd23b0ffb458944bd2a6f20f04ec7e1db43c34b64e606f2c0207ce500957230325116e9e00d92c51be280bda899c34d5580'
+ 'f71229fbaf2260602909187ba3894423a04c8625dc41813f2898faf4dcbeb6053007ea082201b1be68a59f6cbfd67e9e6a00d293e77c2f6bc1e225e3dc09ef9c'
+ '7ca2d6bbccb4ecb6495d9b7cc114194364c454f40163ac9420c5dceb2027429c9737bb837748987bf8e8b3143bef25552fc9bd7ae5d25a31f8df94ecb093bdc2'
+ 'a00106a04f63aeed03a81fb2a3ca6f321fa5c21d0d342753a56c9cccc9000dda9d6e2204368f00aa37c75ce35967b9ea2537b3e7a48ce6a486343c8c2d7f239f'
+ '900ec02ec9ec29a0b56341bbc9e947821e4c2c1f3e8914b2e59f317a2860d5b989afe5d1cd8585c60eb13b546167294a9253ad87a64775ad1d7152854bf6707a'
+ 'dd9026522976071a8cece8b935ab494e6a0e129b9242b043be3fbaa1478f75bedfbfab662d6286012fd5849e7b6bc097dea5de085d556bbfe1420d41ebddf81f'
+ '4d91e3555c0979bb59f8841588aefcb041e04b035931ec95bea519cb2c6df49e72029fa38104b7c80c157114d62203ce57b877dc338f3d2b8a6a5fb5dcef4784'
+ '31294c958b9c3d73cf460682f4a1260392b4e87fc04417e0d4ba02be73c3bd43f84537b30bcab09b7879f58c51cc2191d34ccef2f5fcec4d3dad7b1c522146e6'
+ '8c946f6f8302b7d184663d79805be93f22578ce11c18f7dbe8fabdddf85cd1cc0617af180fec1cbf3419e310fe57b510b9b961ba2b16c93ef8a66e45258d326e'
+ '33cbee2d251a4abf2ec507b31245205877d47152bd39000ea3058089b1fa45bbcb3624a7bbc58f394b1dd9710290f99c1708e3ece8221c71d760d67ff6965449'
+ '794ac1cfe88250e1717f3093ce999b1bd2cfaaaa3800d7ad0a13b720efbcc2795ed8c82d558b6b5909a8359178c70f21fe41b1c9ffe726a7a89537140801ef90'
+ 'd6421c0f12e7c1a08eee1918c349e7d88e21d5ab980a65ad5798ef3b61319bd4570ecaf8d007d9905f471b623c3633a31c471f34fe5955a8f71229dc0bc52dda'
'b8a64accada87ee5be989c5307805610c9b5c0327bc107aab237ac3225dd9e4c51b6c79a2a7de15fe187d3c32d7cbe1c462f9b0e9fb5d5a55a74236c7061e96e'
- '85aeb5920ee5879848be4057324153a077fe907bed527ed8f9b80a3c5ee1ef64786f63ee2999f5ba74e80a43e99ded3280ce27759c1f7b73259a6e2b5e584aa8'
- '58a94409205f7b670ab5745b8cbc234a38efd6a6217cef4efb7e397f091092e3e0c7790706b0a42accaa83d7509b8e244a98b9f0ba78349ee85f3164745c3501'
- 'd34d673fe04d4317ef3c1ac3f088b6614f7c20414cfe44aa0ff71bdc932c517c4e6295492f158ced84232af8f54d1672ae56078b156593d58bf8fe7ffc3d475d'
- '23a13fccf6514caa6ca23476fe2ce6df180720038c4bb2caa971ef42b31f214b07ed95650d2cb3df173590c8bec02986aced516a6b266cff557b5dcfb7d8ce48'
- 'dd36b2b64e4999c0f188c837dae1f9c76d537a08b1c5996827a4d3028b688fe023be3711380189ed5c05316b17d6ab3e59669114ec699a3a0ee32808394ad12c'
- 'c0d32a5edb420de5b2d95d1fed8753e9a6f45ab406aa2861dd5f038409c762ab40acdeec64b51713b71aa1453c0489a62af76534652a5c4d9634ac7e0eb431b4'
- '417cd957f188b2b06e41d5413bea5f13481c6d5bfa8f184157379d5ac2afa9ba6f7ebc966856f50603f89b9173b6fbfdb3ccf4e3cc0b1bedb53f935591e4a35c'
- '80da2c341d8564a47bc460fcdaf9196ac3bb77f0f2ba56bd71089e80e7481728a3ccbdcfcbc3bf70a9c9e5d9d9b01f2ca6615b67c7ab61003808ce00f6545ba3'
- 'c1b6e59c840aee812570d9fb30f045b371473282c2289aaefe66483e6aae995fb93549882811fcb869d77f1c27a62ba4e486a8e20327846fd0602926739296ae'
- '74a51f04237fba3caa25b2e0d49659f2e8330ce82288de866943d06b53690f31d48a77a4dd2e57db1f435b715fbca792268f2e191ffb59e57170d327ed41ac0a'
- '8203bb062d72559da908a5020963503303c0aaa4a2ab61e57cfb713f58de40f1cb50b8b6dfbeec3a9addc41cbec5ae17fbf57230c3614f9b69fe6b0c55bf3fad'
- '92cde696eec00e6758b58e73e8bc60ad1a73bb2a18d4fdfd24a19b5be715305a047943a02d94a9703c101ca0c769dbeb816f1f28809345bae0fec42fbc27bb34'
- 'c2ff7458d4f71a3c328a49795804b89c75ac6c4f4ec193c899501346afdba9673b8624bf60ffa3aea5256412248ff304e8731914971b074aee644b2c465ac483'
- 'b256081baa22b6c0f2a56c4151393146451fe119cd724fc4d883331643e420348e6e6c54c4f32e34d287090e917f9223cac23b6275677e4c3d23cf4b38229904'
- 'ce82294e480ad42f0001c799fd8131b60024b6097653f3c57564c75e54596616e376f0d7f1cf4e54d8c302a61ef164b4323f795bfa19b2c13ab9e927d37f1600'
- 'd723fcc6cce65aa296bc519a07a5d003122ad698a73a3d046dac3780ea5a00fef28f78da251bb46f80f2e0577baa26a6ae13cabf525f22a7a742435e95716dae'
- '8e5dbd01fff578c594b14f13c9108857888fe31169683692c17d813ccbac735c0cd68ac07b6c8351ea59457effa8f758b542f5e2c0a07568cb53b0a448c1620e'
- 'b6a6c9c1791bc625b773aa1d0b90f98f0821aa06807353f1c179cbbb9090391e9ab7fe8d567a029bcf94dddf31c40d3e525d1033d2de81520726c0e69021f278'
- '89a5a7548bb0d47c78e12db3c915f1f9647ebba66baf8e3f4ab9579f8023585a1ca8e4c33224b4290d37a6b97aaa2bca3d785b1c6a066a661fac80d80c4dea21'
- '020f01c7cafede24e9eca44facf3beb638b51248ece3ff0d6f27af385c980c4a4c31cd9d69f1082c0204d13cddc39415c72d88e489ef689d72e35f6070f60b40'
- 'f54bb10b6c5920b22942b1e312c315280afb720d3a897dce9333563cae3343668460d24b7d01bf36768974c729d92177e886f5ee0d22d746b19454a2ab6208fb'
+ '531f35be92feecdcc78faf4f76a538a075a144848b122616594eef7a0954aa6e2876f0007635a92f4be635060d0b58d943cd99dcec2889031363f7dd8d3bc58d'
+ '71ddf9190b79669f7e63973ce5b4b3fe0de5d78f52bd76fbe63608a5f330ea757458af2172d5588b59ba48f99c6f43ec051a066ff6bc07c13dd2c5e05d8161f7'
+ '8d6fd37497c2ce3c6e65933dded7cd27e165e74ce92cef01b4f1522cd550c8a4f227434d3e566f94e493c385226cf6ff52374d05686b203fd28fdca3babb471c'
+ 'b5567d516b344ceb382bb0253e2b87c90ddc5379afb76a7d384aec0829a6d8a3de2a1f55740871cd286a8cfa23ca635ee9e3f81faa9839dc10fb209955b63c78'
+ '22779d1418f24d382431078a3fe35790edbbcfa94ed4c9bf2b2698fe00dbe87466c3dc460b3f02710440db63cf1aa255ab6cf589b06d1e0cf49f512657d588b1'
+ '75b1410a950f3d964ed8b610af86f1a60f22ce4a4ebf242370a76e1c66f913c287f1b02dfa77c6d5901c77b060b6f432df06ed322b26fa71d180775f64afc57b'
+ '623a0b62417b626817e33f376c14df69211313388ab65451f5eec0c512ee61bfe54871e57f3a6d873392110b538ea7ad18d5e8ac100a71f7fc036a6818d602c2'
+ 'fd1fabe15fa3127cfa2b5e60928ee9b48a98bd6e1e5f8f66a3f6625e7d7e076e7eae3048f1bb5a8b4c554679b4a28de30b97eedcb979050d9115c1f2685aae7d'
+ 'f346172ac4fdac9ffd7000901f6b145ff45df8abf6c8d495204c08af1e9a34809259819925ebbd0a1e54336701a1d0409671acae6c7c538dfd77ab4d4a506be1'
+ '8bb83ab44365599cd58efef13ad0ddf7e6fbc62bf09523c029323efe2bfe2e80ed42dfbd790ade66d26e35e59de623133edb51b0a6dd81637928c205a08c1fc8'
+ 'd5287ddb4c38fbca9e6440e5243c718437660c9cf20a836baf1569575f6d953de8995641e6ec20a2a8859b9eefb5b975c416c4fe6f92f0916a5e21c3328d4fce'
+ '4e40bc796ebd7941f76d9f11cfa62d7fa6d83c386f325bbec7f2cac99619c059cbf4611fb40ca0d78c8aa2cd3dd15a14de1f144d6f853e96939924caa87dac75'
+ '831acc3935f1554a8385c804138a3d83423c5843824e7fbe01334c5d07accd826d9e14805584e6b91d9c6cdc4dbed99ffe32763440da07479f4f5480fbdb941b'
+ 'f13c5d89fdaf60621297e86537fc84992bec9d60446dfe41731abde53997223094b91cbf8173636241bc17ebd1f28cf3a33ece604ae67ea0b3c9b6a128c182f6'
+ 'a52e780086bfbc44e02de637ec03e99f4aacfc7471f9bc6f8650ad5b36694e4d17a2dcbbf8838e6ed2cd7ef85f43e82035771ad7f283c66dd55e2e4c4358ab84'
+ 'ea1ab36365d19be71bd6052e98082a8feb6bbdbe487e8e5795143ceb495059d157b034834bd532a80ccc5a16daa3c355dd56316a27936d441b7c9cc85e40f450'
+ 'a56efdaae0344726debf5b74846edce8df7aa2357fbc7a05a3d369d1f457b02934a0d0ce2330072e03f1ac901e06e333c9393f795c761f8440307e7649ed5596'
+ '9d0e17552338c9d92ff696f1834a5d99c29d5dfbab6903b620410f62527a0ba60720c9ceec8e203b737f784ade8a53dbaca428ac7cc439f3f4f765aac7f1170f'
'b9309da09b165fb57e83f84e3584d2479bd3336ed86e181e5df2d27daa92bd55d03d7f3fc226f03696af5f0f32d8e0e7ecd26ae7e50eed0200d0b0feaad07efb')
prepare() {
@@ -105,107 +117,179 @@ prepare() {
sed -i 's/-Os/-O3/' Makefile
- # Backports from 0.F
- # Fix Vehicle Heater and Cooler to be less severe
- patch -Np1 -i "$srcdir"/0.F_backport-vehicle-heater-cooler-intensity-reduced.patch
+ # # # Hotfixes
+ #echo "Applying hotfixes"
+
- # Fix tacoma barn doors being placed in the same spot twice
- patch -Np1 -i "$srcdir"/0.F_backport-tacoma-barn-door-position.patch
+ # # # Various fixes for bugs I came across
+ # # Ammo fixes
+ echo "Applying ammo fixes"
+ # Fix mulitple inconsistent ammuntion names and handloaded status.
+ # Also Change reloaded_50bmg to be based on 50bmg: The id and description make it pretty clear that reloaded_50bmg is not supposed to be based on Match rounds.
+ # Also set a fixed loudness of 20x66mm shotgun shells like that of other shotguns: Other shotguns have fixed loudness to work around how the short range factors causes them to be far quieter than one would otherwise expect.
+ # Also fix ammo ordering so as to not prevent those items being modded: Having copy-from items occuring earlier in a json than the item being copied from prevents items based on it being modified.
+ patch -Np1 -i "$srcdir"/ammo-01_bugs.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
- # Map note colour and symbols
- patch -Np1 -i "$srcdir"/0.F_backport-map-note-colours.patch
+ # # armor fixes
+ echo "Applying armor fixes"
+ # Fix Ankle Ammo Pouch to not look like a backpack:
+ # SDG added a tile for ammo pouches to bypass this bug, but this fix still makes sense.
+ patch -Np1 -i "$srcdir"/armor-01_ankle-ammo-pouch-is-not-a-backpack.patch
+ # Fix fingerless survivor gloves losing base warmth:
+ # They lose warmth already from the lack of coverage, no need to double up.
+ patch -Np1 -i "$srcdir"/armor-02_fix-survivor-fingerless-gloves-warmth.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
+ # # bionics fixes
+ echo "Applying bionic fixes"
+ # Fix npc not being able to install some additional CBMs:
+ # ie, soporific inducer, gasoline fuel cell, enhanced hearing, surgical scalpels.
+ patch -Np1 -i "$srcdir"/bionics-01_npc-can-use-more-bionics.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
+ # # food fixes
+ echo "Applying food fixes"
+ # Fix several foods not being marked as the correct material:
+ # This prevents odd outcomes such as carnivores drinking almond/soy milk and eating peanut butter.
+ patch -Np1 -i "$srcdir"/foods-01_fix-food-materials.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
+ # # itemgroups fixes
+ echo "Applying itemgroup fixes"
+ # Stop police and SWAT carrying 4.6mm magazines despite having no compatible weapons:
+ # The H&K UCP was removed from the base game some time ago.
+ patch -Np1 -i "$srcdir"/itemgroups-01_hk46-is-milspec.patch
- # Fix oxyacetylene to be craftable from oxygen tanks
- patch -Np1 -i "$srcdir"/0007-oxyacetylene-from-oxygen.patch
+ # Fix items in unlooted, unused lockers and cabinets missing batteries:
+ # They need to be marked as the battery contained inside the item.
+ patch -Np1 -i "$srcdir"/itemgroups-02_fix-shelter-batteries.patch
+
+
+ # # monster fixes
+ echo "Applying medicine fixes"
+ # Add -4 health to antibiotics:
+ # weak are -2, strong are -10, this feels like a nice middle ground.
+ patch -Np1 -i "$srcdir"/meds-01_antibiotics-unhealthy.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
+ # # monster fixes
+ #echo "Applying monster fixes"
- # Fix reloaded 45-70 rounds not allowing dismantling when every other non-caseless does
- patch -Np1 -i "$srcdir"/0010-4570-ammo-can-be-dismantled.patch
- # Fix the pepperjack beef and burrito bowl MREs never dropping
- patch -Np1 -i "$srcdir"/0011-add-missing-mre.patch
+ # # mutation fixes
+ echo "Applying mutation fixes"
+ # Fix Evacuee 3 background 3 being player visible:
+ # It was missing "player_display": false
+ patch -Np1 -i "$srcdir"/mutations-01_fix-evac3-background-visible.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
+ # # npc fixes
+ echo "Applying NPC fixes"
+ # Assorted typos in NPC dialogue.
+ patch -Np1 -i "$srcdir"/npc-01_dialogue-fixes.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
- # Normalize the manhack volumes to that of the base grenade/explosive
- patch -Np1 -i "$srcdir"/0015-normalize-drone-volume.patch
+ # # recipe fixes
+ echo "Applying recipe fixes"
+ # Fix reloaded dragon shot not allowing dismantling when every other non-caseless round does.
+ patch -Np1 -i "$srcdir"/recipes-01_dragon-can-be-dismantled.patch
- # Various other fixes for bugs I came across that modify src
- # Fix ammo loudness mulitplying by six instead of two
+ # # terrain and overmap fixes
+ echo "Applying terrain and overmap fixes"
+ # Fix missing floor in the tacoma clinic:
+ # The hospital is still a mess. :/
+ patch -Np1 -i "$srcdir"/terrain-01_tacoma-clinic-add-missing-floor.patch
+
+ # Fix npcs unable to drink from firestation and shelter basecamps wells:
+ # They were missing the water_well blueprint_provides.
+ patch -Np1 -i "$srcdir"/terrain-02_make-firestation-shelter-wells-npc-drinkable.patch
+
+
+ # # tool fixes
+ echo "Applying tool fixes"
+ # Mark the foldable plastic bottle and steel water bottle as containers:
+ # Being counted as tools didn't seem to fit their role.
+ patch -Np1 -i "$srcdir"/tools-01_foldable-bottle-is-container.patch
+
+ # Normalize the manhack volumes to that of the base grenade/explosive:
+ # I don't see how a c-4 manhack could be 1/4 the volume of a stick of c-4.
+ # Grenade hacks were also thrice as big as the base grenade.
+ patch -Np1 -i "$srcdir"/tools-02_normalize-drone-volume.patch
+
+
+ # # vehicle fixes
+ echo "Applying vehicle fixes"
+ # Replace the portable generator twin engine with a large 1 cylinder:
+ # This way it can actually function as is.
+ patch -Np1 -i "$srcdir"/vehicles-01_portable-generator-engine.patch
+
+
+
+ # # Uncategorized for now
+ echo "Applying uncategorized fixes"
+ # Fix rubber items dismantling into 10x item volume of rubber.
+ patch -Np1 -i "$srcdir"/etc-01_fix-rubbersplosion.patch
+
+ # Add price_postapoc to a number of items that did not have one set.
+ patch -Np1 -i "$srcdir"/etc-02_add-missing-price-postapoc.patch
+
+
+ # # # Various other fixes for bugs I came across that modify src
+ echo "Applying source code fixes"
+ # 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
+ # 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
+ # Fix Non-Player facton NPCs from becoming sleep deprived.
patch -Np1 -i "$srcdir"/jc_stop-non-faction-npc-sleep-depirvation.patch
- # Fix NPCs preferring tables to cots or woodstoves to the floor
+ # 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
+
+ # Port the revised military base layout from BN to DDA
+ # Expand the overmap tiles for the miltiary base to be less MMMM
+ patch -Np1 -i "$srcdir"/jc_more-military-base-overmap.patch
+
+ # Allow npcs to pull food from the camp larder at the full range of tiles camp actions can be assigned from:
+ # Should allow bases larger than 3x3 to have less food micromanagment for NPCs.
+ patch -Np1 -i "$srcdir"/jc_npc-eat-from-further-camp.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 -i "$srcdir"/vampirism.patch
}
build() {
cd "Cataclysm-DDA-$_pkgver"
#export CFLAGS="$CFLAGS -fPIE"
- export CXXFLAGS="$CXXFLAGS -fPIE"
+ export CXXFLAGS="$CXXFLAGS -flto=auto -flto-odr-type-merging -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 ZLEVELS=1 LTO=1 LOCALIZE=1 LANGUAGES=all
- make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 ZLEVELS=1 LTO=1 LOCALIZE=1 LANGUAGES=all TILES=1 SOUND=1
+ make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 RUNTESTS=0 LOCALIZE=1 LANGUAGES=all
+ make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 RUNTESTS=0 LOCALIZE=1 LANGUAGES=all TILES=1 SOUND=1
./lang/compile_mo.sh
}
package_cataclysm-dda() {
cd "Cataclysm-DDA-$_pkgver"
- make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 ZLEVELS=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 install
# Docs
install -d "$pkgdir/usr/share/doc/cataclysm-dda"
@@ -236,18 +320,15 @@ package_cataclysm-dda-tiles() {
depends=('cataclysm-dda' 'sdl2_image' 'sdl2_ttf' 'freetype2' 'sdl2_mixer')
cd "Cataclysm-DDA-$_pkgver"
- make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 ZLEVELS=1 TILES=1 SOUND=1 LTO=1 LOCALIZE=1 LANGUAGES=all install
+ make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 LOCALIZE=1 LANGUAGES=all 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 'build-data/osx/AppIcon.iconset/icon_128x128.png' "$pkgdir/usr/share/icons/hicolor/128x128/apps/$pkgname.png"
+ install -D 'build-data/osx/AppIcon.iconset/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"
- # Tilesset (Legacy)
- mv "$srcdir/cataclysm-dda-tileset_undeadpeople-legacy-master" "$srcdir/undeadpeople-legacy"
- cp --reflink -r "$srcdir/undeadpeople-legacy" "$pkgdir/usr/share/cataclysm-dda/gfx"
# Tileset
mv "$srcdir/cataclysm-dda-tileset_undeadpeople-master" "$srcdir/undeadpeople"
diff --git a/ammo-01_bugs.patch b/ammo-01_bugs.patch
new file mode 100644
index 0000000..3b13277
--- /dev/null
+++ b/ammo-01_bugs.patch
@@ -0,0 +1,486 @@
+--- a/data/json/items/ammo/20x66mm.json
++++ b/data/json/items/ammo/20x66mm.json
+@@ -1,5 +1,54 @@
+ [
+ {
++ "id": "20x66_shot",
++ "type": "AMMO",
++ "name": { "str_sp": "20x66mm buckshot" },
++ "//": "2.5x the Generic Rate of $1/shot",
++ "description": "20x66mm caseless shotgun rounds, buckshot type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.",
++ "weight": "56 g",
++ "volume": "415 ml",
++ "price": 1500,
++ "price_postapoc": 4000,
++ "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
++ "material": [ "steel", "powder" ],
++ "symbol": "=",
++ "color": "pink",
++ "count": 20,
++ "stack_size": 20,
++ "ammo_type": "20x66mm",
++ "range": 12,
++ "damage": { "damage_type": "bullet", "amount": 60 },
++ "recoil": 2500,
++ "loudness": 160,
++ "effects": [ "COOKOFF", "SHOT", "NEVER_MISFIRES" ]
++ },
++ {
++ "id": "20x66_flechette",
++ "copy-from": "20x66_shot",
++ "type": "AMMO",
++ "name": { "str": "20x66mm flechette" },
++ "description": "20x66mm caseless shotgun rounds, flechette type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.",
++ "price": 4000,
++ "price_postapoc": 4000,
++ "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
++ "count": 10,
++ "relative": { "damage": { "damage_type": "bullet", "amount": -10, "armor_penetration": 20 } }
++ },
++ {
++ "id": "20x66_slug",
++ "copy-from": "20x66_shot",
++ "type": "AMMO",
++ "name": { "str": "20x66mm slug" },
++ "description": "20x66mm caseless shotgun rounds, solid projectile type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.",
++ "price": 1500,
++ "price_postapoc": 4000,
++ "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
++ "damage": { "damage_type": "bullet", "amount": 39, "armor_penetration": 8 },
++ "relative": { "range": 12 },
++ "proportional": { "dispersion": 1.3 },
++ "delete": { "effects": [ "SHOT" ] }
++ },
++ {
+ "id": "20x66_beanbag",
+ "copy-from": "20x66_shot",
+ "type": "AMMO",
+@@ -74,18 +123,6 @@
+ "effects": [ "NO_EMBED" ]
+ },
+ {
+- "id": "20x66_flechette",
+- "copy-from": "20x66_shot",
+- "type": "AMMO",
+- "name": { "str": "20x66mm flechette" },
+- "description": "20x66mm caseless shotgun rounds, flechette type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.",
+- "price": 4000,
+- "price_postapoc": 4000,
+- "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+- "count": 10,
+- "relative": { "damage": { "damage_type": "bullet", "amount": -10, "armor_penetration": 20 } }
+- },
+- {
+ "id": "20x66_frag",
+ "copy-from": "20x66_slug",
+ "type": "AMMO",
+@@ -109,41 +146,5 @@
+ "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+ "count": 10,
+ "extend": { "effects": [ "INCENDIARY" ] }
+- },
+- {
+- "id": "20x66_shot",
+- "type": "AMMO",
+- "name": { "str_sp": "20x66mm buckshot" },
+- "//": "2.5x the Generic Rate of $1/shot",
+- "description": "20x66mm caseless shotgun rounds, buckshot type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.",
+- "weight": "56 g",
+- "volume": "415 ml",
+- "price": 1500,
+- "price_postapoc": 4000,
+- "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+- "material": [ "steel", "powder" ],
+- "symbol": "=",
+- "color": "pink",
+- "count": 20,
+- "stack_size": 20,
+- "ammo_type": "20x66mm",
+- "range": 12,
+- "damage": { "damage_type": "bullet", "amount": 60 },
+- "recoil": 2500,
+- "effects": [ "COOKOFF", "SHOT", "NEVER_MISFIRES" ]
+- },
+- {
+- "id": "20x66_slug",
+- "copy-from": "20x66_shot",
+- "type": "AMMO",
+- "name": { "str": "20x66mm slug" },
+- "description": "20x66mm caseless shotgun rounds, solid projectile type. Proprietary ammunition for Rivtech shotguns. Being caseless rounds, these cannot be disassembled or reloaded.",
+- "price": 1500,
+- "price_postapoc": 4000,
+- "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+- "damage": { "damage_type": "bullet", "amount": 39, "armor_penetration": 8 },
+- "relative": { "range": 12 },
+- "proportional": { "dispersion": 1.3 },
+- "delete": { "effects": [ "SHOT" ] }
+ }
+ ]
+--- a/data/json/items/ammo/22.json
++++ b/data/json/items/ammo/22.json
+@@ -1,28 +1,5 @@
+ [
+ {
+- "id": "22_cb",
+- "copy-from": "22_lr",
+- "type": "AMMO",
+- "name": { "str_sp": ".22 CB" },
+- "description": "The .22 Conical Ball is a variety of .22 ammunition that propels its bullet using a primer instead of gunpowder. The end result is a subsonic round that is so weak as to be nearly useless given your predicament.",
+- "price": 100,
+- "price_postapoc": 1000,
+- "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+- "count": 100,
+- "stack_size": 150,
+- "recoil": 39,
+- "proportional": { "range": 0.6, "damage": { "damage_type": "bullet", "amount": 0.5 }, "dispersion": 1.2 },
+- "extend": { "effects": [ "NOGIB" ] }
+- },
+- {
+- "id": "22_fmj",
+- "copy-from": "22_lr",
+- "type": "AMMO",
+- "name": { "str_sp": ".22 FMJ" },
+- "description": ".22 Long Rifle ammunition with 30gr FMJ bullets. The .22LR round is extremely weak with very low stopping power, short range, and negligible recoil. It is most useful for rifle training, and hunting small animals.",
+- "relative": { "damage": { "damage_type": "bullet", "amount": -1, "armor_penetration": 2 } }
+- },
+- {
+ "id": "22_lr",
+ "type": "AMMO",
+ "name": { "str_sp": ".22 LR" },
+@@ -46,6 +23,29 @@
+ "effects": [ "COOKOFF" ]
+ },
+ {
++ "id": "22_cb",
++ "copy-from": "22_lr",
++ "type": "AMMO",
++ "name": { "str_sp": ".22 CB" },
++ "description": "The .22 Conical Ball is a variety of .22 ammunition that propels its bullet using a primer instead of gunpowder. The end result is a subsonic round that is so weak as to be nearly useless given your predicament.",
++ "price": 100,
++ "price_postapoc": 1000,
++ "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
++ "count": 100,
++ "stack_size": 150,
++ "recoil": 39,
++ "proportional": { "range": 0.6, "damage": { "damage_type": "bullet", "amount": 0.5 }, "dispersion": 1.2 },
++ "extend": { "effects": [ "NOGIB" ] }
++ },
++ {
++ "id": "22_fmj",
++ "copy-from": "22_lr",
++ "type": "AMMO",
++ "name": { "str_sp": ".22 FMJ" },
++ "description": ".22 Long Rifle ammunition with 30gr FMJ bullets. The .22LR round is extremely weak with very low stopping power, short range, and negligible recoil. It is most useful for rifle training, and hunting small animals.",
++ "relative": { "damage": { "damage_type": "bullet", "amount": -1, "armor_penetration": 2 } }
++ },
++ {
+ "id": "22_ratshot",
+ "copy-from": "22_lr",
+ "type": "AMMO",
+--- 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_sp": "5.56 NATO tracer" },
++ "name": { "str_sp": "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_sp": "5.56 NATO, black powder" },
++ "name": { "str_sp": "5.56 NATO M855A1, black powder" },
+ "proportional": {
+ "price": 0.3,
+ "damage": { "damage_type": "bullet", "amount": 0.57, "armor_penetration": 0.5 },
+@@ -75,7 +75,7 @@
+ "id": "bp_556_incendiary",
+ "copy-from": "556_incendiary",
+ "type": "AMMO",
+- "name": { "str_sp": "5.56 NATO tracer, black powder" },
++ "name": { "str_sp": "5.56 M856 tracer, black powder" },
+ "proportional": {
+ "price": 0.3,
+ "damage": { "damage_type": "bullet", "amount": 0.57, "armor_penetration": 0.5 },
+@@ -98,7 +98,7 @@
+ "id": "reloaded_556",
+ "copy-from": "556",
+ "type": "AMMO",
+- "name": { "str_sp": "5.56 NATO, reloaded" },
++ "name": { "str_sp": "5.56 NATO M855A1, reloaded" },
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "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_sp": "5.56 NATO tracer, reloaded" },
++ "name": { "str_sp": "5.56 NATO M856 tracer, reloaded" },
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
+--- 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_sp": "7.62x51mm M80" },
++ "name": { "str_sp": "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": "bullet", "amount": -2, "armor_penetration": 4 }, "dispersion": -10 },
+@@ -37,7 +37,7 @@
+ "id": "762_51_incendiary",
+ "copy-from": "762_51",
+ "type": "AMMO",
+- "name": { "str_sp": "7.62x51mm NATO tracer" },
++ "name": { "str_sp": "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_sp": "7.62x51mm, black powder" },
++ "name": { "str_sp": "7.62x51mm NATO M80, black powder" },
+ "proportional": {
+ "price": 0.3,
+ "damage": { "damage_type": "bullet", "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_sp": "7.62x51mm tracer, black powder" },
++ "name": { "str_sp": "7.62x51mm NATO M62 tracer, black powder" },
+ "proportional": {
+ "price": 0.3,
+ "damage": { "damage_type": "bullet", "amount": 0.76, "armor_penetration": 0.5 },
+@@ -96,7 +96,7 @@
+ "id": "reloaded_762_51",
+ "copy-from": "762_51",
+ "type": "AMMO",
+- "name": { "str_sp": "7.62x51mm, reloaded" },
++ "name": { "str_sp": "7.62x51mm NATO M80, reloaded" },
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "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_sp": "7.62x51mm incendiary, reloaded" },
++ "name": { "str_sp": "7.62x51mm NATO M62 tracer, reloaded" },
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "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
+@@ -27,7 +27,7 @@
+ "copy-from": "357mag_fmj",
+ "type": "AMMO",
+ "name": { "str_sp": ".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.",
++ "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.",
+ "relative": { "damage": { "damage_type": "bullet", "amount": 4, "armor_penetration": -2 } }
+ },
+ {
+--- a/data/json/items/ammo/38.json
++++ b/data/json/items/ammo/38.json
+@@ -1,13 +1,5 @@
+ [
+ {
+- "id": "38_fmj",
+- "copy-from": "38_special",
+- "type": "AMMO",
+- "name": { "str_sp": ".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.",
+- "relative": { "damage": { "damage_type": "bullet", "amount": -2, "armor_penetration": 4 } }
+- },
+- {
+ "id": "38_special",
+ "type": "AMMO",
+ "name": { "str": ".38 Special" },
+@@ -31,6 +23,14 @@
+ "effects": [ "COOKOFF" ]
+ },
+ {
++ "id": "38_fmj",
++ "copy-from": "38_special",
++ "type": "AMMO",
++ "name": { "str_sp": ".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.",
++ "relative": { "damage": { "damage_type": "bullet", "amount": -2, "armor_penetration": 4 } }
++ },
++ {
+ "id": "38_super",
+ "copy-from": "38_special",
+ "type": "AMMO",
+--- a/data/json/items/ammo/40.json
++++ b/data/json/items/ammo/40.json
+@@ -1,13 +1,5 @@
+ [
+ {
+- "id": "40fmj",
+- "copy-from": "40sw",
+- "type": "AMMO",
+- "name": { "str_sp": ".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.",
+- "relative": { "damage": { "damage_type": "bullet", "amount": -3, "armor_penetration": 6 } }
+- },
+- {
+ "id": "40sw",
+ "type": "AMMO",
+ "name": { "str_sp": ".40 S&W JHP" },
+@@ -31,6 +23,14 @@
+ "effects": [ "COOKOFF" ]
+ },
+ {
++ "id": "40fmj",
++ "copy-from": "40sw",
++ "type": "AMMO",
++ "name": { "str_sp": ".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.",
++ "relative": { "damage": { "damage_type": "bullet", "amount": -3, "armor_penetration": 6 } }
++ },
++ {
+ "id": "bp_40fmj",
+ "copy-from": "40fmj",
+ "type": "AMMO",
+--- a/data/json/items/ammo/45.json
++++ b/data/json/items/ammo/45.json
+@@ -1,13 +1,5 @@
+ [
+ {
+- "id": "45_acp",
+- "copy-from": "45_jhp",
+- "type": "AMMO",
+- "name": { "str_sp": ".45 ACP FMJ" },
+- "description": ".45 ACP ammunition with 230gr FMJ bullets. Noted for its stopping power, the .45 ACP round has been common for over a century.",
+- "relative": { "damage": { "damage_type": "bullet", "amount": -3, "armor_penetration": 6 } }
+- },
+- {
+ "id": "45_jhp",
+ "type": "AMMO",
+ "name": { "str_sp": ".45 ACP JHP" },
+@@ -31,6 +23,14 @@
+ "effects": [ "COOKOFF" ]
+ },
+ {
++ "id": "45_acp",
++ "copy-from": "45_jhp",
++ "type": "AMMO",
++ "name": { "str_sp": ".45 ACP FMJ" },
++ "description": ".45 ACP ammunition with 230gr FMJ bullets. Noted for its stopping power, the .45 ACP round has been common for over a century.",
++ "relative": { "damage": { "damage_type": "bullet", "amount": -3, "armor_penetration": 6 } }
++ },
++ {
+ "id": "45_super",
+ "copy-from": "45_jhp",
+ "type": "AMMO",
+@@ -74,7 +74,7 @@
+ "id": "reloaded_45_acp",
+ "copy-from": "45_acp",
+ "type": "AMMO",
+- "name": { "str_sp": ".45 FMJ, reloaded" },
++ "name": { "str_sp": ".45 ACP FMJ, reloaded" },
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "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
+@@ -1,15 +1,5 @@
+ [
+ {
+- "id": "50_incendiary",
+- "copy-from": "50bmg",
+- "type": "AMMO",
+- "name": { "str_sp": ".50 BMG M17 tracer" },
+- "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.",
+- "count": 10,
+- "effects": [ "INCENDIARY" ],
+- "dispersion": 310
+- },
+- {
+ "id": "50bmg",
+ "type": "AMMO",
+ "name": { "str_sp": ".50 BMG M33 Ball" },
+@@ -33,6 +23,16 @@
+ "effects": [ "COOKOFF", "NEVER_MISFIRES" ]
+ },
+ {
++ "id": "50_incendiary",
++ "copy-from": "50bmg",
++ "type": "AMMO",
++ "name": { "str_sp": ".50 BMG M17 tracer" },
++ "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.",
++ "count": 10,
++ "effects": [ "INCENDIARY" ],
++ "dispersion": 310
++ },
++ {
+ "id": "50match",
+ "copy-from": "50bmg",
+ "type": "AMMO",
+@@ -70,7 +70,7 @@
+ "id": "reloaded_50_incendiary",
+ "copy-from": "50_incendiary",
+ "type": "AMMO",
+- "name": { "str_sp": ".50 BMG tracer, reloaded" },
++ "name": { "str_sp": ".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": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+@@ -78,10 +78,10 @@
+ },
+ {
+ "id": "reloaded_50bmg",
+- "copy-from": "50match",
++ "copy-from": "50bmg",
+ "type": "AMMO",
+- "name": { "str_sp": ".50 BMG Match, reloaded" },
+- "description": ".50 BMG ammunition with lead-cored FMJ bullets. The .50 BMG is a very powerful rifle round designed for anti-aircraft use, later adapted to anti-vehicular and anti-personnel roles. Its stupendous energy and armor piercing capabilities make it one of the most deadly rounds available, offset only by its drastic recoil and noise.",
++ "name": { "str_sp": ".50 BMG M33 Ball, reloaded" },
++ "description": ".50 BMG ammunition with lead-cored FMJ bullets. The .50 BMG is a very powerful rifle round designed for anti-aircraft use, later adapted to anti-vehicular and anti-personnel roles. Its stupendous energy and armor piercing capabilities make it one of the most deadly rounds available, offset only by its drastic recoil and noise. This one has been hand-reloaded.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
+@@ -90,7 +90,7 @@
+ "id": "reloaded_50ss",
+ "copy-from": "50ss",
+ "type": "AMMO",
+- "name": { "str_sp": ".50 BMG AP, reloaded" },
++ "name": { "str_sp": ".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": "bullet", "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", "str_pl": "5x50mm flechettes, reloaded" },
++ "name": { "str": "RA110 5x50mm flechette, reloaded", "str_pl": "RA110 5x50mm flechettes, 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
+@@ -66,7 +66,8 @@
+ "id": "reloaded_762_25",
+ "copy-from": "762_25hot",
+ "type": "AMMO",
+- "name": { "str_sp": "7.62x25mm, reloaded" },
+- "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9, "armor_penetration": 0.9 }, "dispersion": 1.1 }
++ "name": { "str_sp": "7.62x25mm FMJ, reloaded" },
++ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9, "armor_penetration": 0.9 }, "dispersion": 1.1 },
++ "extend": { "effects": [ "RECYCLED" ] }
+ }
+ ]
diff --git a/0002-ankle-ammo-pouch-is-not-a-backpack.patch b/armor-01_ankle-ammo-pouch-is-not-a-backpack.patch
index ca51551..cc64d3c 100644
--- a/0002-ankle-ammo-pouch-is-not-a-backpack.patch
+++ b/armor-01_ankle-ammo-pouch-is-not-a-backpack.patch
@@ -1,11 +1,11 @@
--- 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",
+@@ -270,7 +270,7 @@
+ "price_postapoc": 750,
+ "material": [ "cotton" ],
"symbol": "[",
- "looks_like": "ragpouch",
+ "looks_like": "bootstrap",
"color": "dark_gray",
- "covers": [ "FOOT_EITHER" ],
- "coverage": 5,
+ "covers": [ "foot_l", "foot_r" ],
+ "sided": true,
diff --git a/armor-02_fix-survivor-fingerless-gloves-warmth.patch b/armor-02_fix-survivor-fingerless-gloves-warmth.patch
new file mode 100644
index 0000000..dc95162
--- /dev/null
+++ b/armor-02_fix-survivor-fingerless-gloves-warmth.patch
@@ -0,0 +1,11 @@
+--- a/data/json/items/armor/gloves.json
++++ b/data/json/items/armor/gloves.json
+@@ -535,7 +535,7 @@
+ "covers": [ "hand_l", "hand_r" ],
+ "coverage": 85,
+ "encumbrance": 8,
+- "warmth": 12,
++ "warmth": 15,
+ "material_thickness": 2,
+ "environmental_protection": 3,
+ "flags": [ "VARSIZE", "WATERPROOF", "STURDY", "ALLOWS_NATURAL_ATTACKS", "ALLOWS_TALONS" ]
diff --git a/0008-npc-can-use-more-bionics.patch b/bionics-01_npc-can-use-more-bionics.patch
index 57e4720..2fed2be 100644
--- a/0008-npc-can-use-more-bionics.patch
+++ b/bionics-01_npc-can-use-more-bionics.patch
@@ -1,35 +1,26 @@
--- a/data/json/bionics.json
+++ b/data/json/bionics.json
-@@ -337,7 +337,7 @@
+@@ -360,7 +360,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" ],
+ "occupied_bodyparts": [ [ "head", 3 ] ],
+- "flags": [ "BIONIC_TOGGLED", "IMMUNE_HEARING_DAMAGE" ],
++ "flags": [ "BIONIC_TOGGLED", "IMMUNE_HEARING_DAMAGE", "BIONIC_NPC_USABLE" ],
+ "active_flags": [ "SUPER_HEARING" ],
"included_bionics": [ "bio_earplugs" ]
},
- {
-@@ -1000,7 +1000,8 @@
- "name": { "str": "Autonomous Surgical Scalpels" },
- "description": "A system of surgical grade scalpels is implanted on your fingers. They allow you to make automated precise cuts and can also be used as a high-quality butchering tool.",
- "occupied_bodyparts": [ [ "ARM_R", 1 ], [ "ARM_L", 1 ] ],
-- "fake_item": "bio_scalpel"
-+ "fake_item": "bio_scalpel",
-+ "flags": [ "BIONIC_NPC_USABLE" ]
- },
- {
- "id": "bio_sunglasses",
-@@ -1196,6 +1197,6 @@
+@@ -1223,6 +1223,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 ] ],
+ "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
-@@ -266,7 +266,7 @@
+@@ -275,7 +275,7 @@
},
{
"id": "bio_ears",
@@ -38,7 +29,7 @@
"type": "BIONIC_ITEM",
"name": { "str": "Enhanced Hearing CBM" },
"looks_like": "bio_int_enhancer",
-@@ -741,7 +741,7 @@
+@@ -760,7 +760,7 @@
},
{
"id": "bio_fuel_cell_gasoline",
@@ -47,7 +38,7 @@
"type": "BIONIC_ITEM",
"name": { "str": "Gasoline Fuel Cell CBM" },
"looks_like": "bio_int_enhancer",
-@@ -839,7 +839,7 @@
+@@ -858,7 +858,7 @@
},
{
"id": "bio_surgical_razor",
diff --git a/custom.patch b/custom.patch
deleted file mode 100644
index 694b919..0000000
--- a/custom.patch
+++ /dev/null
@@ -1,164 +0,0 @@
---- a/src/suffer.cpp
-+++ b/src/suffer.cpp
-@@ -118,6 +118,8 @@
- static const trait_id trait_FRESHWATEROSMOSIS( "FRESHWATEROSMOSIS" );
- static const trait_id trait_GILLS( "GILLS" );
- static const trait_id trait_GILLS_CEPH( "GILLS_CEPH" );
-+static const trait_id trait_THRESH_GYNOID( "THRESH_GYNOID" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
- static const trait_id trait_JITTERY( "JITTERY" );
- static const trait_id trait_KILLER( "KILLER" );
- static const trait_id trait_LEAVES( "LEAVES" );
-@@ -245,7 +247,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" ) ) {
---- a/src/character.cpp
-+++ b/src/character.cpp
-@@ -251,6 +251,7 @@
- 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_TRANSPIRATION( "TRANSPIRATION" );
- static const trait_id trait_URSINE_EYE( "URSINE_EYE" );
- static const trait_id trait_VISCOUS( "VISCOUS" );
-@@ -4775,7 +4775,7 @@
-
- void Character::update_bodytemp()
- {
-- 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
-@@ -87,6 +87,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 )
-@@ -1524,7 +1525,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 );
- }
- }
-@@ -1651,8 +1653,8 @@
- // 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( bp_mouth ) >= 15 &&
-- u.get_env_resist( bp_eyes ) >= 15 ) ) {
-+ if( !( u.has_trait( trait_THRESH_VAMP ) ) && !( u.worn_with_flag( flag_GAS_PROOF ) &&
-+ u.get_env_resist( bp_mouth ) >= 15 && u.get_env_resist( bp_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/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",
-+ "VAMPSKIN",
- "VISCOUS"
- ],
- "order": 1500
diff --git a/etc-01_fix-rubbersplosion.patch b/etc-01_fix-rubbersplosion.patch
new file mode 100644
index 0000000..30fb82f
--- /dev/null
+++ b/etc-01_fix-rubbersplosion.patch
@@ -0,0 +1,19 @@
+--- a/data/json/items/ammo.json
++++ b/data/json/items/ammo.json
+@@ -768,7 +768,7 @@
+ "count": 25
+ },
+ {
+- "type": "AMMO",
++ "type": "TOOL",
+ "id": "chunk_rubber",
+ "category": "spare_parts",
+ "price": 75,
+@@ -779,7 +779,6 @@
+ "material": [ "rubber" ],
+ "volume": "250 ml",
+ "weight": "38 g",
+- "ammo_type": "components",
+ "flags": [ "NO_SALVAGE" ]
+ },
+ {
diff --git a/etc-02_add-missing-price-postapoc.patch b/etc-02_add-missing-price-postapoc.patch
new file mode 100644
index 0000000..fbccfc5
--- /dev/null
+++ b/etc-02_add-missing-price-postapoc.patch
@@ -0,0 +1,82 @@
+--- a/data/json/items/magazine/223.json
++++ b/data/json/items/magazine/223.json
+@@ -131,6 +131,7 @@
+ "volume": "130 ml",
+ "longest_side": "76 mm",
+ "price": 4000,
++ "price_postapoc": 125,
+ "material": [ "steel" ],
+ "symbol": "#",
+ "color": "light_gray",
+@@ -148,6 +149,7 @@
+ "volume": "230 ml",
+ "longest_side": "129 mm",
+ "price": 4000,
++ "price_postapoc": 125,
+ "material": [ "steel" ],
+ "symbol": "#",
+ "color": "light_gray",
+@@ -183,6 +185,7 @@
+ "volume": "390 ml",
+ "longest_side": "236 mm",
+ "price": 8500,
++ "price_postapoc": 275,
+ "material": [ "plastic", "steel" ],
+ "symbol": "#",
+ "color": "light_gray",
+@@ -221,6 +224,7 @@
+ "volume": "600 ml",
+ "longest_side": "240 mm",
+ "price": 12000,
++ "price_postapoc": 750,
+ "material": [ "aluminum" ],
+ "symbol": "#",
+ "color": "light_gray",
+@@ -238,6 +242,7 @@
+ "volume": "700 ml",
+ "longest_side": "188 mm",
+ "price": 9250,
++ "price_postapoc": 550,
+ "to_hit": -2,
+ "bashing": 4,
+ "material": [ "steel", "plastic" ],
+@@ -258,6 +263,7 @@
+ "volume": "1000 ml",
+ "longest_side": "200 mm",
+ "price": 9500,
++ "price_postapoc": 600,
+ "to_hit": -2,
+ "bashing": 4,
+ "material": [ "plastic", "steel" ],
+@@ -278,6 +284,7 @@
+ "volume": "1 L",
+ "longest_side": "350 mm",
+ "price": 15000,
++ "price_postapoc": 900,
+ "material": [ "aluminum" ],
+ "symbol": "#",
+ "color": "light_gray",
+@@ -295,6 +302,7 @@
+ "volume": "1200 ml",
+ "longest_side": "300 mm",
+ "price": 14000,
++ "price_postapoc": 850,
+ "material": [ "plastic", "steel" ],
+ "symbol": "#",
+ "color": "light_gray",
+@@ -313,6 +321,7 @@
+ "volume": "1700 ml",
+ "longest_side": "343 mm",
+ "price": 18000,
++ "price_postapoc": 1000,
+ "material": [ "plastic", "steel" ],
+ "symbol": "#",
+ "color": "light_gray",
+@@ -372,6 +381,7 @@
+ "weight": "190 g",
+ "volume": "620 ml",
+ "price": 8600,
++ "price_postapoc": 275,
+ "material": [ "steel", "plastic" ],
+ "symbol": "#",
+ "color": "light_gray",
diff --git a/foods-01_fix-food-materials.patch b/foods-01_fix-food-materials.patch
new file mode 100644
index 0000000..0bdff73
--- /dev/null
+++ b/foods-01_fix-food-materials.patch
@@ -0,0 +1,44 @@
+--- a/data/json/items/comestibles/drink.json
++++ b/data/json/items/comestibles/drink.json
+@@ -39,7 +39,8 @@
+ "description": "Milk some almonds? Not quite, but blend them with water, yes! A dairy-free alternative strong in calcium! Rival to soy milk.",
+ "price": 40,
+ "price_postapoc": 50,
+- "material": [ "water" ],
++ "material": "nut",
++ "primary_material": "water",
+ "volume": "250 ml",
+ "phase": "liquid",
+ "vitamins": [ [ "vitA", 2 ], [ "calcium", 11 ] ],
+@@ -62,7 +63,8 @@
+ "description": "Milk some soybeans? Not quite, but blend them with water, yes! A dairy-free alternative strong in protein! Rival to almond milk.",
+ "price": 40,
+ "price_postapoc": 50,
+- "material": [ "water" ],
++ "material": "veggy",
++ "primary_material": "water",
+ "volume": "250 ml",
+ "phase": "liquid",
+ "vitamins": [ [ "vitA", 2 ], [ "iron", 1 ], [ "calcium", 7 ] ],
+
+--- a/data/json/items/comestibles/nuts.json
++++ a/data/json/items/comestibles/nuts.json
+@@ -445,6 +445,7 @@
+ "volume": "250 ml",
+ "comestible_type": "DRINK",
+ "container": "jar_glass_sealed",
++ "material": [ "nut", "junk" ],
+ "primary_material": "junk",
+ "quench": -2,
+ "calories": 190,
+
+--- a/data/json/items/comestibles/other.json
++++ b/data/json/items/comestibles/other.json
+@@ -80,6 +80,7 @@
+ "description": "A translucent hexagonal chunk of wax, filled with dense, milky, bitter and acidic-tasting jelly. Though some hold it as a panacea, it doesn't have any medical benefit. Still it is rich with the most beneficial substances the hive can produce.",
+ "price": 20000,
+ "price_postapoc": 400,
++ "material": "honey",
+ "volume": "250 ml",
+ "flags": [ "EDIBLE_FROZEN", "NUTRIENT_OVERRIDE" ],
+ "fun": -5
diff --git a/itemgroups-01_hk46-is-milspec.patch b/itemgroups-01_hk46-is-milspec.patch
new file mode 100644
index 0000000..ad2f0c6
--- /dev/null
+++ b/itemgroups-01_hk46-is-milspec.patch
@@ -0,0 +1,18 @@
+--- a/data/json/itemgroups/Weapons_Mods_Ammo/magazines.json
++++ b/data/json/itemgroups/Weapons_Mods_Ammo/magazines.json
+@@ -75,7 +75,6 @@
+ { "item": "fn57mag", "prob": 15, "charges": [ 0, 20 ] },
+ { "item": "glockmag", "prob": 40, "charges": [ 0, 15 ] },
+ { "item": "glock40mag", "prob": 30, "charges": [ 0, 15 ] },
+- { "item": "hk46mag", "prob": 5, "charges": [ 0, 20 ] },
+ { "item": "m9mag", "prob": 5, "charges": [ 0, 15 ] },
+ { "item": "mp5mag", "prob": 10, "charges": [ 0, 30 ] },
+ { "item": "sig40mag", "prob": 20, "charges": [ 0, 12 ] },
+@@ -98,7 +97,6 @@
+ { "item": "fnp90mag", "prob": 20, "charges": [ 0, 50 ] },
+ { "item": "glockbigmag", "prob": 10, "charges": [ 0, 30 ] },
+ { "item": "glock40bigmag", "prob": 10, "charges": [ 0, 22 ] },
+- { "item": "hk46bigmag", "prob": 5, "charges": [ 0, 40 ] },
+ { "item": "m9bigmag", "prob": 10, "charges": [ 0, 30 ] },
+ { "item": "mp5bigmag", "prob": 20, "charges": [ 0, 50 ] },
+ { "item": "stanag30", "prob": 20, "charges": [ 0, 30 ] },
diff --git a/itemgroups-02_fix-shelter-batteries.patch b/itemgroups-02_fix-shelter-batteries.patch
new file mode 100644
index 0000000..d9330dd
--- /dev/null
+++ b/itemgroups-02_fix-shelter-batteries.patch
@@ -0,0 +1,41 @@
+--- a/data/json/itemgroups/SUS/evac_shelter.json
++++ b/data/json/itemgroups/SUS/evac_shelter.json
+@@ -10,7 +10,13 @@
+ { "item": "jacket_evac", "prob": 75 },
+ { "item": "emer_blanket", "prob": 75 },
+ { "item": "mask_gas", "prob": 2 },
+- { "item": "flashlight", "prob": 50 },
++ {
++ "item": "light_disposable_cell",
++ "charges-min": 150,
++ "charges-max": 300,
++ "container-item": "flashlight",
++ "prob": 50
++ },
+ { "item": "light_disposable_cell", "prob": 10 },
+ { "item": "lighter", "prob": 20, "charges": [ 60, 100 ] },
+ { "item": "whistle", "prob": 70 },
+@@ -82,9 +88,21 @@
+ "collection": [
+ { "item": "extinguisher", "prob": 70, "charges": 100 },
+ { "group": "full_1st_aid", "count": [ 1, 3 ], "prob": 65 },
+- { "item": "two_way_radio", "prob": 65 },
++ {
++ "item": "light_disposable_cell",
++ "charges-min": 150,
++ "charges-max": 300,
++ "container-item": "two_way_radio",
++ "prob": 65
++ },
+ { "item": "light_disposable_cell", "count": [ 2, 4 ], "prob": 65 },
+- { "item": "electric_lantern", "prob": 35 },
++ {
++ "item": "light_disposable_cell",
++ "charges-min": 150,
++ "charges-max": 300,
++ "container-item": "electric_lantern",
++ "prob": 35
++ },
+ { "item": "barometer", "prob": 8 }
+ ],
+ "prob": 10
diff --git a/jc_allow-bio-firestarter-on-smoker.patch b/jc_allow-bio-firestarter-on-smoker.patch
index e81a493..4c5c548 100644
--- a/jc_allow-bio-firestarter-on-smoker.patch
+++ b/jc_allow-bio-firestarter-on-smoker.patch
@@ -1,39 +1,43 @@
--- a/src/iexamine.cpp
+++ b/src/iexamine.cpp
-@@ -4868,18 +4868,30 @@
+@@ -2638,7 +2638,10 @@
return;
}
-- if( !p.has_charges( "fire", 1 ) ) {
+- if( !p.has_charges( itype_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." ) );
++ if( !has_bionic_firestarter && !p.has_charges( itype_fire, 1 ) ) {
+ add_msg( _( "This kiln is ready to be fired, but you have no fire source." ) );
return;
- } else if( !query_yn( _( "Fire the smoking rack?" ) ) ) {
+ } else {
+@@ -5396,11 +5399,23 @@
return;
}
-- p.use_charges( "fire", 1 );
-- for( auto &it : g->m.i_at( examp ) ) {
+- p.use_charges( itype_fire, 1 );
+- for( item &it : here.i_at( examp ) ) {
- if( it.has_flag( flag_SMOKABLE ) ) {
- it.process_temperature_rot( 1, examp, nullptr );
- it.set_flag( flag_PROCESSING );
++ const bool has_bionic_firestarter = p.has_bionic( bio_lighter ) &&
++ p.enough_power_for( bio_lighter );
++
+ if( has_bionic_firestarter ) {
-+ for( auto &it : g->m.i_at( examp ) ) {
++ for( item &it : here.i_at( examp ) ) {
+ if( it.has_flag( flag_SMOKABLE ) ) {
+ it.process_temperature_rot( 1, examp, nullptr );
+ it.set_flag( flag_PROCESSING );
+ }
+ }
+ } else {
-+ p.use_charges( "fire", 1 );
-+ for( auto &it : g->m.i_at( examp ) ) {
++ p.use_charges( itype_fire, 1 );
++ for( item &it : here.i_at( examp ) ) {
+ if( it.has_flag( flag_SMOKABLE ) ) {
+ it.process_temperature_rot( 1, examp, nullptr );
+ it.set_flag( flag_PROCESSING );
+ }
}
}
- g->m.furn_set( examp, next_smoker_type );
+ here.furn_set( examp, next_smoker_type );
diff --git a/jc_allow-hacker-laptop.patch b/jc_allow-hacker-laptop.patch
new file mode 100644
index 0000000..75bcc07
--- /dev/null
+++ b/jc_allow-hacker-laptop.patch
@@ -0,0 +1,29 @@
+--- a/src/game.cpp
++++ b/src/game.cpp
+@@ -239,6 +239,7 @@
+ static const itype_id itype_battery( "battery" );
+ static const itype_id itype_disassembly( "disassembly" );
+ static const itype_id itype_grapnel( "grapnel" );
++static const itype_id itype_hackerlaptop( "hacker_laptop" );
+ static const itype_id itype_holybook_bible1( "holybook_bible1" );
+ static const itype_id itype_holybook_bible2( "holybook_bible2" );
+ static const itype_id itype_holybook_bible3( "holybook_bible3" );
+@@ -2695,7 +2696,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( itype_remotevehcontrol ) ) ) {
++ ( !u.has_active_bionic( bio_remote ) && !u.has_active_item( itype_remotevehcontrol )
++ && !u.has_active_item( itype_hackerlaptop ) ) ) {
+ remoteveh_cache = nullptr;
+ } else {
+ tripoint vp;
+@@ -2715,7 +2717,7 @@
+ remoteveh_cache_time = calendar::turn;
+ remoteveh_cache = veh;
+ if( veh != nullptr && !u.has_active_bionic( bio_remote ) &&
+- !u.has_active_item( itype_remotevehcontrol ) ) {
++ !u.has_active_item( itype_remotevehcontrol ) && !u.has_active_item( itype_hackerlaptop ) ) {
+ 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
index 3def080..3df1ffd 100644
--- a/jc_ammo-loudness-ap-times-2.patch
+++ b/jc_ammo-loudness-ap-times-2.patch
@@ -1,6 +1,6 @@
--- a/src/item_factory.cpp
+++ b/src/item_factory.cpp
-@@ -221,7 +221,7 @@
+@@ -230,7 +230,7 @@
if( obj.ammo->loudness < 0 ) {
obj.ammo->loudness = obj.ammo->range * 2;
for( const damage_unit &du : obj.ammo->damage ) {
diff --git a/jc_more-military-base-overmap.patch b/jc_more-military-base-overmap.patch
new file mode 100644
index 0000000..a7aabfc
--- /dev/null
+++ b/jc_more-military-base-overmap.patch
@@ -0,0 +1,800 @@
+--- a/data/json/overmap/overmap_terrain/overmap_terrain_military.json
++++ b/data/json/overmap/overmap_terrain/overmap_terrain_military.json
+@@ -224,208 +190,351 @@
+ },
+ {
+ "type": "overmap_terrain",
++ "abstract": "generic_military_base",
++ "name": "military base",
++ "color": "red",
++ "sym": "M",
++ "see_cost": 5
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [
++ "mil_base_road_entrance",
++ "mil_base_4b",
++ "mil_base_4c",
++ "mil_base_4d",
++ "mil_base_4e",
++ "mil_base_4g",
++ "mil_base_4h",
++ "mil_base_4i"
++ ],
++ "copy-from": "generic_military_base",
++ "name": "road",
++ "sym": "│",
++ "color": "dark_gray"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_5f", "mil_base_5j", "mil_base_6j", "mil_base_7j" ],
++ "copy-from": "generic_military_base",
++ "name": "road",
++ "sym": "─",
++ "color": "dark_gray"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_4a", "mil_base_4f" ],
++ "copy-from": "generic_military_base",
++ "name": "road",
++ "sym": "├",
++ "color": "dark_gray"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "mil_base_4j",
++ "copy-from": "generic_military_base",
++ "name": "road",
++ "sym": "└",
++ "color": "dark_gray"
++ },
++ {
++ "type": "overmap_terrain",
+ "id": [
+ "mil_base_1a",
+- "mil_base_1a1",
+- "mil_base_1b1",
++ "mil_base_2a",
++ "mil_base_3a",
++ "mil_base_8a",
+ "mil_base_1b",
+- "mil_base_1c1",
++ "mil_base_2b",
++ "mil_base_3b",
++ "mil_base_5b",
++ "mil_base_6b",
++ "mil_base_7b",
++ "mil_base_8b",
+ "mil_base_1c",
+- "mil_base_1d1",
++ "mil_base_2c",
++ "mil_base_3c",
++ "mil_base_8c",
+ "mil_base_1d",
+- "mil_base_1e1",
++ "mil_base_5d",
++ "mil_base_6d",
++ "mil_base_7d",
++ "mil_base_8d",
+ "mil_base_1e",
+- "mil_base_1f1",
+ "mil_base_1f",
+- "mil_base_1g1",
+ "mil_base_1g",
+- "mil_base_1h1",
+ "mil_base_1h",
+- "mil_base_1i1",
++ "mil_base_2h",
+ "mil_base_1i",
+- "mil_base_1j1",
++ "mil_base_2i",
+ "mil_base_1j",
+- "mil_base_1k1",
++ "mil_base_2j",
++ "mil_base_3j",
++ "mil_base_8j",
+ "mil_base_1k",
+- "mil_base_2a1",
+- "mil_base_2a",
+- "mil_base_2b1",
+- "mil_base_2b",
+- "mil_base_2c1",
+- "mil_base_2c",
++ "mil_base_2k",
++ "mil_base_3k",
++ "mil_base_4k",
++ "mil_base_5k",
++ "mil_base_6k",
++ "mil_base_7k",
++ "mil_base_8k"
++ ],
++ "copy-from": "generic_military_base",
++ "name": "field",
++ "sym": ".",
++ "color": "brown"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_5a", "mil_base_6a", "mil_base_7a" ],
++ "copy-from": "generic_military_base",
++ "name": "parking lot",
++ "sym": "O",
++ "color": "dark_gray"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [
++ "mil_base_tunnels_a",
++ "mil_base_tunnels_b",
++ "mil_base_tunnels_c",
++ "mil_base_tunnels_d",
++ "mil_base_tunnels_e",
++ "mil_base_tunnels_f",
++ "mil_base_tunnels_g",
++ "mil_base_tunnels_h",
++ "mil_base_tunnels_i"
++ ],
++ "copy-from": "generic_military_base",
++ "name": "military base - tunnel"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [
+ "mil_base_2d1",
+ "mil_base_2d",
+ "mil_base_2e1",
+ "mil_base_2e",
+- "mil_base_2f1",
+- "mil_base_2f",
+- "mil_base_2g1",
+- "mil_base_2g",
+- "mil_base_2h1",
+- "mil_base_2h",
++ "mil_base_3d1",
++ "mil_base_3d",
++ "mil_base_3e1",
++ "mil_base_3e",
++ "mil_base_5c1",
++ "mil_base_5c",
++ "mil_base_6c1",
++ "mil_base_6c",
++ "mil_base_7c1",
++ "mil_base_7c"
++ ],
++ "copy-from": "generic_military_base",
++ "name": "military base - barracks"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_2f1", "mil_base_2f", "mil_base_3f1", "mil_base_3f" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - mess hall"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_2g1", "mil_base_2g", "mil_base_3g1", "mil_base_3g" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - warehouse"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_3h1", "mil_base_3h" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - communications center"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_5e1", "mil_base_5e" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - armory"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [
++ "mil_base_6e1",
++ "mil_base_6e",
++ "mil_base_7e1",
++ "mil_base_7e",
++ "mil_base_8e1",
++ "mil_base_8e",
++ "mil_base_7f1",
++ "mil_base_7f"
++ ],
++ "copy-from": "generic_military_base",
++ "name": "military base - motor pool"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_5g1", "mil_base_5g" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - command center"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_5h1", "mil_base_5h", "mil_base_5i1", "mil_base_5i", "mil_base_6i1", "mil_base_6i" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - infirmary"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "mil_base_8i",
++ "copy-from": "generic_military_base",
++ "name": "military base - fuel depot"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [
++ "mil_base_6f",
++ "mil_base_8f",
++ "mil_base_6g",
++ "mil_base_7g",
++ "mil_base_8g",
++ "mil_base_6h",
++ "mil_base_7h",
++ "mil_base_8h"
++ ],
++ "copy-from": "generic_military_base",
++ "name": "motor pool lot",
++ "sym": "O",
++ "color": "dark_gray"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_3i", "mil_base_3i1", "mil_base_3i2", "mil_base_3i3", "mil_base_3i4" ],
++ "copy-from": "generic_military_base",
++ "name": "radio tower",
++ "sym": "X",
++ "color": "light_gray"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "mil_base_7i",
++ "copy-from": "generic_military_base",
++ "name": "military helipad",
++ "sym": "H"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "mil_base_minefield_nw",
++ "copy-from": "generic_military_base",
++ "name": "minefield",
++ "sym": "┌"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "mil_base_minefield_ne",
++ "copy-from": "generic_military_base",
++ "name": "minefield",
++ "sym": "┐"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "mil_base_minefield_sw",
++ "copy-from": "generic_military_base",
++ "name": "minefield",
++ "sym": "└"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "mil_base_minefield_se",
++ "copy-from": "generic_military_base",
++ "name": "minefield",
++ "sym": "┘"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_minefield_e", "mil_base_minefield_w" ],
++ "copy-from": "generic_military_base",
++ "name": "minefield",
++ "sym": "│"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_minefield_n", "mil_base_minefield_s", "mil_base_minefield_end" ],
++ "copy-from": "generic_military_base",
++ "name": "minefield",
++ "sym": "─"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [
++ "mil_base_1a1",
++ "mil_base_1b1",
++ "mil_base_1c1",
++ "mil_base_1d1",
++ "mil_base_1e1",
++ "mil_base_1f1",
++ "mil_base_1g1",
++ "mil_base_1h1",
++ "mil_base_1i1",
++ "mil_base_1j1",
++ "mil_base_1k1",
++ "mil_base_2a1",
++ "mil_base_2b1",
++ "mil_base_2c1",
+ "mil_base_2i1",
+- "mil_base_2i",
++ "mil_base_2h1",
+ "mil_base_2j1",
+- "mil_base_2j",
+ "mil_base_2k1",
+- "mil_base_2k",
+ "mil_base_3a1",
+- "mil_base_3a",
+ "mil_base_3b1",
+- "mil_base_3b",
+ "mil_base_3c1",
+- "mil_base_3c",
+- "mil_base_3d1",
+- "mil_base_3d",
+- "mil_base_3e1",
+- "mil_base_3e",
+- "mil_base_3f1",
+- "mil_base_3f",
+- "mil_base_3g1",
+- "mil_base_3g",
+- "mil_base_3h1",
+- "mil_base_3h",
+- "mil_base_3i1",
+- "mil_base_3i2",
+- "mil_base_3i3",
+- "mil_base_3i4",
+- "mil_base_3i",
+ "mil_base_3j1",
+- "mil_base_3j",
+ "mil_base_3k1",
+- "mil_base_3k",
+ "mil_base_4a1",
+- "mil_base_4a",
+ "mil_base_4b1",
+- "mil_base_4b",
+ "mil_base_4c1",
+- "mil_base_4c",
+ "mil_base_4d1",
+- "mil_base_4d",
+ "mil_base_4e1",
+- "mil_base_4e",
+ "mil_base_4f1",
+- "mil_base_4f",
+ "mil_base_4g1",
+- "mil_base_4g",
+ "mil_base_4h1",
+- "mil_base_4h",
+ "mil_base_4i1",
+- "mil_base_4i",
+ "mil_base_4j1",
+- "mil_base_4j",
+ "mil_base_4k1",
+- "mil_base_4k",
+ "mil_base_5a1",
+- "mil_base_5a",
+ "mil_base_5b1",
+- "mil_base_5b",
+- "mil_base_5c1",
+- "mil_base_5c",
+ "mil_base_5d1",
+- "mil_base_5d",
+- "mil_base_5e1",
+- "mil_base_5e",
+ "mil_base_5f1",
+- "mil_base_5f",
+- "mil_base_5g1",
+- "mil_base_5g",
+- "mil_base_5h1",
+- "mil_base_5h",
+- "mil_base_5i1",
+- "mil_base_5i",
+ "mil_base_5j1",
+- "mil_base_5j",
+ "mil_base_5k1",
+- "mil_base_5k",
+ "mil_base_6a1",
+- "mil_base_6a",
+ "mil_base_6b1",
+- "mil_base_6b",
+- "mil_base_6c1",
+- "mil_base_6c",
+ "mil_base_6d1",
+- "mil_base_6d",
+- "mil_base_6e1",
+- "mil_base_6e",
+ "mil_base_6f1",
+- "mil_base_6f",
+ "mil_base_6g1",
+- "mil_base_6g",
+ "mil_base_6h1",
+- "mil_base_6h",
+- "mil_base_6i1",
+- "mil_base_6i",
+ "mil_base_6j1",
+- "mil_base_6j",
+ "mil_base_6k1",
+- "mil_base_6k",
+ "mil_base_7a1",
+- "mil_base_7a",
+ "mil_base_7b1",
+- "mil_base_7b",
+- "mil_base_7c1",
+- "mil_base_7c",
+ "mil_base_7d1",
+- "mil_base_7d",
+- "mil_base_7e1",
+- "mil_base_7e",
+- "mil_base_7f1",
+- "mil_base_7f",
+ "mil_base_7g1",
+- "mil_base_7g",
+ "mil_base_7h1",
+- "mil_base_7h",
+ "mil_base_7i1",
+- "mil_base_7i",
+ "mil_base_7j1",
+- "mil_base_7j",
+ "mil_base_7k1",
+- "mil_base_7k",
+ "mil_base_8a1",
+- "mil_base_8a",
+ "mil_base_8b1",
+- "mil_base_8b",
+ "mil_base_8c1",
+- "mil_base_8c",
+ "mil_base_8d1",
+- "mil_base_8d",
+- "mil_base_8e1",
+- "mil_base_8e",
+ "mil_base_8f1",
+- "mil_base_8f",
+ "mil_base_8g1",
+- "mil_base_8g",
+ "mil_base_8h1",
+- "mil_base_8h",
+- "mil_base_8i1",
+- "mil_base_8i",
+ "mil_base_8j1",
+- "mil_base_8j",
+ "mil_base_8k1",
+- "mil_base_8k",
+- "mil_base_minefield_e",
+- "mil_base_minefield_n",
+- "mil_base_minefield_ne",
+- "mil_base_minefield_nw",
+- "mil_base_minefield_s",
+- "mil_base_minefield_se",
+- "mil_base_minefield_sw",
+- "mil_base_minefield_w",
+- "mil_base_road_entrance",
+- "mil_base_tunnels_a",
+- "mil_base_tunnels_b",
+- "mil_base_tunnels_c",
+- "mil_base_tunnels_d",
+- "mil_base_tunnels_e",
+- "mil_base_tunnels_f",
+- "mil_base_tunnels_g",
+- "mil_base_tunnels_h",
+- "mil_base_tunnels_i"
++ "mil_base_8i1"
+ ],
+- "name": "military base",
+- "sym": "M",
+- "color": "red",
+- "see_cost": 5
++ "copy-from": "generic_military_base",
++ "name": "open air",
++ "sym": ".",
++ "color": "blue",
++ "see_cost": 1
+ }
+ ]
+
+--- a/data/json/overmap/overmap_terrain/overmap_terrain_military.json
++++ b/data/json/overmap/overmap_terrain/overmap_terrain_military.json
+@@ -251,14 +251,10 @@
+ "mil_base_6b",
+ "mil_base_7b",
+ "mil_base_8b",
+- "mil_base_1c",
+ "mil_base_2c",
+ "mil_base_3c",
+ "mil_base_8c",
+ "mil_base_1d",
+- "mil_base_5d",
+- "mil_base_6d",
+- "mil_base_7d",
+ "mil_base_8d",
+ "mil_base_1e",
+ "mil_base_1f",
+@@ -267,17 +263,13 @@
+ "mil_base_2h",
+ "mil_base_1i",
+ "mil_base_2i",
+- "mil_base_1j",
+ "mil_base_2j",
+- "mil_base_3j",
+ "mil_base_8j",
+ "mil_base_1k",
+ "mil_base_2k",
+ "mil_base_3k",
+ "mil_base_4k",
+- "mil_base_5k",
+ "mil_base_6k",
+- "mil_base_7k",
+ "mil_base_8k"
+ ],
+ "copy-from": "generic_military_base",
+@@ -287,6 +279,22 @@
+ },
+ {
+ "type": "overmap_terrain",
++ "id": [ "mil_base_1c", "mil_base_1j", "mil_base_3j", "mil_base_5k", "mil_base_6k", "mil_base_7k" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - storage containers",
++ "sym": "#",
++ "color": "yellow"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [ "mil_base_1c1", "mil_base_1j1", "mil_base_3j1", "mil_base_5k1", "mil_base_6k1", "mil_base_7k1" ],
++ "copy-from": "generic_military_base",
++ "name": "military base - storage container roofs",
++ "sym": "#",
++ "color": "yellow"
++ },
++ {
++ "type": "overmap_terrain",
+ "id": [ "mil_base_5a", "mil_base_6a", "mil_base_7a" ],
+ "copy-from": "generic_military_base",
+ "name": "parking lot",
+@@ -322,70 +330,99 @@
+ "mil_base_3e",
+ "mil_base_5c1",
+ "mil_base_5c",
++ "mil_base_5d1",
++ "mil_base_5d",
+ "mil_base_6c1",
+ "mil_base_6c",
++ "mil_base_6d1",
++ "mil_base_6d",
+ "mil_base_7c1",
+- "mil_base_7c"
++ "mil_base_7c",
++ "mil_base_7d1",
++ "mil_base_7d"
+ ],
+ "copy-from": "generic_military_base",
+- "name": "military base - barracks"
++ "name": "military base - barracks",
++ "color": "light_green"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": [
++ "mil_base_1b1",
++ "mil_base_3b1",
++ "mil_base_5b1",
++ "mil_base_8b1",
++ "mil_base_1g1",
++ "mil_base_8g1",
++ "mil_base_1k1",
++ "mil_base_4k1",
++ "mil_base_8k1"
++ ],
++ "copy-from": "generic_military_base",
++ "name": "military base - watch tower",
++ "sym": "T"
+ },
+ {
+ "type": "overmap_terrain",
+ "id": [ "mil_base_2f1", "mil_base_2f", "mil_base_3f1", "mil_base_3f" ],
+ "copy-from": "generic_military_base",
+- "name": "military base - mess hall"
++ "name": "military base - mess hall",
++ "sym": ">",
++ "color": "pink"
+ },
+ {
+ "type": "overmap_terrain",
+ "id": [ "mil_base_2g1", "mil_base_2g", "mil_base_3g1", "mil_base_3g" ],
+ "copy-from": "generic_military_base",
+- "name": "military base - warehouse"
++ "name": "military base - warehouse",
++ "sym": "w",
++ "color": "light_blue"
+ },
+ {
+ "type": "overmap_terrain",
+ "id": [ "mil_base_3h1", "mil_base_3h" ],
+ "copy-from": "generic_military_base",
+- "name": "military base - communications center"
++ "name": "military base - communications center",
++ "sym": "L",
++ "color": "light_gray"
+ },
+ {
+ "type": "overmap_terrain",
+- "id": [ "mil_base_5e1", "mil_base_5e" ],
++ "id": [ "mil_base_5e1", "mil_base_5e", "mil_base_6e1", "mil_base_6e" ],
+ "copy-from": "generic_military_base",
+- "name": "military base - armory"
++ "name": "military base - armory",
++ "sym": "v"
+ },
+ {
+ "type": "overmap_terrain",
+- "id": [
+- "mil_base_6e1",
+- "mil_base_6e",
+- "mil_base_7e1",
+- "mil_base_7e",
+- "mil_base_8e1",
+- "mil_base_8e",
+- "mil_base_7f1",
+- "mil_base_7f"
+- ],
++ "id": [ "mil_base_7e1", "mil_base_7e", "mil_base_8e1", "mil_base_8e", "mil_base_7f1", "mil_base_7f" ],
+ "copy-from": "generic_military_base",
+- "name": "military base - motor pool"
++ "name": "military base - motor pool",
++ "sym": "O",
++ "color": "white"
+ },
+ {
+ "type": "overmap_terrain",
+ "id": [ "mil_base_5g1", "mil_base_5g" ],
+ "copy-from": "generic_military_base",
+- "name": "military base - command center"
++ "name": "military base - command center",
++ "sym": "<",
++ "color": "light_gray"
+ },
+ {
+ "type": "overmap_terrain",
+ "id": [ "mil_base_5h1", "mil_base_5h", "mil_base_5i1", "mil_base_5i", "mil_base_6i1", "mil_base_6i" ],
+ "copy-from": "generic_military_base",
+- "name": "military base - infirmary"
++ "name": "military base - infirmary",
++ "sym": "+"
+ },
+ {
+ "type": "overmap_terrain",
+ "id": "mil_base_8i",
+ "copy-from": "generic_military_base",
+- "name": "military base - fuel depot"
++ "name": "military base - fuel depot",
++ "sym": "<",
++ "color": "light_blue"
+ },
+ {
+ "type": "overmap_terrain",
+@@ -416,7 +453,7 @@
+ "type": "overmap_terrain",
+ "id": "mil_base_7i",
+ "copy-from": "generic_military_base",
+- "name": "military helipad",
++ "name": "military base - helipad",
+ "sym": "H"
+ },
+ {
+@@ -465,16 +502,11 @@
+ "type": "overmap_terrain",
+ "id": [
+ "mil_base_1a1",
+- "mil_base_1b1",
+- "mil_base_1c1",
+ "mil_base_1d1",
+ "mil_base_1e1",
+ "mil_base_1f1",
+- "mil_base_1g1",
+ "mil_base_1h1",
+ "mil_base_1i1",
+- "mil_base_1j1",
+- "mil_base_1k1",
+ "mil_base_2a1",
+ "mil_base_2b1",
+ "mil_base_2c1",
+@@ -483,9 +515,7 @@
+ "mil_base_2j1",
+ "mil_base_2k1",
+ "mil_base_3a1",
+- "mil_base_3b1",
+ "mil_base_3c1",
+- "mil_base_3j1",
+ "mil_base_3k1",
+ "mil_base_4a1",
+ "mil_base_4b1",
+@@ -497,16 +527,11 @@
+ "mil_base_4h1",
+ "mil_base_4i1",
+ "mil_base_4j1",
+- "mil_base_4k1",
+ "mil_base_5a1",
+- "mil_base_5b1",
+- "mil_base_5d1",
+ "mil_base_5f1",
+ "mil_base_5j1",
+- "mil_base_5k1",
+ "mil_base_6a1",
+ "mil_base_6b1",
+- "mil_base_6d1",
+ "mil_base_6f1",
+ "mil_base_6g1",
+ "mil_base_6h1",
+@@ -514,22 +539,17 @@
+ "mil_base_6k1",
+ "mil_base_7a1",
+ "mil_base_7b1",
+- "mil_base_7d1",
+ "mil_base_7g1",
+ "mil_base_7h1",
+ "mil_base_7i1",
+ "mil_base_7j1",
+- "mil_base_7k1",
+ "mil_base_8a1",
+- "mil_base_8b1",
+ "mil_base_8c1",
+ "mil_base_8d1",
+ "mil_base_8f1",
+- "mil_base_8g1",
+ "mil_base_8h1",
+- "mil_base_8j1",
+- "mil_base_8k1",
+- "mil_base_8i1"
++ "mil_base_8i1",
++ "mil_base_8j1"
+ ],
+ "copy-from": "generic_military_base",
+ "name": "open air",
+
+--- a/data/json/mapgen/military/mil_base/mil_base_z0.json
++++ b/data/json/mapgen/military/mil_base/mil_base_z0.json
+@@ -1577,5 +1577,48 @@
+ { "signage": "DANGER MINEFIELD", "x": 13, "y": 1 }
+ ]
+ }
++ },
++ {
++ "type": "mapgen",
++ "method": "json",
++ "om_terrain": [ "mil_base_minefield_end" ],
++ "weight": 250,
++ "object": {
++ "fill_ter": "t_dirt",
++ "rows": [
++ "xxxxxxxxxxxxxxxxxxxxxxxx",
++ "PmmmmmmmmmmmPmmmmmmmmmPx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmPx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx",
++ "mmmmmmmmmmmmmmmmmmmmmmmx"
++ ],
++ "palettes": [ "mil_base_palette" ],
++ "set": [ { "point": "trap", "id": "tr_landmine_buried", "x": [ 0, 21 ], "y": [ 2, 23 ], "repeat": [ 4, 14 ] } ],
++ "place_signs": [
++ { "signage": "DANGER MINEFIELD", "x": 0, "y": 1 },
++ { "signage": "DANGER MINEFIELD", "x": 12, "y": 1 },
++ { "signage": "DANGER MINEFIELD", "x": 22, "y": 1 },
++ { "signage": "DANGER MINEFIELD", "x": 22, "y": 12 }
++ ]
++ }
+ }
+ ]
diff --git a/jc_npc-eat-from-further-camp.patch b/jc_npc-eat-from-further-camp.patch
new file mode 100644
index 0000000..d711156
--- /dev/null
+++ b/jc_npc-eat-from-further-camp.patch
@@ -0,0 +1,11 @@
+--- a/src/npcmove.cpp
++++ b/src/npcmove.cpp
+@@ -3797,7 +3797,7 @@
+ Character &player_character = get_player_character();
+ cata::optional<basecamp *> potential_bc;
+ for( const tripoint_abs_omt &camp_pos : player_character.camps ) {
+- if( rl_dist( camp_pos, global_omt_location() ) < 3 ) {
++ if( rl_dist( camp_pos, global_omt_location() ) < 6 ) {
+ potential_bc = overmap_buffer.find_camp( camp_pos.xy() );
+ if( potential_bc ) {
+ break;
diff --git a/jc_npcs-eat-when-hungry.patch b/jc_npcs-eat-when-hungry.patch
deleted file mode 100644
index 2074bef..0000000
--- a/jc_npcs-eat-when-hungry.patch
+++ /dev/null
@@ -1,30 +0,0 @@
---- a/src/npcmove.cpp
-+++ b/src/npcmove.cpp
-@@ -1829,7 +1829,9 @@
- }
-
- if( one_in( 3 ) && ( get_thirst() > 40 ||
-- 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;
- }
-@@ -3697,12 +3699,15 @@
- 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 ) {
- mod_hunger( -camp_kcals );
- mod_stored_kcal( camp_kcals );
- yours->food_supply -= camp_kcals;
-+ stomach.mod_calories( camp_kcals );
-+ stomach.mod_contents( -2400_ml );
-+ stomach.mod_contents( 1200_ml );
- return true;
- }
- return false;
diff --git a/jc_stop-non-faction-npc-malnourishment.patch b/jc_stop-non-faction-npc-malnourishment.patch
new file mode 100644
index 0000000..509b2f1
--- /dev/null
+++ b/jc_stop-non-faction-npc-malnourishment.patch
@@ -0,0 +1,39 @@
+--- a/src/npcmove.cpp
++++ b/src/npcmove.cpp
+@@ -131,6 +131,14 @@
+ static const material_id material_chem_methanol( "chem_methanol" );
+ static const material_id material_denat_alcohol( "denat_alcohol" );
+
++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;
+@@ -3811,6 +3819,7 @@
+ if( get_thirst() > 40 && bcp->has_water() ) {
+ complain_about( "camp_water_thanks", 1_hours, "<camp_water_thanks>", false );
+ set_thirst( 0 );
++
+ return true;
+ }
+ faction *yours = player_character.get_faction();
+@@ -3875,6 +3884,13 @@
+ if( !is_player_ally() ) {
+ // TODO: Remove this and let player "exploit" hungry NPCs
+ set_hunger( 0 );
++ 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 );
+ set_thirst( 0 );
+ }
+ } else {
diff --git a/jc_stop-non-faction-npc-sleep-depirvation.patch b/jc_stop-non-faction-npc-sleep-depirvation.patch
index fb8941c..483080c 100644
--- a/jc_stop-non-faction-npc-sleep-depirvation.patch
+++ b/jc_stop-non-faction-npc-sleep-depirvation.patch
@@ -1,6 +1,6 @@
--- a/src/npcmove.cpp
+++ b/src/npcmove.cpp
-@@ -1871,6 +1871,7 @@
+@@ -1917,6 +1917,7 @@
if( !is_player_ally() ) {
// TODO: Make tired NPCs handle sleep offscreen
set_fatigue( 0 );
diff --git a/jc_stop-sleeping-on-tables.patch b/jc_stop-sleeping-on-tables.patch
index d60e950..10a6793 100644
--- a/jc_stop-sleeping-on-tables.patch
+++ b/jc_stop-sleeping-on-tables.patch
@@ -1,6 +1,6 @@
--- a/src/character.cpp
+++ b/src/character.cpp
-@@ -5328,20 +5328,24 @@
+@@ -7017,20 +7017,24 @@
}
}
// Not in a vehicle, start checking furniture/terrain/traps at this point in decreasing order
@@ -28,10 +28,11 @@
- comfort += 0 + trap_at_pos.comfort;
} else {
// Not a comfortable sleeping spot
- comfort -= g->m.move_cost( p );
+ comfort -= here.move_cost( p );
+
--- a/src/mapdata.h
+++ b/src/mapdata.h
-@@ -407,7 +407,7 @@
+@@ -453,7 +453,7 @@
t_thconc_floor, t_thconc_floor_olight, t_strconc_floor,
t_floor, t_floor_waxed,
t_dirtfloor,//Dirt floor(Has roof)
@@ -40,9 +41,10 @@
t_grate,
t_slime,
t_bridge,
+
--- a/src/mapdata.cpp
+++ b/src/mapdata.cpp
-@@ -490,7 +490,7 @@
+@@ -537,7 +537,7 @@
t_thconc_floor, t_thconc_floor_olight, t_strconc_floor,
t_floor, t_floor_waxed,
t_dirtfloor,//Dirt floor(Has roof)
diff --git a/meds-01_antibiotics-unhealthy.patch b/meds-01_antibiotics-unhealthy.patch
new file mode 100644
index 0000000..4b462bd
--- /dev/null
+++ b/meds-01_antibiotics-unhealthy.patch
@@ -0,0 +1,10 @@
+--- a/data/json/items/comestibles/med.json
++++ b/data/json/items/comestibles/med.json
+@@ -92,6 +92,7 @@
+ "stack_size": 200,
+ "symbol": "!",
+ "color": "white",
++ "healthy": -4,
+ "use_action": [ "ANTIBIOTIC" ],
+ "flags": [ "NPC_SAFE", "IRREPLACEABLE_CONSUMABLE" ]
+ },
diff --git a/mutations-01_fix-evac3-background-visible.patch b/mutations-01_fix-evac3-background-visible.patch
new file mode 100644
index 0000000..32f6868
--- /dev/null
+++ b/mutations-01_fix-evac3-background-visible.patch
@@ -0,0 +1,10 @@
+--- a/data/json/npcs/BG_traits.json
++++ b/data/json/npcs/BG_traits.json
+@@ -153,6 +153,7 @@
+ "name": { "str": "Survivor: Evacuee 3" },
+ "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/npc-01_dialogue-fixes.patch b/npc-01_dialogue-fixes.patch
new file mode 100644
index 0000000..cb0fabc
--- /dev/null
+++ b/npc-01_dialogue-fixes.patch
@@ -0,0 +1,23 @@
+--- a/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json
++++ b/data/json/npcs/isherwood_farm/NPC_Jack_Isherwood.json
+@@ -180,7 +180,7 @@
+ {
+ "type": "talk_topic",
+ "id": "TALK_ISHERWOOD_JACK_TALK1",
+- "dynamic_line": "I live here with my wife, this is our family's land. My daughter's family and son live down the road.",
++ "dynamic_line": "I live here with my wife, this is our family's land. My daughter's family live down the road, and my brother-in-law with his son just past them.",
+ "responses": [
+ { "text": "Your whole family survived?", "topic": "TALK_ISHERWOOD_JACK2" },
+ { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_JACK_TOPICS" },
+
+--- a/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json
++++ b/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json
+@@ -84,7 +84,7 @@
+ {
+ "type": "talk_topic",
+ "id": "TALK_ISHERWOOD_LISA_TALK1",
+- "dynamic_line": "My family owns all the land around here, my parents are out in the barn and my other family is down he road.",
++ "dynamic_line": "My family owns all the land around here, my parents are out in the barn and my other family is down the road.",
+ "responses": [
+ { "text": "Ok, I'll go find them.", "topic": "TALK_DONE" },
+ { "text": "Let's talk about something else.", "topic": "TALK_ISHERWOOD_LISA_TOPICS" },
diff --git a/recipes-01_dragon-can-be-dismantled.patch b/recipes-01_dragon-can-be-dismantled.patch
new file mode 100644
index 0000000..cae2714
--- /dev/null
+++ b/recipes-01_dragon-can-be-dismantled.patch
@@ -0,0 +1,10 @@
+--- a/data/json/recipes/ammo/shot.json
++++ b/data/json/recipes/ammo/shot.json
+@@ -69,6 +69,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 ] ] ],
+ "//": "same charge as a 1 oz load, could find no refference to actual loading data. 1490 mg gunpowder rounded to 15 100 mg 'pieces'",
diff --git a/0004-tacoma-clinic-add-missing-floor.patch b/terrain-01_tacoma-clinic-add-missing-floor.patch
index 9accf88..9accf88 100644
--- a/0004-tacoma-clinic-add-missing-floor.patch
+++ b/terrain-01_tacoma-clinic-add-missing-floor.patch
diff --git a/0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch b/terrain-02_make-firestation-shelter-wells-npc-drinkable.patch
index 8eac7f0..d2a2b33 100644
--- a/0.F_backport-make-firestation-shelter-wells-npc-drinkable.patch
+++ b/terrain-02_make-firestation-shelter-wells-npc-drinkable.patch
@@ -1,6 +1,6 @@
---- a/data/json/recipes/basecamps/recipe_modular_firestation1.json
-+++ b/data/json/recipes/basecamps/recipe_modular_firestation1.json
-@@ -50,7 +50,13 @@
+--- a/data/json/recipes/basecamps/recipe_modular_firestation_1/recipe_modular_firestation1.json
++++ b/data/json/recipes/basecamps/recipe_modular_firestation_1/recipe_modular_firestation1.json
+@@ -53,7 +53,13 @@
"construction_blueprint": "fbmc_firestation1_well",
"blueprint_name": "build a well",
"blueprint_requires": [ { "id": "fbmc_firestation1_0" } ],
@@ -15,9 +15,28 @@
"blueprint_excludes": [ { "id": "fbmc_firestation1_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
+@@ -141,7 +141,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",
+
--- 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 @@
+@@ -141,7 +141,13 @@
"construction_blueprint": "fbmc_shelter_1_well",
"blueprint_name": "build a well",
"blueprint_requires": [ { "id": "fbmc_shelter_1_fire" } ],
@@ -32,20 +51,21 @@
"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
+
+--- a/data/json/recipes/basecamps/recipe_modular_shelter_2/recipe_modular_shelter_2_common.json
++++ b/data/json/recipes/basecamps/recipe_modular_shelter_2/recipe_modular_shelter_2_common.json
@@ -136,7 +136,13 @@
- "construction_blueprint": "fbmc_shelter_well",
+ "construction_blueprint": "fbmc_shelter_2_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_requires": [ { "id": "fbmc_shelter_2_fire" } ],
+- "blueprint_provides": [ { "id": "fbmc_shelter_2_well" }, { "id": "relaying" }, { "id": "scouting" }, { "id": "patrolling" } ],
+ "blueprint_provides": [
-+ { "id": "fbmc_shelter_well" },
++ { "id": "fbmc_shelter_2_well" },
+ { "id": "water_well" },
+ { "id": "relaying" },
+ { "id": "scouting" },
+ { "id": "patrolling" }
+ ],
- "blueprint_excludes": [ { "id": "fbmc_shelter_well" } ],
+ "blueprint_excludes": [ { "id": "fbmc_shelter_2_well" } ],
"blueprint_needs": {
"time": "11 h",
diff --git a/tools-01_foldable-bottle-is-container.patch b/tools-01_foldable-bottle-is-container.patch
new file mode 100644
index 0000000..b60fabc
--- /dev/null
+++ b/tools-01_foldable-bottle-is-container.patch
@@ -0,0 +1,20 @@
+--- a/data/json/items/tool/container.json
++++ b/data/json/items/tool/container.json
+@@ -2,7 +2,7 @@
+ {
+ "id": "bottle_metal",
+ "type": "GENERIC",
+- "category": "other",
++ "category": "container",
+ "name": { "str": "steel bottle" },
+ "description": "A stainless steel water bottle, holds 750ml of liquid.",
+ "weight": "200 g",
+@@ -28,7 +28,7 @@
+ {
+ "id": "bottle_folding",
+ "type": "GENERIC",
+- "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/0015-normalize-drone-volume.patch b/tools-02_normalize-drone-volume.patch
index a45ebf0..52a4157 100644
--- a/0015-normalize-drone-volume.patch
+++ b/tools-02_normalize-drone-volume.patch
@@ -7,8 +7,8 @@
- "volume": "750 ml",
+ "volume": "250 ml",
"price": 64500,
+ "price_postapoc": 3000,
"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.",
@@ -16,8 +16,8 @@
- "volume": "250 ml",
+ "volume": "1000 ml",
"price": 67500,
+ "price_postapoc": 3000,
"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.",
@@ -25,8 +25,8 @@
- "volume": "750 ml",
+ "volume": "250 ml",
"price": 59500,
+ "price_postapoc": 500,
"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.",
@@ -34,23 +34,23 @@
- "volume": "750 ml",
+ "volume": "250 ml",
"price": 60500,
+ "price_postapoc": 500,
"to_hit": -3,
- "bashing": 6,
-@@ -179,7 +179,7 @@
+@@ -157,7 +157,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,
+ "price_postapoc": 500,
"to_hit": -3,
- "bashing": 6,
-@@ -205,7 +205,7 @@
+@@ -183,7 +183,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",
++ "volume": "16 L",
"price": 2677500,
+ "price_postapoc": 10000,
"to_hit": -3,
- "bashing": 6,
diff --git a/vampirism.patch b/vampirism.patch
new file mode 100644
index 0000000..319e1fd
--- /dev/null
+++ b/vampirism.patch
@@ -0,0 +1,911 @@
+--- a/src/activity_handlers.cpp
++++ b/src/activity_handlers.cpp
+@@ -231,6 +231,7 @@
+ static const species_id species_HUMAN( "HUMAN" );
+ static const species_id species_ZOMBIE( "ZOMBIE" );
+
++static const json_character_flag json_flag_VAMPIRE( "VAMPIRE" );
+ static const json_character_flag json_flag_CANNIBAL( "CANNIBAL" );
+ static const json_character_flag json_flag_PSYCHOPATH( "PSYCHOPATH" );
+ static const json_character_flag json_flag_SAPIOVORE( "SAPIOVORE" );
+@@ -616,7 +619,8 @@
+ !corpse.in_species( species_ZOMBIE ) );
+ if( is_human && !( u.has_trait_flag( json_flag_CANNIBAL ) ||
+ u.has_trait_flag( json_flag_PSYCHOPATH ) ||
+- u.has_trait_flag( json_flag_SAPIOVORE ) ) ) {
++ u.has_trait_flag( json_flag_SAPIOVORE ) ||
++ u.has_trait_flag( json_flag_VAMPIRE ) ) ) {
+
+ if( u.is_player() ) {
+ if( query_yn( _( "Would you dare desecrate the mortal remains of a fellow human being?" ) ) ) {
+
+--- a/src/character.cpp
++++ b/src/character.cpp
+@@ -343,6 +343,9 @@
+ static const trait_id trait_NOMAD2( "NOMAD2" );
+ static const trait_id trait_NOMAD3( "NOMAD3" );
+ static const trait_id trait_NOPAIN( "NOPAIN" );
++static const trait_id trait_PAINREC1( "PAINREC1" );
++static const trait_id trait_PAINREC2( "PAINREC2" );
++static const trait_id trait_PAINREC3( "PAINREC3" );
+ static const trait_id trait_PADDED_FEET( "PADDED_FEET" );
+ static const trait_id trait_PAWS( "PAWS" );
+ static const trait_id trait_PAWS_LARGE( "PAWS_LARGE" );
+@@ -370,6 +373,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_HUNGER( "VAMP_HUNGER" );
++static const trait_id trait_VAMP_SKIN( "VAMP_SKIN" );
++static const trait_id trait_VAMP_VISION( "VAMP_VISION" );
+ static const trait_id trait_VISCOUS( "VISCOUS" );
+ static const trait_id trait_WATERSLEEP( "WATERSLEEP" );
+ static const trait_id trait_WEBBED( "WEBBED" );
+@@ -2095,6 +2096,9 @@
+ if( has_trait( trait_DEBUG_NIGHTVISION ) ) {
+ vision_mode_cache.set( DEBUG_NIGHTVISION );
+ }
++ if( has_active_mutation( trait_VAMP_VISION ) ) {
++ vision_mode_cache.set( VAMP_VISION );
++ }
+ if( has_nv() ) {
+ vision_mode_cache.set( NV_GOGGLES );
+ }
+@@ -2168,8 +2172,10 @@
+ }
+
+ float range = get_per() / 3.0f - eyes_encumb / 10.0f;
+- if( vision_mode_cache[NV_GOGGLES] || vision_mode_cache[NIGHTVISION_3] ||
+- vision_mode_cache[FULL_ELFA_VISION] || vision_mode_cache[CEPH_VISION] ) {
++ if( vision_mode_cache[VAMP_VISION] ) {
++ range += 15;
++ } else if( vision_mode_cache[NV_GOGGLES] || vision_mode_cache[NIGHTVISION_3] ||
++ vision_mode_cache[FULL_ELFA_VISION] || vision_mode_cache[CEPH_VISION] ) {
+ range += 10;
+ } else if( vision_mode_cache[NIGHTVISION_2] || vision_mode_cache[FELINE_VISION] ||
+ vision_mode_cache[URSINE_VISION] || vision_mode_cache[ELFA_VISION] ) {
+@@ -5442,7 +5447,15 @@
+ {
+ int pain_ticks = rate_multiplier;
+ while( get_pain() > 0 && pain_ticks-- > 0 ) {
+- mod_pain( -roll_remainder( 0.2f + get_pain() / 50.0f ) );
++ if( has_trait( trait_PAINREC1 ) ) {
++ mod_pain( -roll_remainder( 0.2f + get_pain() / 45.0f ) );
++ } else if( has_trait( trait_PAINREC2 ) ) {
++ mod_pain( -roll_remainder( 0.2f + get_pain() / 40.0f ) );
++ } else if( has_trait( trait_PAINREC3 ) ) {
++ mod_pain( -roll_remainder( 0.2f + get_pain() / 30.0f ) );
++ } else {
++ mod_pain( -roll_remainder( 0.2f + get_pain() / 50.0f ) );
++ }
+ }
+
+ float rest = rest_quality();
+@@ -5745,6 +5758,7 @@
+ const bool npc_no_food = is_npc() && get_option<bool>( "NO_NPC_FOOD" );
+ const bool foodless = debug_ls || npc_no_food;
+ const bool no_thirst = has_flag( json_flag_NO_THIRST );
++ const bool vamp = has_trait( trait_VAMP_HUNGER );
+ const bool mycus = has_trait( trait_M_DEPENDENT );
+ const float kcal_per_time = get_bmr() / ( 12.0f * 24.0f );
+ const int five_mins = ticks_between( from, to, 5_minutes );
+@@ -5821,7 +5835,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 || no_thirst ) {
++ if( mycus || vamp || no_thirst ) {
+ set_thirst( 0 );
+ }
+
+@@ -6153,19 +6167,21 @@
+ 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_player_or_npc( m_bad,
+ _( "You have a sudden heart attack!" ),
+ _( "<npcname> has a sudden heart attack!" ) );
+ get_event_bus().send<event_type::dies_from_drug_overdose>( getID(), efftype_id() );
+ set_part_hp_cur( body_part_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_player_or_npc( m_bad,
+ _( "Your breathing stops completely." ),
+ _( "<npcname>'s breathing stops completely." ) );
+ get_event_bus().send<event_type::dies_from_drug_overdose>( getID(), efftype_id() );
+ set_part_hp_cur( body_part_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_player_or_npc( m_bad,
+ _( "Your heart spasms painfully and stops." ),
+@@ -6176,13 +6192,14 @@
+ }
+ get_event_bus().send<event_type::dies_from_drug_overdose>( getID(), effect_jetinjector );
+ set_part_hp_cur( body_part_torso, 0 );
+- } else if( get_effect_dur( effect_adrenaline ) > 50_minutes ) {
++ } else if( ( get_effect_dur( effect_adrenaline ) > 50_minutes ) &&
++ !( has_trait( trait_VAMP_SKIN ) ) ) {
+ add_msg_player_or_npc( m_bad,
+ _( "Your heart spasms and stops." ),
+ _( "<npcname>'s heart spasms and stops." ) );
+ get_event_bus().send<event_type::dies_from_drug_overdose>( getID(), effect_adrenaline );
+ set_part_hp_cur( body_part_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_player_or_npc( m_bad,
+ _( "Your breathing slows down to a stop." ),
+ _( "<npcname>'s breathing slows down to a stop." ) );
+@@ -6447,7 +6464,7 @@
+
+ void Character::update_bodytemp()
+ {
+- if( has_trait( trait_DEBUG_NOTEMP ) ) {
++ if( has_trait( trait_DEBUG_NOTEMP ) || has_trait( trait_VAMP_SKIN ) ) {
+ set_all_parts_temp_conv( BODYTEMP_NORM );
+ set_all_parts_temp_cur( BODYTEMP_NORM );
+ return;
+@@ -11496,7 +11513,7 @@
+ int Character::heartrate_bpm() const
+ {
+ //Dead have no heartbeat usually and no heartbeat in omnicell
+- if( is_dead_state() || has_trait( trait_SLIMESPAWNER ) ) {
++ if( is_dead_state() || has_trait( trait_SLIMESPAWNER ) || has_trait( trait_VAMP_SKIN ) ) {
+ return 0;
+ }
+ //This function returns heartrate in BPM basing of health, physical state, tiredness,
+
+--- a/src/character.h
++++ b/src/character.h
+@@ -111,6 +111,7 @@
+ /// @note vision modes do not necessarily match json ids or flags
+ enum vision_modes {
+ DEBUG_NIGHTVISION,
++ VAMP_VISION,
+ NV_GOGGLES,
+ NIGHTVISION_1,
+ NIGHTVISION_2,
+@@ -256,6 +256,8 @@
+ ALLERGY_WEAK,
+ /// Penalty for eating human flesh (unless psycho/cannibal)
+ CANNIBALISM,
++ // Vampirism (unless psycho/cannibal)
++ VAMPIRISM,
+ /// Comestible has parasites
+ PARASITES,
+ /// Rotten (or, for saprophages, not rotten enough)
+
+--- a/src/consumption.cpp
++++ b/src/consumption.cpp
+@@ -132,6 +132,7 @@
+ static const trait_id trait_THRESH_LUPINE( "THRESH_LUPINE" );
+ static const trait_id trait_THRESH_PLANT( "THRESH_PLANT" );
+ static const trait_id trait_THRESH_URSINE( "THRESH_URSINE" );
++static const trait_id trait_VAMP_HUNGER( "VAMP_HUNGER" );
+ static const trait_id trait_VEGETARIAN( "VEGETARIAN" );
+ static const trait_id trait_WATERSLEEP( "WATERSLEEP" );
+
+@@ -146,6 +147,15 @@
+ flag_id( "ALLERGEN_MEAT" ), flag_id( "ALLERGEN_EGG" )
+ }};
+
++static const std::array<flag_id, 11> 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" )
++ }};
++
+ // TODO: Move pizza scraping here.
+ static int compute_default_effective_kcal( const item &comest, const Character &you,
+ const cata::flat_set<flag_id> &extra_flags = {} )
+@@ -711,6 +721,13 @@
+ return ret_val<edible_rating>::make_failure( INEDIBLE_MUTATION, _( "Ugh, you can't drink that!" ) );
+ }
+
++ if( has_trait_flag( STATIC( json_character_flag( "VAMPIRE" ) ) ) &&
++ food.has_any_flag( vamp_blacklist ) &&
++ !food.has_flag( flag_VAMPIRISM_OK ) ) {
++ return ret_val<edible_rating>::make_failure( INEDIBLE_MUTATION,
++ _( "Bleh. This isn't blood!" ) );
++ }
++
+ if( has_trait( trait_CARNIVORE ) && nutrition_for( food ) > 0 &&
+ food.has_any_flag( carnivore_blacklist ) && !food.has_flag( flag_CARNIVORE_OK ) ) {
+ return ret_val<edible_rating>::make_failure( INEDIBLE_MUTATION,
+@@ -763,11 +780,18 @@
+ }
+ }
+
++ const bool food_is_human_blood = food.has_flag( flag_VAMPIRISM );
++ if( food_is_human_blood && !has_trait_flag( STATIC( json_character_flag( "VAMPIRE" ) ) ) &&
++ !has_trait_flag( STATIC( json_character_flag( "CANNIBAL" ) ) ) ) {
++ add_consequence( _( "The thought of drinking human blood makes you feel sick." ), VAMPIRISM );
++ }
++
+ const bool carnivore = has_trait( trait_CARNIVORE );
+ const bool food_is_human_flesh = food.has_flag( flag_CANNIBALISM ) ||
+ ( food.has_flag( flag_STRICT_HUMANITARIANISM ) &&
+ !has_trait_flag( json_flag_STRICT_HUMANITARIAN ) );
+- if( food_is_human_flesh && !has_trait_flag( STATIC( json_character_flag( "CANNIBAL" ) ) ) ) {
++ if( food_is_human_flesh && !has_trait_flag( STATIC( json_character_flag( "CANNIBAL" ) ) ) &&
++ !food.has_flag( flag_VAMPIRISM ) ) {
+ add_consequence( _( "The thought of eating human flesh makes you feel sick." ), CANNIBALISM );
+ }
+
+@@ -1136,10 +1160,54 @@
+ }
+ }
+
++ const bool food_is_human_blood = food.has_flag( flag_VAMPIRISM );
++ if( food_is_human_blood ) {
++ // Sapiovores don't recognize humans as the same species.
++ // But let them possibly feel cool about eating sapient stuff - treat like psycho
++ // However, spiritual sapiovores should still recognize humans as having a soul or special for religious reasons
++ 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 );
++ const bool spiritual = has_trait( trait_SPIRITUAL );
++ if( vamp ) {
++ add_msg_if_player( m_good, _( "You relish drinking the human blood." ) );
++ add_morale( MORALE_CANNIBAL, 30, 200 );
++ } else if( ( cannibal || sapiovore ) && psycho && spiritual ) {
++ add_msg_if_player( m_good,
++ _( "You drink the human blood, and in doing so, devour their spirit." ) );
++ // You're not really consuming anything special; you just think you are.
++ add_morale( MORALE_CANNIBAL, 25, 300 );
++ } else if( cannibal && psycho ) {
++ add_msg_if_player( m_good, _( "You drink the human blood." ) );
++ add_morale( MORALE_CANNIBAL, 15, 200 );
++ } else if( ( cannibal || sapiovore ) && spiritual ) {
++ add_msg_if_player( m_good, _( "You consume the sacred human blood." ) );
++ // Boosted because you understand the philosophical implications of your actions, and YOU LIKE THEM.
++ add_morale( MORALE_CANNIBAL, 15, 200 );
++ } else if( cannibal ) {
++ add_msg_if_player( m_good, _( "You indulge your shameful hunger." ) );
++ add_morale( MORALE_CANNIBAL, 10, 50 );
++ } else if( ( psycho || sapiovore ) && spiritual ) {
++ add_msg_if_player( _( "You greedily devour the taboo liquid." ) );
++ // Small bonus for violating a taboo.
++ add_morale( MORALE_CANNIBAL, 5, 50 );
++ } else if( psycho || sapiovore ) {
++ add_msg_if_player( _( "Meh. You've eaten worse." ) );
++ } else if( spiritual ) {
++ add_msg_if_player( m_bad,
++ _( "This is probably going to count against you if there's still an afterlife." ) );
++ add_morale( MORALE_CANNIBAL, -60, -400, 60_minutes, 30_minutes );
++ } else {
++ add_msg_if_player( m_bad, _( "You feel horrible for eating a person." ) );
++ add_morale( MORALE_CANNIBAL, -60, -400, 60_minutes, 30_minutes );
++ }
++ }
++
+ const bool food_is_human_flesh = food.has_flag( flag_CANNIBALISM ) ||
+ ( food.has_flag( flag_STRICT_HUMANITARIANISM ) &&
+ !has_trait_flag( json_flag_STRICT_HUMANITARIAN ) );
+- if( food_is_human_flesh ) {
++ if( food_is_human_flesh && !food_is_human_blood ) {
+ // Sapiovores don't recognize humans as the same species.
+ // But let them possibly feel cool about eating sapient stuff - treat like psycho
+ // However, spiritual sapiovores should still recognize humans as having a soul or special for religious reasons
+@@ -1214,6 +1282,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_flag( STATIC( json_character_flag( "VAMPIRE" ) ) ) ) {
++ 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
+@@ -13,8 +13,11 @@
+ 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" );
+@@ -303,6 +306,8 @@
+ const flag_id flag_USE_EAT_VERB( "USE_EAT_VERB" );
+ const flag_id flag_USE_PLAYER_ENERGY( "USE_PLAYER_ENERGY" );
+ const flag_id flag_USE_UPS( "USE_UPS" );
++const flag_id flag_VAMPIRISM( "VAMPIRISM" );
++const flag_id flag_VAMPIRISM_OK( "VAMPIRISM_OK" );
+ const flag_id flag_VARSIZE( "VARSIZE" );
+ const flag_id flag_VEHICLE( "VEHICLE" );
+ const flag_id flag_WAIST( "WAIST" );
+
+--- a/src/flag.h
++++ b/src/flag.h
+@@ -20,8 +20,11 @@
+ 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;
+@@ -310,6 +313,8 @@
+ extern const flag_id flag_USE_EAT_VERB;
+ extern const flag_id flag_USE_PLAYER_ENERGY;
+ extern const flag_id flag_USE_UPS;
++extern const flag_id flag_VAMPIRISM;
++extern const flag_id flag_VAMPIRISM_OK;
+ extern const flag_id flag_VARSIZE;
+ extern const flag_id flag_VEHICLE;
+ extern const flag_id flag_WAIST;
+
+--- a/src/game.cpp
++++ b/src/game.cpp
+@@ -1039,8 +1039,9 @@
+ int iInfoLine = 0;
+
+ if( u.has_amount( itype_holybook_bible1, 1 ) || u.has_amount( itype_holybook_bible2, 1 ) ||
+- u.has_amount( itype_holybook_bible3, 1 ) ) {
+- if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) ) ) {
++ u.has_amount( itype_holybook_bible3, 1 ) || u.has_trait( trait_id( "THRESH_VAMP" ) ) ) {
++ if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) ||
++ u.has_trait( trait_id( "THRESH_VAMP" ) ) ) ) {
+ vRip.emplace_back( " _______ ___" );
+ vRip.emplace_back( " < `/ |" );
+ vRip.emplace_back( " > _ _ (" );
+
+--- a/src/item.cpp
++++ b/src/item.cpp
+@@ -155,6 +155,7 @@
+
+ static const json_character_flag json_flag_CANNIBAL( "CANNIBAL" );
+ static const json_character_flag json_flag_IMMUNE_SPOIL( "IMMUNE_SPOIL" );
++static const json_character_flag json_flag_VAMPIRE( "VAMPIRE" );
+
+ static const bionic_id bio_digestion( "bio_digestion" );
+
+@@ -1967,19 +1967,35 @@
+ info.emplace_back( "DESCRIPTION",
+ _( "* This food will cause an <bad>allergic reaction</bad>." ) );
+ }
++ if( food_item->has_flag( flag_VAMPIRISM ) &&
++ parts->test( iteminfo_parts::FOOD_VAMPIRISM ) ) {
++ if( player_character.has_trait_flag( json_flag_VAMPIRE ) ) {
++ info.emplace_back( "DESCRIPTION",
++ _( "* This food contains <good>human blood</good>." ) );
++ } else if( player_character.has_trait_flag( json_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( !player_character.has_trait_flag( json_flag_CANNIBAL ) ) {
++ if( player_character.has_trait_flag( json_flag_CANNIBAL ) &&
++ !player_character.has_trait_flag( json_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." ) );
+ }
+@@ -4374,6 +4390,7 @@
+ case ALLERGY:
+ case ALLERGY_WEAK:
+ case CANNIBALISM:
++ case VAMPIRISM:
+ case PARASITES:
+ ret = c_red;
+ break;
+
+--- a/src/item_factory.cpp
++++ b/src/item_factory.cpp
+@@ -2505,6 +2505,7 @@
+ // First allergens:
+ // An item is an allergen even if it has trace amounts of allergenic material
+ { material_id( "hflesh" ), flag_CANNIBALISM },
++ { material_id( "blood" ), flag_VAMPIRISM },
+
+ { material_id( "hflesh" ), flag_ALLERGEN_MEAT },
+ { material_id( "iflesh" ), flag_ALLERGEN_MEAT },
+@@ -2519,10 +2520,15 @@
+ { material_id( "mushroom" ), flag_ALLERGEN_VEGGY },
+ { material_id( "milk" ), flag_ALLERGEN_MILK },
+ { material_id( "egg" ), flag_ALLERGEN_EGG },
++ { material_id( "alcohol" ), flag_ALLERGEN_ALCOHOL },
++ { material_id( "foodstuff" ), flag_ALLERGEN_FOODSTUFF },
++ { material_id( "honey" ), flag_ALLERGEN_HONEY },
+ { material_id( "junk" ), flag_ALLERGEN_JUNK },
+ // Not food, but we can keep it here
+ { material_id( "wool" ), flag_ALLERGEN_WOOL },
+ // Now "made of". Those flags should not be passed
++ { material_id( "blood" ), flag_VAMPIRISM_OK },
++ { material_id( "blood" ), flag_CARNIVORE_OK },
+ { material_id( "flesh" ), flag_CARNIVORE_OK },
+ { material_id( "hflesh" ), flag_CARNIVORE_OK },
+ { material_id( "iflesh" ), flag_CARNIVORE_OK },
+
+--- a/src/iteminfo_query.h
++++ b/src/iteminfo_query.h
+@@ -41,6 +41,7 @@
+ FOOD_VITAMINS,
+ FOOD_VIT_EFFECTS,
+ FOOD_CANNIBALISM,
++ FOOD_VAMPIRISM,
+ FOOD_TAINT,
+ FOOD_POISON,
+ FOOD_ALLERGEN,
+
+--- a/src/iuse.cpp
++++ b/src/iuse.cpp
+@@ -342,6 +342,7 @@
+ static const trait_id trait_THRESH_PLANT( "THRESH_PLANT" );
+ static const trait_id trait_TOLERANCE( "TOLERANCE" );
+ static const trait_id trait_URSINE_EYE( "URSINE_EYE" );
++static const trait_id trait_VAMP_SKIN( "VAMP_SKIN" );
+ static const trait_id trait_WAYFARER( "WAYFARER" );
+
+ static const quality_id qual_AXE( "AXE" );
+@@ -4547,6 +4549,9 @@
+ if( p->has_trait( trait_ILLITERATE ) ) {
+ p->add_msg_if_player( m_info, _( "You don't know what you're looking at." ) );
+ return cata::nullopt;
++ } else if( p->has_trait( trait_VAMP_SKIN ) ) {
++ p->add_msg_if_player( _( "Your %s shows warning: 'No heartbeat detected. "
++ "This device must be worn to provide fitness feedback.'" ), it->tname() );
+ } else {
+ //What else should block using f-band?
+ const int bpm = p->heartrate_bpm();
+
+--- a/src/map_field.cpp
++++ b/src/map_field.cpp
+@@ -92,6 +92,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" );
+
+ using namespace map_field_processing;
+
+@@ -1558,7 +1559,8 @@
+ if( ( cur.get_field_intensity() > 1 || !one_in( 3 ) ) && ( !inside || one_in( 3 ) ) ) {
+ u.add_env_effect( effect_teargas, bodypart_id( "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, bodypart_id( "eyes" ), cur.get_field_intensity() * 2, 10_seconds );
+ }
+ }
+@@ -1685,7 +1687,8 @@
+ // 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
+@@ -90,6 +90,7 @@
+ static const trait_id trait_CANNIBAL( "CANNIBAL" );
+ static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" );
+ static const trait_id trait_SAPIOVORE( "SAPIOVORE" );
++static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
+
+ memorial_log_entry::memorial_log_entry( const std::string &preformatted_msg ) :
+ preformatted_( preformatted_msg )
+@@ -590,6 +591,7 @@
+ character_id ch = e.get<character_id>( "killer" );
+ if( ch == avatar_id ) {
+ std::string name = e.get<cata_variant_type::string>( "victim_name" );
++ bool vampire = player_character.has_trait( trait_THRESH_VAMP );
+ bool cannibal = player_character.has_trait( trait_CANNIBAL );
+ bool psycho = player_character.has_trait( trait_PSYCHOPATH );
+ if( player_character.has_trait( trait_SAPIOVORE ) ) {
+@@ -613,6 +615,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
+@@ -40,6 +40,7 @@
+
+ morale_type( "morale_food_bad" ),
+ morale_type( "morale_cannibal" ),
++ morale_type( "morale_vampire" ),
+ morale_type( "morale_vegetarian" ),
+ morale_type( "morale_meatarian" ),
+ morale_type( "morale_antifruit" ),
+@@ -138,6 +139,7 @@
+ const morale_type MORALE_CRAVING_MARLOSS( "morale_craving_marloss" );
+ const morale_type MORALE_FOOD_BAD( "morale_food_bad" );
+ const morale_type MORALE_CANNIBAL( "morale_cannibal" );
++const morale_type MORALE_VAMPIRE( "morale_vampire" );
+ const morale_type MORALE_VEGETARIAN( "morale_vegetarian" );
+ const morale_type MORALE_MEATARIAN( "morale_meatarian" );
+ const morale_type MORALE_ANTIFRUIT( "morale_antifruit" );
+
+--- a/src/morale_types.h
++++ b/src/morale_types.h
+@@ -62,6 +62,7 @@
+ extern const morale_type MORALE_CRAVING_MARLOSS;
+ extern const morale_type MORALE_FOOD_BAD;
+ extern const morale_type MORALE_CANNIBAL;
++extern const morale_type MORALE_VAMPIRE;
+ extern const morale_type MORALE_VEGETARIAN;
+ extern const morale_type MORALE_MEATARIAN;
+ extern const morale_type MORALE_ANTIFRUIT;
+
+--- a/src/mutation.cpp
++++ b/src/mutation.cpp
+@@ -67,6 +67,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" );
+@@ -877,6 +878,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
+@@ -124,6 +124,7 @@
+ static const trait_id trait_SAPIOVORE( "SAPIOVORE" );
+ static const trait_id trait_SCHIZOPHRENIC( "SCHIZOPHRENIC" );
+ static const trait_id trait_TERRIFYING( "TERRIFYING" );
++static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
+
+ class monfaction;
+
+@@ -2600,12 +2601,15 @@
+
+ Character &player_character = get_player_character();
+ if( killer == &player_character && ( !guaranteed_hostile() || hit_by_player ) ) {
++ bool vampire = player_character.has_trait( trait_THRESH_VAMP );
+ bool cannibal = player_character.has_trait( trait_CANNIBAL );
+ bool psycho = player_character.has_trait( trait_PSYCHOPATH );
+ if( player_character.has_trait( trait_SAPIOVORE ) || psycho ) {
+ // No morale effect
+ } else if( cannibal ) {
+ player_character.add_morale( MORALE_KILLED_INNOCENT, -5, 0, 2_days, 3_hours );
++ } else if( vampire ) {
++ player_character.add_morale( MORALE_KILLED_INNOCENT, -5, 0, 2_days, 3_hours );
+ } else {
+ player_character.add_morale( MORALE_KILLED_INNOCENT, -100, 0, 2_days, 3_hours );
+ }
+
+--- a/src/player_hardcoded_effects.cpp
++++ b/src/player_hardcoded_effects.cpp
+@@ -115,6 +115,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_VAMP( "THRESH_VAMP" );
++static const trait_id trait_VAMP_SKIN( "VAMP_SKIN" );
+ static const trait_id trait_WATERSLEEP( "WATERSLEEP" );
+
+ static const json_character_flag json_flag_ALARMCLOCK( "ALARMCLOCK" );
+@@ -882,7 +884,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 {
+@@ -1337,6 +1341,9 @@
+ // 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 = mutation_category_id( "VAMP" );
++ }
+ strength = 4; // Post-human.
+ } else if( highest >= 20 && highest < 35 ) {
+ strength = 1; // Low strength
+
+--- a/src/suffer.cpp
++++ b/src/suffer.cpp
+@@ -151,6 +151,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" );
+@@ -243,7 +245,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_VAMP_SKIN ) ) {
+ oxygen--;
+ }
+ if( oxygen < 12 && worn_with_flag( flag_REBREATHER ) ) {
+@@ -746,7 +749,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();
+ }
+
+@@ -772,6 +776,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()
+@@ -803,7 +814,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;
+ }
+
+@@ -820,6 +832,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.
+@@ -897,7 +915,7 @@
+ }
+
+ // Solar Sensitivity (SUNBURN) trait causes injury to exposed parts
+- if( has_trait( trait_SUNBURN ) ) {
++ if( has_trait( trait_SUNBURN ) || has_trait( trait_VAMP_CURSE ) ) {
+ mod_pain( 1 );
+ // Check exposure of all body parts
+ for( const std::pair<const bodypart_id, float> &bp_exp : bp_exposure ) {
+
+--- a/data/json/field_type.json
++++ b/data/json/field_type.json
+@@ -354,7 +354,7 @@
+ "has_fume": true,
+ "percent_spread": 90,
+ "dirty_transparency_cache": true,
+- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] }
++ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ], "traits": [ "VAMP_SKIN" ] }
+ },
+ {
+ "id": "fd_rubble",
+@@ -429,7 +429,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",
+@@ -515,7 +515,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",
+@@ -544,7 +544,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 ] ], "traits": [ "VAMP_SKIN" ] },
+ "priority": 8,
+ "half_life": "5 minutes",
+ "phase": "gas",
+@@ -590,7 +590,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,
+@@ -1138,7 +1138,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",
+@@ -1160,7 +1160,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",
+@@ -1407,7 +1407,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"
+@@ -1427,7 +1427,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",
+@@ -1449,7 +1449,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
+@@ -1120,6 +1120,21 @@
+ "context": [ "COMESTIBLE" ]
+ },
+ {
++ "id": "ALLERGEN_HONEY",
++ "type": "json_flag",
++ "context": [ "COMESTIBLE" ]
++ },
++ {
++ "id": "ALLERGEN_ALCOHOL",
++ "type": "json_flag",
++ "context": [ "COMESTIBLE" ]
++ },
++ {
++ "id": "ALLERGEN_FOODSTUFF",
++ "type": "json_flag",
++ "context": [ "COMESTIBLE" ]
++ },
++ {
+ "id": "ALLERGEN_JUNK",
+ "type": "json_flag",
+ "context": [ "COMESTIBLE" ]
+@@ -1199,6 +1214,16 @@
+ "type": "json_flag",
+ "context": [ ]
+ },
++ {
++ "id": "VAMPIRISM",
++ "type": "json_flag",
++ "context": [ ]
++ },
++ {
++ "id": "VAMPIRISM_OK",
++ "type": "json_flag",
++ "context": [ ]
++ },
+ {
+ "id": "CASING",
+ "type": "json_flag",
+
+--- a/data/json/morale_types.json
++++ b/data/json/morale_types.json
+@@ -130,6 +130,11 @@
+ "text": "Ate Demihuman Flesh"
+ },
+ {
++ "id": "morale_vampire",
++ "type": "morale_type",
++ "text": "Drank Human Blood"
++ },
++ {
+ "id": "morale_vegetarian",
+ "type": "morale_type",
+ "text": "Ate Vegetables"
+
+--- a/data/json/mutations/mutation_ordering.json
++++ b/data/json/mutations/mutation_ordering.json
+@@ -75,6 +75,7 @@
+ "TROGLO2",
+ "TROGLO3",
+ "URSINE_FUR",
++ "VAMP_SKIN",
+ "VISCOUS"
+ ],
+ "order": 1500
+@@ -182,7 +183,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", "VAMP_EYES" ], "order": 6500 },
+ {
+ "id": [
+ "BEAK",
diff --git a/vehicles-01_portable-generator-engine.patch b/vehicles-01_portable-generator-engine.patch
new file mode 100644
index 0000000..787ef46
--- /dev/null
+++ b/vehicles-01_portable-generator-engine.patch
@@ -0,0 +1,11 @@
+--- a/data/json/vehicles/utility.json
++++ b/data/json/vehicles/utility.json
+@@ -73,7 +73,7 @@
+ "name": "Portable Generator",
+ "blueprint": [ [ "o-" ] ],
+ "parts": [
+- { "x": 0, "y": 0, "parts": [ "frame_cross", "small_storage_battery", "engine_vtwin" ] },
++ { "x": 0, "y": 0, "parts": [ "frame_cross", "small_storage_battery", "engine_1cyl_large" ] },
+ { "x": 0, "y": 0, "parts": [ "generator_7500w", "wheel_mount_light", "wheel_small" ] },
+ { "x": 1, "y": 0, "part": "frame_cross" },
+ { "x": 1, "y": 0, "part": "tank_small", "fuel": "gasoline" },