summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--PKGBUILD328
-rw-r--r--ammo-01_bugs.patch486
-rw-r--r--ammo-01_inconsistent-ammo-names.patch174
-rw-r--r--ammo-02_fix-20x66mm-loudness.patch10
-rw-r--r--ammo-03_fix-reloaded-50bmg.patch14
-rw-r--r--ammo-10_ammo-order-fix.patch585
-rw-r--r--ammo-20_ammo-typos.patch29
-rw-r--r--armor-01_ankle-ammo-pouch-is-not-a-backpack.patch6
-rw-r--r--armor-02_fix-survivor-fingerless-gloves-warmth.patch25
-rw-r--r--bionics-01_npc-can-use-more-bionics.patch26
-rw-r--r--etc-01_fix-rubbersplosion.patch4
-rw-r--r--etc-02_add-missing-price-postapoc.patch82
-rw-r--r--foods-01_fix-food-materials.patch37
-rw-r--r--foods-03_fix-mutant-bad-taste.patch32
-rw-r--r--itemgroups-01_hk46-is-milspec.patch6
-rw-r--r--itemgroups-03_fix-shelter-batteries.patch (renamed from itemgroups-02_fix-shelter-batteries.patch)2
-rw-r--r--jc_more-military-base-overmap.patch800
-rw-r--r--jc_stop-sleeping-on-tables.patch55
-rw-r--r--meds-01_antibiotics-unhealthy.patch6
-rw-r--r--mission-01_typos.patch19
-rw-r--r--mutations-02_fix-evac3-background-visible.patch (renamed from mutations-01_fix-evac3-background-visible.patch)4
-rw-r--r--npc-01_dialogue-fixes.patch23
-rw-r--r--npc-08_nurse-takes-more-meds.patch72
-rw-r--r--npc-09_broker-takes-more-foods.patch165
-rw-r--r--npc-11_npcs-reload-gas-mask.patch124
-rw-r--r--npc-20_dialogue-fixes.patch11
-rw-r--r--recipes-01_4570-dragon-can-be-dismantled.patch (renamed from recipes-01_dragon-can-be-dismantled.patch)4
-rw-r--r--src-01_radio-can-use-ups.patch55
-rw-r--r--src-02_ammo-loudness-ap-times-2.patch (renamed from jc_ammo-loudness-ap-times-2.patch)2
-rw-r--r--src-03_allow-bio-firestarter-on-smoker.patch (renamed from jc_allow-bio-firestarter-on-smoker.patch)16
-rw-r--r--src-04_stop-non-faction-npc-sleep-depirvation.patch (renamed from jc_stop-non-faction-npc-sleep-depirvation.patch)2
-rw-r--r--src-05_stop-non-faction-npc-malnourishment.patch (renamed from jc_stop-non-faction-npc-malnourishment.patch)26
-rw-r--r--src-06_stop-sleeping-on-tables.patch22
-rw-r--r--src-07_allow-hacker-laptop.patch (renamed from jc_allow-hacker-laptop.patch)16
-rw-r--r--src-09_npc-eat-from-further-camp.patch (renamed from jc_npc-eat-from-further-camp.patch)2
-rw-r--r--src-11_remove-legacy-recruiting-penalty.patch11
-rw-r--r--src-12_fix-food-supply-calculations.patch20
-rw-r--r--terrain-01_tacoma-clinic-add-missing-floor.patch11
-rw-r--r--terrain-02_make-firestation-shelter-wells-npc-drinkable.patch71
-rw-r--r--terrain-04_lumbermill-gasoline-not-spilled.patch11
-rw-r--r--terrain-08_more-military-base-overmap.patch257
-rw-r--r--terrain-11_clean-up-map-extras.patch113
-rw-r--r--tools-01_foldable-bottle-is-container.patch20
-rw-r--r--tools-02_normalize-drone-volume.patch56
-rw-r--r--tools-04_normalize-drone-volume.patch56
-rw-r--r--vampirism.patch730
-rw-r--r--vehicles-02_fix-fbi-car-name.patch11
-rw-r--r--vehicles-03_black-box-can-be-installed.patch14
48 files changed, 2532 insertions, 2119 deletions
diff --git a/PKGBUILD b/PKGBUILD
index 82ef5d9..0888c6e 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -11,8 +11,8 @@
pkgbase=cataclysm-dda
pkgname=(cataclysm-dda cataclysm-dda-tiles)
pkgname=cataclysm-dda
-pkgver=0.F.3
-_pkgver=0.F-3
+pkgver=0.G
+_pkgver=0.G
pkgrel=1
pkgdesc="A post-apocalyptic roguelike."
#url="http://cataclysmrl.blogspot.com/"
@@ -20,14 +20,21 @@ pkgdesc="A post-apocalyptic roguelike."
#url="http://en.cataclysmdda.com/"
url="https://cataclysmdda.org/"
arch=('x86_64' 'aarch64')
-license=("CCPL:by-sa")
+license=("CCPL")
+options=('lto')
depends=('ncurses' 'hicolor-icon-theme' 'gettext')
makedepends=('sdl2_image' 'sdl2_ttf' 'sdl2_mixer' 'freetype2' 'astyle')
-source=("$pkgname-$_pkgver.tar.gz::https://github.com/CleverRaven/Cataclysm-DDA/archive/$_pkgver.tar.gz"
+#source=("$pkgname-$_pkgver.tar.gz::https://github.com/CleverRaven/Cataclysm-DDA/archive/refs/tags/cdda-experimental-$_pkgver.tar.gz"
+source=("$pkgname-$_pkgver.tar.gz::https://github.com/CleverRaven/Cataclysm-DDA/archive/refs/tags/$_pkgver.tar.gz"
+#source=("$pkgname-$_pkgver.tar.gz::https://github.com/CleverRaven/Cataclysm-DDA/archive/$_pkgver.tar.gz"
"cataclysm-dda.desktop"
"cataclysm-dda-tiles.desktop"
- "ammo-01_bugs.patch"
+ "ammo-01_inconsistent-ammo-names.patch"
+ "ammo-02_fix-20x66mm-loudness.patch"
+ "ammo-03_fix-reloaded-50bmg.patch"
+ "ammo-10_ammo-order-fix.patch"
+ "ammo-20_ammo-typos.patch"
"armor-01_ankle-ammo-pouch-is-not-a-backpack.patch"
"armor-02_fix-survivor-fingerless-gloves-warmth.patch"
@@ -35,37 +42,46 @@ source=("$pkgname-$_pkgver.tar.gz::https://github.com/CleverRaven/Cataclysm-DDA/
"bionics-01_npc-can-use-more-bionics.patch"
"foods-01_fix-food-materials.patch"
+ "foods-03_fix-mutant-bad-taste.patch"
"itemgroups-01_hk46-is-milspec.patch"
- "itemgroups-02_fix-shelter-batteries.patch"
+ "itemgroups-03_fix-shelter-batteries.patch"
"meds-01_antibiotics-unhealthy.patch"
- "mutations-01_fix-evac3-background-visible.patch"
+ "mission-01_typos.patch"
- "npc-01_dialogue-fixes.patch"
+ "mutations-02_fix-evac3-background-visible.patch"
- "recipes-01_dragon-can-be-dismantled.patch"
+ "npc-08_nurse-takes-more-meds.patch"
+ "npc-09_broker-takes-more-foods.patch"
+ "npc-11_npcs-reload-gas-mask.patch"
+ "npc-20_dialogue-fixes.patch"
- "terrain-01_tacoma-clinic-add-missing-floor.patch"
- "terrain-02_make-firestation-shelter-wells-npc-drinkable.patch"
+ "recipes-01_4570-dragon-can-be-dismantled.patch"
- "tools-01_foldable-bottle-is-container.patch"
- "tools-02_normalize-drone-volume.patch"
+ "terrain-04_lumbermill-gasoline-not-spilled.patch"
+ "terrain-08_more-military-base-overmap.patch"
+ "terrain-11_clean-up-map-extras.patch"
+
+ "tools-04_normalize-drone-volume.patch"
"vehicles-01_portable-generator-engine.patch"
+ "vehicles-02_fix-fbi-car-name.patch"
+ "vehicles-03_black-box-can-be-installed.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_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"
+
+ "src-01_radio-can-use-ups.patch"
+ "src-02_ammo-loudness-ap-times-2.patch"
+ "src-03_allow-bio-firestarter-on-smoker.patch"
+ "src-04_stop-non-faction-npc-sleep-depirvation.patch"
+ "src-05_stop-non-faction-npc-malnourishment.patch"
+ "src-06_stop-sleeping-on-tables.patch"
+ "src-07_allow-hacker-laptop.patch"
+ "src-09_npc-eat-from-further-camp.patch"
+ "src-11_remove-legacy-recruiting-penalty.patch"
+ "src-12_fix-food-supply-calculations.patch"
"vampirism.patch"
@@ -74,47 +90,79 @@ source=("$pkgname-$_pkgver.tar.gz::https://github.com/CleverRaven/Cataclysm-DDA/
"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=('2e715ff131ce654b0ad6f18cb465b80ab55a09e5d48434a7d209454c9a2a952970f572bb81539bf071efe1292310f5b922c75a6c86ba360cca13dbeb91e13996'
+b2sums=('58b3e313d1aaae2d6a3b185904c35dda8fab2d37f99624be4661975772e9f08e94a97d8221f87fb0f27c7a4e1d1ab712811ec5067e63c92139ef36940d12efe6'
'8cff87d80bf30b86f995f77a97cc1ddb7b809148d100f3c0d74e706fe59eac52de55710fb7aed1abd59836c05f2474c7d68455736aac4f229d1cdf806d7240a1'
'8ffff827ed464af678497da5129eb69d3d1a4c6994bbcc00ef7f7b240cd04e7961c3c0ac52d6940252241406c04e647fac19c9327847afced33988eb15973ba8'
- 'f71229fbaf2260602909187ba3894423a04c8625dc41813f2898faf4dcbeb6053007ea082201b1be68a59f6cbfd67e9e6a00d293e77c2f6bc1e225e3dc09ef9c'
- '7ca2d6bbccb4ecb6495d9b7cc114194364c454f40163ac9420c5dceb2027429c9737bb837748987bf8e8b3143bef25552fc9bd7ae5d25a31f8df94ecb093bdc2'
- 'a00106a04f63aeed03a81fb2a3ca6f321fa5c21d0d342753a56c9cccc9000dda9d6e2204368f00aa37c75ce35967b9ea2537b3e7a48ce6a486343c8c2d7f239f'
- '900ec02ec9ec29a0b56341bbc9e947821e4c2c1f3e8914b2e59f317a2860d5b989afe5d1cd8585c60eb13b546167294a9253ad87a64775ad1d7152854bf6707a'
- 'dd9026522976071a8cece8b935ab494e6a0e129b9242b043be3fbaa1478f75bedfbfab662d6286012fd5849e7b6bc097dea5de085d556bbfe1420d41ebddf81f'
- '4d91e3555c0979bb59f8841588aefcb041e04b035931ec95bea519cb2c6df49e72029fa38104b7c80c157114d62203ce57b877dc338f3d2b8a6a5fb5dcef4784'
- '31294c958b9c3d73cf460682f4a1260392b4e87fc04417e0d4ba02be73c3bd43f84537b30bcab09b7879f58c51cc2191d34ccef2f5fcec4d3dad7b1c522146e6'
- '8c946f6f8302b7d184663d79805be93f22578ce11c18f7dbe8fabdddf85cd1cc0617af180fec1cbf3419e310fe57b510b9b961ba2b16c93ef8a66e45258d326e'
- '33cbee2d251a4abf2ec507b31245205877d47152bd39000ea3058089b1fa45bbcb3624a7bbc58f394b1dd9710290f99c1708e3ece8221c71d760d67ff6965449'
- '794ac1cfe88250e1717f3093ce999b1bd2cfaaaa3800d7ad0a13b720efbcc2795ed8c82d558b6b5909a8359178c70f21fe41b1c9ffe726a7a89537140801ef90'
- 'd6421c0f12e7c1a08eee1918c349e7d88e21d5ab980a65ad5798ef3b61319bd4570ecaf8d007d9905f471b623c3633a31c471f34fe5955a8f71229dc0bc52dda'
- 'b8a64accada87ee5be989c5307805610c9b5c0327bc107aab237ac3225dd9e4c51b6c79a2a7de15fe187d3c32d7cbe1c462f9b0e9fb5d5a55a74236c7061e96e'
- '531f35be92feecdcc78faf4f76a538a075a144848b122616594eef7a0954aa6e2876f0007635a92f4be635060d0b58d943cd99dcec2889031363f7dd8d3bc58d'
- '71ddf9190b79669f7e63973ce5b4b3fe0de5d78f52bd76fbe63608a5f330ea757458af2172d5588b59ba48f99c6f43ec051a066ff6bc07c13dd2c5e05d8161f7'
- '8d6fd37497c2ce3c6e65933dded7cd27e165e74ce92cef01b4f1522cd550c8a4f227434d3e566f94e493c385226cf6ff52374d05686b203fd28fdca3babb471c'
+ '5dff40a22314227d603c278a8bf5ceb81e7e4b98fd8fa52edb17a006ee3dca84a1647d8d5ee5ba281c828a5b38b8b6ea2d22996c1c9b0b3ff816dd7f98bb1f14'
+ '28ccb5aae3dd693ffc127c7dc0a038295591cdf5c6fde1b298f7ed0ab0010693bb29c0f01650927e8d993a3af3144ab261de60dd04dc0bc002cbd2ecea6761d2'
+ 'a6c7f8d9741e1e327aeb3fb03ca8a59cb7a311e7a687bf73048a5a1b50c490f6cde99433196628d1bdbd29c078242deb22694e1d9becec1c1da4fa0660464ba7'
+ 'cf8c0c45f9a222b9cfb1694d3d39ebd516b70327cc4567a899a64e43570b35961bf16183dfc891834ac37328dbde7810b5466f130a5b26032b487d6b2ddbc472'
+ '2f5ca21814cc985c7c267d6747598704718b58680f4b94faa40c470070ba47abbf0ea69033763a0008b5234769c8b8358eed93f2c7c210ed7078b6669c2bd0c0'
+ 'b1383199d606fc3ed2cd40c1ec2e32aebc5edb69902ce0477b975bc57d3f6e43dde808ea5af0e326a19e5d61b50f2c1b59848d6505f7d42bb0189977feb6aa05'
+ '0f835c251fd439eb6b620250035ae9b4ca6dc4f6df4db1fa59f9995ef0a1cbdf254c734c3db3a91a66ccdb0459fe36a080de6a809b978a23a499e0e48c39aec1'
+ 'c23b043ecd1fb750ddd88856e7b27856a33a7eea0c6ccb5b376d4961f07ca09d5eac2bbaf71d74932dec3eca9af6ed36ae4230765391bd186268b0cd4d4bb3f8'
+ '2bce148423c87367312f2364c0101620b5da86c69acebd2c877f34788fe727f4ba43ad197f467aed750e17fec84e8445c226fdbbe3b7dea2135f2f4d3e0d6b64'
+ 'cca9a5d27768bf79a615aa9c019b081a0355e79e5417f6046bc331a7fc6079d2d0341dc8fd5d743a403c9baba554e47e497d56da36e55ecedecbb20b6fce05c9'
+ 'a68d2005f084cdeea2cfe11de6da1d3be07ab27da3dee567d1701bbb970f33d20b5e68ef66121c5821beffc96848ba5cbd02e316772f9327fceb7c496aa31ad4'
+ '880cb1a343e2bdaa53c85fe82f8340d5e1c6d32313a99e50063781215ee848e00b16a2041ca5e4c5f765f275525886e9cd20262ed41ca44406697823169cc273'
+ 'f75b8058c6b081eb6e9b889795929f076b0a17736644926eb69df8ac7460c40b3148569f53c5fa2bb390d8a43b7f2a5115c6fffaae82cffa94ff317e257f3a48'
+ '3b7276fe0e708830a09288bfb4076f0ff758ac3ed33711ccfdc93dda2f516630e1aeb5f6e67f417d71fad10eece05528ab4596d3912f657839c45e423df08313'
+ '8a0e245ea0e92649987590e321cc227c0911836f47ac538783e8f0a28a32da8595c916f54d249ac1364283a70e0abc9d7a52331e392f3f5f736ffc0d2fcee789'
+ 'cf2074b5a143d0fcc0ade09c3bdebf0f15b67a8189f5ac0cf2085fdbf3279cbe50298915b756e08fed77f6dd949ae37df9e8fd0ef4399490c33ad8628c1e9b06'
+ 'fbfeff325c231e3a7f556bac9cd1e5d773a1da6e2494a312eec4c3fd76707330b46cd6653aaded770ab46809f45aeec54cdf10344fbc1e0258bf348dca3c7082'
+ '4acf57f108ce331cb364408a63a414c39881b916c2d1c50e1e52ebe8e0b3df63596e9478caa2a7c3a06c59a07cbd80130e669662cc955aec2d32372fe0636771'
+ '79202bbc83ff080b8fe6dfa3beb162d0bf33a642aedd8339948b19e0426d41ee96d12229b1830e09fd6566ea7c941824f7a654130b731fd33b75c0eec5441151'
+ '9957d799eb495afe2505052171ca4835c3cf2dbd47197c983397a0b31caa1cf9ddb325ce365db62a7db5735f40e3951cc611ad3830788b8d3e94480ba586b171'
+ '85aeb5920ee5879848be4057324153a077fe907bed527ed8f9b80a3c5ee1ef64786f63ee2999f5ba74e80a43e99ded3280ce27759c1f7b73259a6e2b5e584aa8'
+ 'e3302d903d053f25aa666d572f74a8bbd3b65dde40eedcbf46e537ceb2294ac22b3772087fce04c4a780c2f18e855179c6ddc8af12d72a89b82957ce09deb52f'
+ '12d93f74de739ade2725983c9f6396111e2bb17f491c0de54f5e006e9b8dd5f5618afd63a1ea6fe2313cc5984157c0e5da62a60b429aa4f2d84751ecdba341f0'
+ '877f36479ff9b8a0284360f1425d3574251c8a48482a824579500bc7da833adecc44c7ecd7d61d708722cf3ae70ba48c2af607c3cbba881720455901521c4889'
'b5567d516b344ceb382bb0253e2b87c90ddc5379afb76a7d384aec0829a6d8a3de2a1f55740871cd286a8cfa23ca635ee9e3f81faa9839dc10fb209955b63c78'
- '22779d1418f24d382431078a3fe35790edbbcfa94ed4c9bf2b2698fe00dbe87466c3dc460b3f02710440db63cf1aa255ab6cf589b06d1e0cf49f512657d588b1'
- '75b1410a950f3d964ed8b610af86f1a60f22ce4a4ebf242370a76e1c66f913c287f1b02dfa77c6d5901c77b060b6f432df06ed322b26fa71d180775f64afc57b'
- '623a0b62417b626817e33f376c14df69211313388ab65451f5eec0c512ee61bfe54871e57f3a6d873392110b538ea7ad18d5e8ac100a71f7fc036a6818d602c2'
- 'fd1fabe15fa3127cfa2b5e60928ee9b48a98bd6e1e5f8f66a3f6625e7d7e076e7eae3048f1bb5a8b4c554679b4a28de30b97eedcb979050d9115c1f2685aae7d'
- 'f346172ac4fdac9ffd7000901f6b145ff45df8abf6c8d495204c08af1e9a34809259819925ebbd0a1e54336701a1d0409671acae6c7c538dfd77ab4d4a506be1'
- '8bb83ab44365599cd58efef13ad0ddf7e6fbc62bf09523c029323efe2bfe2e80ed42dfbd790ade66d26e35e59de623133edb51b0a6dd81637928c205a08c1fc8'
- 'd5287ddb4c38fbca9e6440e5243c718437660c9cf20a836baf1569575f6d953de8995641e6ec20a2a8859b9eefb5b975c416c4fe6f92f0916a5e21c3328d4fce'
- '4e40bc796ebd7941f76d9f11cfa62d7fa6d83c386f325bbec7f2cac99619c059cbf4611fb40ca0d78c8aa2cd3dd15a14de1f144d6f853e96939924caa87dac75'
- '831acc3935f1554a8385c804138a3d83423c5843824e7fbe01334c5d07accd826d9e14805584e6b91d9c6cdc4dbed99ffe32763440da07479f4f5480fbdb941b'
- 'f13c5d89fdaf60621297e86537fc84992bec9d60446dfe41731abde53997223094b91cbf8173636241bc17ebd1f28cf3a33ece604ae67ea0b3c9b6a128c182f6'
- 'a52e780086bfbc44e02de637ec03e99f4aacfc7471f9bc6f8650ad5b36694e4d17a2dcbbf8838e6ed2cd7ef85f43e82035771ad7f283c66dd55e2e4c4358ab84'
- 'ea1ab36365d19be71bd6052e98082a8feb6bbdbe487e8e5795143ceb495059d157b034834bd532a80ccc5a16daa3c355dd56316a27936d441b7c9cc85e40f450'
+ 'a8d9075f3b3c46ec7b6d4d96c6e346c7bf79daa832026faba97846aad89456e18c51eadbfe00d3e6e36fcf2a1ff153de644d7553035fc5046fe6f4ac6de2c9e6'
+ 'b9d519e75c8fdd1522b7ce82055f1c8f5c05e2aaf45d77747e8e3924289322e68dc0ff11145ac9674015593c296eef06b36c5e86b6dc9fb21f2c130282c2b70b'
+ '15f30d2dd4dc437aae2d9237d7ebc299a3b2d6752b111ef26462e165c3665a4aa825616b80e9927b9715ffb31aec25c2831a8015131d0e830e2cf6c9570526df'
+ '06c5652eb2c70b8aba6d788415089b740c3510cd9c570838f656202ba2dc65d4f3289f6695413665de930e84fe287ef035ed8e83a0610a5a316e76a17442683a'
+ '92cde696eec00e6758b58e73e8bc60ad1a73bb2a18d4fdfd24a19b5be715305a047943a02d94a9703c101ca0c769dbeb816f1f28809345bae0fec42fbc27bb34'
+ '9fb6d2945184347e5b4f56f022d9b1b40559c1210edd91cb984d2c69e711dd297eab2a06d1e7d4008052fad658a9574ebd933083e7f8f3b3600b271593cbde15'
+ 'ce82294e480ad42f0001c799fd8131b60024b6097653f3c57564c75e54596616e376f0d7f1cf4e54d8c302a61ef164b4323f795bfa19b2c13ab9e927d37f1600'
+ 'f4d2d03d255a8b73fab16cb04e4f460eb74dd961610b14cc3ea99df4aa52bd024eb230432907e3845f585f4906ba8b1caa9d850666528cee22bada96481a3a21'
+ '1e1c61c519805fe6c8c1d0fb3bf8c28f26823ffea20e4d92610117e81e50401d9eb02e05fb7135325580235bcc42be82921972467b416df5feb20a4742057b53'
+ '8213031fc1e154648008109ae654db938689f01bca27b9a2009854dda7bc4d99e3bd4581f6cbd06e31a632cd8431be01d5e96fd69534670996fde9a1a39691f6'
+ '66f65806ec968d4a9f571d0decb8f1c4f4b386aa3837b5c29713734c003676758e1e9ec8492adf2359847ac9e4ebf791c16dfee426272e90e42775379c5904fa'
+ 'ac2c5e03150bb0860b62d31c68304ad3ca5143a208bb58cd5bcc6beb924a6230cb3617a64bf902a4a69c5d25ce00de8398d5227d36efed4397652849467cfa4a'
+ 'f84197cbd2ed69f0107b136c118ab4608a2d3c70b112689f4dbc01399e8db3867c7673103e30dc9b24393f44438725a8ec82c7770fc7913aa39b61405ba3670b'
+ '4e188cebde0ffd81624f2b9a2c9111aa41a82e3d80a7b80f143af70f0182cce6e0b58350807db2948414f1d655d42367263af67bd5ae707d3ada4010c924ccd1'
+ 'ec274f6809765a638ce17b7c89c442ea9c4232c8ab1e0f72be8d682da76ab6a10cf02c67af5438e7e7a1901af9d6c64f3c598b49052cdeb20932b26bc5e9ba82'
'a56efdaae0344726debf5b74846edce8df7aa2357fbc7a05a3d369d1f457b02934a0d0ce2330072e03f1ac901e06e333c9393f795c761f8440307e7649ed5596'
- '9d0e17552338c9d92ff696f1834a5d99c29d5dfbab6903b620410f62527a0ba60720c9ceec8e203b737f784ade8a53dbaca428ac7cc439f3f4f765aac7f1170f'
+ '14ef4cc6b05f8d9b0d6196c4b6f35cc8083bdf4820c19c320551158b47b570ee6b385f3d6b9888f614fb9d5325265feae810a2c5fff4a0deb42b01612bad6517'
'b9309da09b165fb57e83f84e3584d2479bd3336ed86e181e5df2d27daa92bd55d03d7f3fc226f03696af5f0f32d8e0e7ecd26ae7e50eed0200d0b0feaad07efb')
prepare() {
+ #cd "Cataclysm-DDA-cdda-experimental-${_pkgver}"
cd "Cataclysm-DDA-$_pkgver"
- sed -i 's/-Werror//' Makefile
- sed -i 's/ncursesw5-config/ncursesw6-config/' Makefile
- sed -i 's/shell git/shell false/' Makefile
- sed -i 's/-Os/-O3/' Makefile
+ sed \
+ -e 's/-Werror//' \
+ -e 's/ncursesw5-config/ncursesw6-config/' \
+ -e 's/shell git/shell false/' \
+ -i Makefile
+
+ # Disable default optimizations
+ sed \
+ -e 's/-Os/-O3/' \
+ -e 's/-O0/-O3/' \
+ -e 's/-Og/-O3/' \
+ -e 's/CXXFLAGS += -ffast-math/#CXXFLAGS += -ffast-math/' \
+ -i Makefile
+
+ # Remove non-existent flags generating warnings
+ sed \
+ -e 's/-Wzero-as-null-pointer-constant \\/-Wzero-as-null-pointer-constant/' \
+ -e 's/-Wno-range-loop-analysis/#-Wno-range-loop-analysis/' \
+ -e 's/-Wno-unknown-warning-option/#-Wno-unknown-warning-option/' \
+ -i Makefile
+
+ # They forgot to adjust the version in 0.G!
+ sed -i "s/0.F/0.G/" Makefile
# # # Hotfixes
@@ -124,11 +172,24 @@ prepare() {
# # # 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 mulitple inconsistent ammunition names and handloaded status.
+ patch -Np1 -i "$srcdir"/ammo-01_inconsistent-ammo-names.patch
+
+ # Set a fixed loudness for 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.
+ patch -Np1 -i "$srcdir"/ammo-02_fix-20x66mm-loudness.patch
+
+ # 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.
+ patch -Np1 -i "$srcdir"/ammo-03_fix-reloaded-50bmg.patch
+
+ # 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-10_ammo-order-fix.patch
+
+ # Fix some rather serious typos in ammo descriptions:
+ # Probably someone did a global replace and never audited the results. :/
+ patch -Np1 -i "$srcdir"/ammo-20_ammo-typos.patch
# # armor fixes
@@ -149,12 +210,24 @@ prepare() {
patch -Np1 -i "$srcdir"/bionics-01_npc-can-use-more-bionics.patch
+ # # faction fixes
+ #echo "Applying faction fixes"
+
+
+ # # faction camp fixes
+ #echo "Applying faction camp fixes"
+
+
# # 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 several mutant components lacking the BAD_TASTE flag:
+ # If raw mutant meat is flagged as disgusting, raw mutant fat must be just awful.
+ patch -Np1 -i "$srcdir"/foods-03_fix-mutant-bad-taste.patch
+
# # itemgroups fixes
echo "Applying itemgroup fixes"
@@ -164,60 +237,75 @@ prepare() {
# 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
+ patch -Np1 -i "$srcdir"/itemgroups-03_fix-shelter-batteries.patch
- # # monster fixes
+ # # medicine 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
- # # monster fixes
- #echo "Applying monster fixes"
+ # # missions fixes
+ echo "Applying mission fixes"
+ # Fix Typos:
+ # Foraging encounter has inconsistent monster references. Change all to cougar.
+ patch -Np1 -i "$srcdir"/mission-01_typos.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
+ patch -Np1 -i "$srcdir"/mutations-02_fix-evac3-background-visible.patch
# # npc fixes
echo "Applying NPC fixes"
+ # Update the Tacoma Nurse to buy almost every non-dangerous, non-electrical, and non-expensive medicine.
+ # Also remove acceptance for various tools that are not correctly taken, such as first aid kits.
+ patch -Np1 -i "$srcdir"/npc-08_nurse-takes-more-meds.patch
+
+ # Update the FMC broker to buy most preserved foods.
+ # Also update the dialogue to specify that he buys more types.
+ patch -Np1 -i "$srcdir"/npc-09_broker-takes-more-foods.patch
+
+ # Fix npcs failing to reload activated gas masks:
+ # Most masks lacked a "charges_per_use: 1" field, required for npcs to know they can reload it.
+ # They still won't activate a fresh mask on their own though. :/
+ patch -Np1 -i "$srcdir"/npc-11_npcs-reload-gas-mask.patch
+
# Assorted typos in NPC dialogue.
- patch -Np1 -i "$srcdir"/npc-01_dialogue-fixes.patch
+ patch -Np1 -i "$srcdir"/npc-20_dialogue-fixes.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
+ # Fix reloaded reloaded dragon shot not allowing dismantling when every other non-caseless round does.
+ patch -Np1 -i "$srcdir"/recipes-01_4570-dragon-can-be-dismantled.patch
# # 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 lumbermill gasoline being spilled instead of being inside the gas pump:
+ # The gas pump was placed on top of a tile that didn't allow items inside, causing the gasoline to be shunted to the next valid one.
+ patch -Np1 -i "$srcdir"/terrain-04_lumbermill-gasoline-not-spilled.patch
+
+ # Expand the overmap tiles for the miltiary base to be less MMMM
+ #patch -Np1 -i "$srcdir"/terrain-08_more-military-base-overmap.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
+ # Fix up several typos, missing symbols, odd naming, and many extras lacking map notes support in map extras:
+ # More choice is better than less. You can disable undesired map notes in the map notes settings menu.
+ patch -Np1 -i "$srcdir"/terrain-11_clean-up-map-extras.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
+ patch -Np1 -i "$srcdir"/tools-04_normalize-drone-volume.patch
# # vehicle fixes
@@ -226,6 +314,13 @@ prepare() {
# This way it can actually function as is.
patch -Np1 -i "$srcdir"/vehicles-01_portable-generator-engine.patch
+ # Rename the FBI Car:
+ # The stock name was clearly a typo of some sort.
+ patch -Np1 -i "$srcdir"/vehicles-02_fix-fbi-car-name.patch
+
+ # Fix the black box to actually be installable:
+ # No tool provided screwing 3 and wrenching 3.
+ patch -Np1 -i "$srcdir"/vehicles-03_black-box-can-be-installed.patch
# # Uncategorized for now
@@ -233,70 +328,83 @@ prepare() {
# 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 radio, e-ink reader music, tactical tonfa not working with UPS.
+ #patch -Np1 -i "$srcdir"/src-01_radio-can-use-ups.patch
+
# Fix ammo loudness mulitplying by six instead of two.
- patch -Np1 -i "$srcdir"/jc_ammo-loudness-ap-times-2.patch
+ patch -Np1 -i "$srcdir"/src-02_ammo-loudness-ap-times-2.patch
# Fix smoker racks not accepting bionic firestarter.
- patch -Np1 -i "$srcdir"/jc_allow-bio-firestarter-on-smoker.patch
+ #patch -Np1 -i "$srcdir"/src-03_allow-bio-firestarter-on-smoker.patch
# Fix Non-Player facton NPCs from becoming sleep deprived.
- patch -Np1 -i "$srcdir"/jc_stop-non-faction-npc-sleep-depirvation.patch
+ patch -Np1 -i "$srcdir"/src-04_stop-non-faction-npc-sleep-depirvation.patch
# Fix Non-Player facton NPCs from becoming malnourished.
- patch -Np1 -i "$srcdir"/jc_stop-non-faction-npc-malnourishment.patch
+ patch -Np1 -i "$srcdir"/src-05_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
+ patch -Np1 -i "$srcdir"/src-06_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
+ patch -Np1 -i "$srcdir"/src-07_allow-hacker-laptop.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
+ patch -Np1 -i "$srcdir"/src-09_npc-eat-from-further-camp.patch
+
+ # cur_level is set to -1 on all modern basecamps. Remove the recruiting penalty this legacy variable inadvertently induces.
+ patch -Np1 -i "$srcdir"/src-11_remove-legacy-recruiting-penalty.patch
+
+ # Fix faction food supply being calculated at 288 calories per person instead of 2500.
+ patch -Np1 -i "$srcdir"/src-12_fix-food-supply-calculations.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-cdda-experimental-${_pkgver}"
cd "Cataclysm-DDA-$_pkgver"
#export CFLAGS="$CFLAGS -fPIE"
- export CXXFLAGS="$CXXFLAGS -flto=auto -flto-odr-type-merging -fPIE"
+ export CXXFLAGS="$CXXFLAGS -fPIE"
export LDFLAGS="$LDFLAGS,-pie"
+ # Prevent segfaults when examine tile->search returns no results.
+ #export CXXFLAGS="$(echo $CXXFLAGS | sed -i 's/-Wp,-D_GLIBCXX_ASSERTIONS//' - )" # No longer works
+ export CXXFLAGS="$(echo $CXXFLAGS | sed 's/-Wp,-D_GLIBCXX_ASSERTIONS//')"
+ #echo $CXXFLAGS
+
# 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 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
+ make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 LOCALIZE=1 RUNTESTS=0 VERBOSE=1 PCH=0 LANGUAGES=all
+ make PREFIX=/usr RELEASE=1 USE_XDG_DIR=1 BACKTRACE=0 LOCALIZE=1 RUNTESTS=0 VERBOSE=1 PCH=0 LANGUAGES=all TILES=1 SOUND=1
./lang/compile_mo.sh
}
package_cataclysm-dda() {
+ #cd "Cataclysm-DDA-cdda-experimental-${_pkgver}"
cd "Cataclysm-DDA-$_pkgver"
- make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 USE_HOME_DIR=1 LOCALIZE=1 LANGUAGES=all install
+ make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 USE_HOME_DIR=1 LOCALIZE=1 RUNTESTS=0 VERBOSE=1 PCH=0 LANGUAGES=all install
# Docs
install -d "$pkgdir/usr/share/doc/cataclysm-dda"
cp --reflink -r doc/* "$pkgdir/usr/share/doc/cataclysm-dda"
# undo symlink
rm "$pkgdir/usr/share/doc/cataclysm-dda/JSON_LOADING_ORDER.md"
- cp --reflink 'data/json/LOADING_ORDER.md' "$pkgdir/usr/share/doc/cataclysm-dda/JSON_LOADING_ORDER.md"
+ cp --reflink 'data/json/LOADING_ORDER.md' "$pkgdir/usr/share/doc/cataclysm-dda/JSON_LOADING_ORDER.md"+ # Manpage
+
+ rm "$pkgdir/usr/share/doc/cataclysm-dda/"*.6
+ install -Dm644 -t "$pkgdir/usr/share/man/man6" "doc/cataclysm.6"
# License
install -Dm644 LICENSE.txt "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
@@ -318,13 +426,26 @@ package_cataclysm-dda() {
package_cataclysm-dda-tiles() {
pkgdesc="A graphical post-apocalyptic roguelike."
depends=('cataclysm-dda' 'sdl2_image' 'sdl2_ttf' 'freetype2' 'sdl2_mixer')
+ #cd "Cataclysm-DDA-cdda-experimental-${_pkgver}"
cd "Cataclysm-DDA-$_pkgver"
- make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 LOCALIZE=1 LANGUAGES=all TILES=1 SOUND=1 install
+ make DESTDIR="$pkgdir" PREFIX="/usr" RELEASE=1 LOCALIZE=1 RUNTESTS=0 VERBOSE=1 PCH=0 LANGUAGES=all TILES=1 SOUND=1 install
# Icon
- 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"
+ # Icons
+ cd build-data/osx/AppIcon.iconset
+ for i in *.png
+ do
+ local _isize="$(echo "$i" | sed -Ee 's/icon_([[:digit:]]+)x\1\.png/\1x\1/')"
+ install -Dm644 "$i" "$pkgdir/usr/share/icons/hicolor/$_isize/apps/cataclysm-dda.png"
+ done
+ cd ../../..
+
+ # Manpage
+ install -Dm644 -t "$pkgdir/usr/share/man/man6" "doc/cataclysm-tiles.6"
+
+ #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"
@@ -338,8 +459,6 @@ package_cataclysm-dda-tiles() {
cp --reflink -r "$srcdir/cataclysm-dda-mod_battle-maid-redone-tileset-master/battle-maid-redone-tileset-pt1" "$pkgdir/usr/share/cataclysm-dda/mods"
cp --reflink -r "$srcdir/cataclysm-dda-mod_battle-maid-redone-tileset-master/battle-maid-redone-tileset-pt2" "$pkgdir/usr/share/cataclysm-dda/mods"
- #mv "$srcdir/cataclysm-dda-mod_vampire-stuff-redone-tileset-master" "$srcdir/vampire-stuff-redone-tileset"
- #cp --reflink -r "$srcdir/vampire-stuff-redone-tileset" "$pkgdir/usr/share/cataclysm-dda/mods"
# Sound
mv "$srcdir/cataclysm-dda-soundpack_jcsoundpack-master" "$srcdir/jcsoundpack"
@@ -350,6 +469,7 @@ package_cataclysm-dda-tiles() {
install -Dm644 "$srcdir/coag-musicpack/musicset.json" "$pkgdir/usr/share/cataclysm-dda/sound/jcsoundpack/musicset.json"
cp --reflink -r "$srcdir/coag-musicpack/music" "$pkgdir/usr/share/cataclysm-dda/sound/jcsoundpack"
+
# hack: remove overlapping files
cd "$pkgdir/../cataclysm-dda"
find . -type f -exec rm -f "$pkgdir"/{} \;
diff --git a/ammo-01_bugs.patch b/ammo-01_bugs.patch
deleted file mode 100644
index 3b13277..0000000
--- a/ammo-01_bugs.patch
+++ /dev/null
@@ -1,486 +0,0 @@
---- 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/ammo-01_inconsistent-ammo-names.patch b/ammo-01_inconsistent-ammo-names.patch
new file mode 100644
index 0000000..bdb28ca
--- /dev/null
+++ b/ammo-01_inconsistent-ammo-names.patch
@@ -0,0 +1,174 @@
+--- a/data/json/items/ammo/223.json
++++ b/data/json/items/ammo/223.json
+@@ -74,7 +74,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": "An M856 tracer round. Traditional practice is to load one tracer per every four normal rounds to help keep the weapon they are fired from on target. They have the potential to ignite flammable surfaces at their point of impact.",
+ "extend": { "effects": [ "INCENDIARY" ] }
+ },
+@@ -97,7 +97,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" },
+ "description": "5.56x45mm ammunition with a 62gr FMJ bullet. Someone was down on their luck when they hand-reloaded this one - it's filled with black powder instead of smokeless powder. Expect lower velocity, muzzle smoke, and a dirtier barrel if you shoot it.",
+ "proportional": {
+ "price": 0.3,
+@@ -112,7 +112,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 NATO M856 tracer, black powder" },
+ "description": "An M856 tracer round. Traditional practice is to load one tracer per every four normal rounds to help keep the weapon they are fired from on target. Someone was down on their luck when they hand-reloaded this one - it's filled with black powder instead of smokeless powder. Expect lower velocity, muzzle smoke, and a dirtier barrel if you shoot it.",
+ "proportional": {
+ "price": 0.3,
+@@ -137,7 +137,7 @@
+ "id": "reloaded_556",
+ "copy-from": "556",
+ "type": "AMMO",
+- "name": { "str_sp": "5.56 NATO, reloaded" },
++ "name": { "str_sp": "5.56 NATO M855A1, reloaded" },
+ "description": "5.56x45mm ammunition with a 62gr FMJ bullet. This one has been hand-reloaded by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+@@ -147,7 +147,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" },
+ "description": "An M856 tracer round. Traditional practice is to load one tracer per every four normal rounds to help keep the weapon they are fired from on target. This one has been hand-reloaded by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+--- 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": "An M62 tracer round. Traditional practice is to load one of these for every four normal rounds to help keep the weapon they are fired from on target. They have the potential to ignite flammable surfaces on impact.",
+ "extend": { "effects": [ "INCENDIARY" ] }
+ },
+@@ -60,7 +60,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" },
+ "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. Someone was down on their luck when they hand-reloaded this one - it's filled with black powder instead of smokeless powder. Expect lower velocity, muzzle smoke, and a dirtier barrel if you shoot it.",
+ "proportional": {
+ "price": 0.3,
+@@ -75,7 +75,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" },
+ "description": "An M62 tracer round. Traditional practice is to load one of these for every four normal rounds to help keep the weapon they are fired from on target. Someone was down on their luck when they hand-reloaded this one - it's filled with black powder instead of smokeless powder. Expect lower velocity, muzzle smoke, and a dirtier barrel if you shoot it.",
+ "proportional": {
+ "price": 0.3,
+@@ -100,7 +100,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" },
+ "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. This one has been hand-reloaded by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+@@ -110,7 +110,7 @@
+ "id": "reloaded_762_51_incendiary",
+ "copy-from": "762_51_incendiary",
+ "type": "AMMO",
+- "name": { "str_sp": "7.62x51mm tracer, reloaded" },
++ "name": { "str_sp": "7.62x51mm NATO M62 tracer, reloaded" },
+ "description": "An M62 tracer round. Traditional practice is to load one of these for every four normal rounds to help keep the weapon they are fired from on target. It's been hand-reloaded by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+--- a/data/json/items/ammo/45.json
++++ b/data/json/items/ammo/45.json
+@@ -76,7 +76,7 @@
+ "id": "reloaded_45_acp",
+ "copy-from": "45_acp",
+ "type": "AMMO",
+- "name": { "str_sp": ".45 FMJ, reloaded" },
++ "name": { "str_sp": ".45 ACP FMJ, reloaded" },
+ "description": ".45 ACP ammunition with a 230gr FMJ bullet. Due to a reputation for effectiveness, the .45 ACP round has been common for over a century. This one has been hand-reloaded by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+--- a/data/json/items/ammo/50.json
++++ b/data/json/items/ammo/50.json
+@@ -70,7 +70,7 @@
+ "id": "reloaded_50_incendiary",
+ "copy-from": "50_incendiary",
+ "type": "AMMO",
+- "name": { "str_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 by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo..",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+@@ -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": "A variant of the .50 BMG round that uses a core of hardened steel. Penetration is increased, but damage is reduced. This one has been hand-reloaded. by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+@@ -100,7 +100,7 @@
+ "id": "bp_50_incendiary",
+ "copy-from": "50_incendiary",
+ "type": "AMMO",
+- "name": { "str_sp": ".50 BMG tracer, black powder" },
++ "name": { "str_sp": ".50 BMG M17 tracer, black powder" },
+ "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. Someone was down on their luck when they hand-reloaded this one - it's filled with black powder instead of smokeless powder. Expect lower velocity, muzzle smoke, and a dirtier barrel if you shoot it.",
+ "proportional": {
+ "price": 0.3,
+@@ -130,7 +130,7 @@
+ "id": "bp_50ss",
+ "copy-from": "50ss",
+ "type": "AMMO",
+- "name": { "str_sp": ".50 BMG AP, black powder" },
++ "name": { "str_sp": ".50 BMG M2 AP, black powder" },
+ "description": "A variant of the .50 BMG round that uses a core of very dense, hardened tungsten steel. Penetration is increased, but damage is reduced. Someone was down on their luck when they hand-reloaded this one - it's filled with black powder instead of smokeless powder. Expect lower velocity, muzzle smoke, and a dirtier barrel if you shoot it.",
+ "proportional": {
+ "price": 0.3,
+--- 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 by a lucky survivor or perhaps a pre-Cataclysm corporate spy, leading to slightly inferior performance compared to factory-produced ammo.",
+ "effects": [ "COOKOFF", "RECYCLED" ],
+--- a/data/json/items/ammo/762x25.json
++++ b/data/json/items/ammo/762x25.json
+@@ -67,7 +67,7 @@
+ "id": "reloaded_762_25",
+ "copy-from": "762_25hot",
+ "type": "AMMO",
+- "name": { "str_sp": "7.62x25mm, reloaded" },
++ "name": { "str_sp": "7.62x25mm FMJ, reloaded" },
+ "description": "A high-pressure commercial version of the 7.62x25mm cartridge, loaded with an 85 gr. FMJ bullet. This one has been hand-reloaded by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9, "armor_penetration": 0.9 }, "dispersion": 1.1 }
+ }
diff --git a/ammo-02_fix-20x66mm-loudness.patch b/ammo-02_fix-20x66mm-loudness.patch
new file mode 100644
index 0000000..13f6897
--- /dev/null
+++ b/ammo-02_fix-20x66mm-loudness.patch
@@ -0,0 +1,10 @@
+--- a/data/json/items/ammo/20x66mm.json
++++ b/data/json/items/ammo/20x66mm.json
+@@ -11,6 +11,7 @@
+ "color": "pink",
+ "count": 20,
+ "stack_size": 20,
++ "loudness": 160,
+ "ammo_type": "20x66mm",
+ "effects": [ "COOKOFF", "NEVER_MISFIRES" ]
+ },
diff --git a/ammo-03_fix-reloaded-50bmg.patch b/ammo-03_fix-reloaded-50bmg.patch
new file mode 100644
index 0000000..c1a47f9
--- /dev/null
+++ b/ammo-03_fix-reloaded-50bmg.patch
@@ -0,0 +1,14 @@
+--- a/data/json/items/ammo/50.json
++++ b/data/json/items/ammo/50.json
+@@ -78,9 +78,9 @@
+ },
+ {
+ "id": "reloaded_50bmg",
+- "copy-from": "50match",
++ "copy-from": "50bmg",
+ "type": "AMMO",
+- "name": { "str_sp": ".50 BMG Match, reloaded" },
++ "name": { "str_sp": ".50 BMG M33 Ball, reloaded" },
+ "description": ".50 BMG ammunition with a lead-cored FMJ bullet. 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. by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
diff --git a/ammo-10_ammo-order-fix.patch b/ammo-10_ammo-order-fix.patch
new file mode 100644
index 0000000..35c69e9
--- /dev/null
+++ b/ammo-10_ammo-order-fix.patch
@@ -0,0 +1,585 @@
+--- a/data/json/items/ammo/20x66mm.json
++++ b/data/json/items/ammo/20x66mm.json
+@@ -30,14 +30,49 @@
+ "recoil": 1000
+ },
+ {
+- "id": "20x66_bootleg_flechette",
+- "copy-from": "20x66_flechette",
++ "id": "20x66_shot",
++ "copy-from": "20x66_abstract",
+ "type": "AMMO",
+- "name": { "str": "20x66mm flechette, handmade", "str_pl": "20x66mm flechettes, handmade" },
+- "description": "A handcrafted bootleg duplicate of the Rivtech 20x66mm caseless flechette round.",
+- "proportional": { "price": 0.7, "shot_damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+- "extend": { "effects": [ "RECYCLED" ], "flags": [ "CASELESS_ROUNDS" ] },
+- "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
++ "name": { "str_sp": "20x66mm buckshot" },
++ "//": "2.5x the Generic Rate of $1/shot",
++ "description": "A 20x66mm caseless shotgun round, buckshot type. Proprietary ammunition for Rivtech shotguns.",
++ "price": 1500,
++ "price_postapoc": 4000,
++ "range": 12,
++ "projectile_count": 10,
++ "shot_spread": 10,
++ "shot_damage": { "damage_type": "bullet", "amount": 16 },
++ "damage": { "damage_type": "bullet", "amount": 50 },
++ "recoil": 2500,
++ "extend": { "effects": [ "SHOT" ], "flags": [ "CASELESS_ROUNDS" ] }
++ },
++ {
++ "id": "20x66_flechette",
++ "copy-from": "20x66_shot",
++ "type": "AMMO",
++ "name": { "str": "20x66mm flechette" },
++ "description": "A 20x66mm caseless shotgun round, flechette type. Proprietary ammunition for Rivtech shotguns.",
++ "price": 4000,
++ "price_postapoc": 4000,
++ "count": 10,
++ "shot_spread": 5,
++ "shot_damage": { "damage_type": "bullet", "amount": 8, "armor_penetration": 12 },
++ "damage": { "damage_type": "bullet", "amount": 50 },
++ "extend": { "flags": [ "CASELESS_ROUNDS" ] }
++ },
++ {
++ "id": "20x66_slug",
++ "copy-from": "20x66_abstract",
++ "type": "AMMO",
++ "name": { "str": "20x66mm slug" },
++ "description": "A 20x66mm caseless shotgun round, solid projectile type. Proprietary ammunition for Rivtech shotguns.",
++ "price": 1500,
++ "price_postapoc": 4000,
++ "range": 24,
++ "damage": { "damage_type": "bullet", "amount": 39, "armor_penetration": 8 },
++ "dispersion": 100,
++ "recoil": 2500,
++ "extend": { "flags": [ "CASELESS_ROUNDS" ] }
+ },
+ {
+ "id": "20x66_bootleg_shot",
+@@ -50,6 +85,16 @@
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
+ },
+ {
++ "id": "20x66_bootleg_flechette",
++ "copy-from": "20x66_flechette",
++ "type": "AMMO",
++ "name": { "str": "20x66mm flechette, handmade", "str_pl": "20x66mm flechettes, handmade" },
++ "description": "A handcrafted bootleg duplicate of the Rivtech 20x66mm caseless flechette round.",
++ "proportional": { "price": 0.7, "shot_damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
++ "extend": { "effects": [ "RECYCLED" ], "flags": [ "CASELESS_ROUNDS" ] },
++ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
++ },
++ {
+ "id": "20x66_bootleg_slug",
+ "copy-from": "20x66_slug",
+ "type": "AMMO",
+@@ -90,20 +135,6 @@
+ "extend": { "flags": [ "CASELESS_ROUNDS" ] }
+ },
+ {
+- "id": "20x66_flechette",
+- "copy-from": "20x66_shot",
+- "type": "AMMO",
+- "name": { "str": "20x66mm flechette" },
+- "description": "A 20x66mm caseless shotgun round, flechette type. Proprietary ammunition for Rivtech shotguns.",
+- "price": 4000,
+- "price_postapoc": 4000,
+- "count": 10,
+- "shot_spread": 5,
+- "shot_damage": { "damage_type": "bullet", "amount": 8, "armor_penetration": 12 },
+- "damage": { "damage_type": "bullet", "amount": 50 },
+- "extend": { "flags": [ "CASELESS_ROUNDS" ] }
+- },
+- {
+ "id": "20x66_frag",
+ "copy-from": "20x66_slug",
+ "type": "AMMO",
+@@ -125,36 +156,5 @@
+ "price_postapoc": 5000,
+ "count": 10,
+ "extend": { "effects": [ "INCENDIARY" ], "flags": [ "CASELESS_ROUNDS" ] }
+- },
+- {
+- "id": "20x66_shot",
+- "copy-from": "20x66_abstract",
+- "type": "AMMO",
+- "name": { "str_sp": "20x66mm buckshot" },
+- "//": "2.5x the Generic Rate of $1/shot",
+- "description": "A 20x66mm caseless shotgun round, buckshot type. Proprietary ammunition for Rivtech shotguns.",
+- "price": 1500,
+- "price_postapoc": 4000,
+- "range": 12,
+- "projectile_count": 10,
+- "shot_spread": 10,
+- "shot_damage": { "damage_type": "bullet", "amount": 16 },
+- "damage": { "damage_type": "bullet", "amount": 50 },
+- "recoil": 2500,
+- "extend": { "effects": [ "SHOT" ], "flags": [ "CASELESS_ROUNDS" ] }
+- },
+- {
+- "id": "20x66_slug",
+- "copy-from": "20x66_abstract",
+- "type": "AMMO",
+- "name": { "str": "20x66mm slug" },
+- "description": "A 20x66mm caseless shotgun round, solid projectile type. Proprietary ammunition for Rivtech shotguns.",
+- "price": 1500,
+- "price_postapoc": 4000,
+- "range": 24,
+- "damage": { "damage_type": "bullet", "amount": 39, "armor_penetration": 8 },
+- "dispersion": 100,
+- "recoil": 2500,
+- "extend": { "flags": [ "CASELESS_ROUNDS" ] }
+ }
+ ]
+--- 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": ".22 Conical Ball, 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 a 30gr FMJ bullet. The .22LR round is extremely weak, with short range and negligible recoil. This type is marginally better at piercing through targets, but deals even less damage as a result.",
+- "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": ".22 Conical Ball, 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 a 30gr FMJ bullet. The .22LR round is extremely weak, with short range and negligible recoil. This type is marginally better at piercing through targets, but deals even less damage as a result.",
++ "relative": { "damage": { "damage_type": "bullet", "amount": -1, "armor_penetration": 2 } }
++ },
++ {
+ "id": "22_ratshot",
+ "copy-from": "22_lr",
+ "type": "AMMO",
+--- 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 a brass jacketed 130gr bullet. From its inception, the .38 Special round has been known 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 a brass jacketed 130gr bullet. From its inception, the .38 Special round has been known 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 a 180gr FMJ bullet. 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 a 180gr FMJ bullet. 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/44.json
++++ b/data/json/items/ammo/44.json
+@@ -1,13 +1,5 @@
+ [
+ {
+- "id": "44fmj",
+- "copy-from": "44magnum",
+- "type": "AMMO",
+- "name": { "str_sp": ".44 Magnum FMJ" },
+- "description": "A brass-jacketed variant of the .44 Magnum round. This increases penetration slightly at the cost of reduced damage from expansion.",
+- "relative": { "damage": { "damage_type": "bullet", "amount": -4, "armor_penetration": 8 } }
+- },
+- {
+ "id": "44magnum",
+ "type": "AMMO",
+ "name": { "str": ".44 Magnum" },
+@@ -31,6 +23,14 @@
+ "effects": [ "COOKOFF" ]
+ },
+ {
++ "id": "44fmj",
++ "copy-from": "44magnum",
++ "type": "AMMO",
++ "name": { "str_sp": ".44 Magnum FMJ" },
++ "description": "A brass-jacketed variant of the .44 Magnum round. This increases penetration slightly at the cost of reduced damage from expansion.",
++ "relative": { "damage": { "damage_type": "bullet", "amount": -4, "armor_penetration": 8 } }
++ },
++ {
+ "id": "reloaded_44fmj",
+ "copy-from": "44fmj",
+ "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 a 230gr FMJ bullet. Due to a reputation for effectiveness, 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 a 230gr FMJ bullet. Due to a reputation for effectiveness, 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",
+--- a/data/json/items/ammo/460.json
++++ b/data/json/items/ammo/460.json
+@@ -1,13 +1,5 @@
+ [
+ {
+- "id": "460_fmj",
+- "copy-from": "460_rowland",
+- "type": "AMMO",
+- "name": { "str_sp": ".460 Rowland HCFN" },
+- "description": "A plated, hard cast flat nosed variant of the .460 Rowland round. This increases penetration slightly at the cost of reduced damage from expansion.",
+- "relative": { "damage": { "damage_type": "bullet", "amount": -4, "armor_penetration": 8 } }
+- },
+- {
+ "id": "460_rowland",
+ "copy-from": "44magnum",
+ "type": "AMMO",
+@@ -18,6 +10,14 @@
+ "proportional": { "range": 0.95, "damage": { "damage_type": "bullet", "amount": 0.95, "armor_penetration": 0.95 }, "recoil": 0.95 }
+ },
+ {
++ "id": "460_fmj",
++ "copy-from": "460_rowland",
++ "type": "AMMO",
++ "name": { "str_sp": ".460 Rowland HCFN" },
++ "description": "A plated, hard cast flat nosed variant of the .460 Rowland round. This increases penetration slightly at the cost of reduced damage from expansion.",
++ "relative": { "damage": { "damage_type": "bullet", "amount": -4, "armor_penetration": 8 } }
++ },
++ {
+ "id": "bp_460_fmj",
+ "copy-from": "460_fmj",
+ "type": "AMMO",
+--- 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",
+--- a/data/json/items/ammo/shot.json
++++ b/data/json/items/ammo/shot.json
+@@ -1,5 +1,91 @@
+ [
+ {
++ "abstract": "shotshell_abstract",
++ "type": "AMMO",
++ "name": "base shotshell",
++ "weight": "32 g",
++ "volume": "439 ml",
++ "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
++ "material": [ "plastic", "powder" ],
++ "symbol": "=",
++ "color": "red",
++ "count": 20,
++ "stack_size": 20,
++ "ammo_type": "shot",
++ "casing": "shot_hull"
++ },
++ {
++ "id": "shot_00",
++ "copy-from": "shotshell_abstract",
++ "type": "AMMO",
++ "name": { "str_sp": "00 shot" },
++ "description": "A shell filled with metal pellets. Extremely damaging, plus the spread makes it very accurate at short range. Favored by SWAT forces.",
++ "price": 500,
++ "price_postapoc": 800,
++ "range": 18,
++ "damage": { "damage_type": "bullet", "amount": 60 },
++ "shot_damage": { "damage_type": "bullet", "amount": 15 },
++ "projectile_count": 9,
++ "shot_spread": 300,
++ "recoil": 2500,
++ "loudness": 160,
++ "effects": [ "COOKOFF", "SHOT" ]
++ },
++ {
++ "id": "shot_flechette",
++ "copy-from": "shot_00",
++ "type": "AMMO",
++ "name": { "str": "flechette shell" },
++ "description": "A shotgun shell filled with tiny steel darts. Extremely damaging, plus the spread makes it very accurate at short range. Slices through most forms of armor with ease.",
++ "price": 2000,
++ "price_postapoc": 800,
++ "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
++ "count": 10,
++ "relative": { "shot_damage": { "damage_type": "bullet", "amount": -3, "armor_penetration": 6 }, "shot_spread": -150, "range": 12 }
++ },
++ {
++ "id": "shot_slug",
++ "copy-from": "shotshell_abstract",
++ "type": "AMMO",
++ "name": { "str": "shotgun slug" },
++ "description": "A heavy metal slug used to give a shotgun the range capabilities of a rifle. Extremely damaging but rather inaccurate.",
++ "price": 400,
++ "price_postapoc": 400,
++ "range": 24,
++ "dispersion": 100,
++ "damage": { "damage_type": "bullet", "amount": 50, "armor_penetration": 6 },
++ "recoil": 3500,
++ "effects": [ "COOKOFF" ]
++ },
++ {
++ "id": "shot_bird",
++ "copy-from": "shotshell_abstract",
++ "type": "AMMO",
++ "name": { "str_sp": "birdshot" },
++ "description": "Weak shotgun ammunition. Designed for hunting birds and other small game, its applications in combat are very limited.",
++ "price": 100,
++ "price_postapoc": 400,
++ "projectile_count": 100,
++ "shot_spread": 300,
++ "range": 18,
++ "shot_damage": { "damage_type": "bullet", "amount": 0.2 },
++ "damage": { "damage_type": "bullet", "amount": 50 },
++ "recoil": 1500,
++ "loudness": 128,
++ "effects": [ "COOKOFF", "SHOT", "NOGIB" ]
++ },
++ {
++ "id": "shot_dragon",
++ "copy-from": "shot_00",
++ "type": "AMMO",
++ "name": { "str": "dragon's breath shell" },
++ "description": "A shotgun shell filled with magnesium pellets or shards, used mostly as a distress flare or pyrotechnics tool. When the round is fired, high-temperature sparks and flames shoot out of the barrel, igniting everything in their path.",
++ "price": 1000,
++ "price_postapoc": 1600,
++ "proportional": { "damage": { "damage_type": "bullet", "amount": 0.2 }, "recoil": 0.6, "loudness": 0.8, "range": 0.5 },
++ "extend": { "effects": [ "INCENDIARY", "STREAM", "NOGIB" ] }
++ },
++ {
+ "id": "reloaded_shot_bird",
+ "copy-from": "shot_bird",
+ "type": "AMMO",
+@@ -100,38 +186,6 @@
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
+ },
+ {
+- "abstract": "shotshell_abstract",
+- "type": "AMMO",
+- "name": "base shotshell",
+- "weight": "32 g",
+- "volume": "439 ml",
+- "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+- "material": [ "plastic", "powder" ],
+- "symbol": "=",
+- "color": "red",
+- "count": 20,
+- "stack_size": 20,
+- "ammo_type": "shot",
+- "casing": "shot_hull"
+- },
+- {
+- "id": "shot_00",
+- "copy-from": "shotshell_abstract",
+- "type": "AMMO",
+- "name": { "str_sp": "00 shot" },
+- "description": "A shell filled with metal pellets. Extremely damaging, plus the spread makes it very accurate at short range. Favored by SWAT forces.",
+- "price": 500,
+- "price_postapoc": 800,
+- "range": 18,
+- "damage": { "damage_type": "bullet", "amount": 60 },
+- "shot_damage": { "damage_type": "bullet", "amount": 15 },
+- "projectile_count": 9,
+- "shot_spread": 300,
+- "recoil": 2500,
+- "loudness": 160,
+- "effects": [ "COOKOFF", "SHOT" ]
+- },
+- {
+ "id": "shot_beanbag",
+ "copy-from": "shotshell_abstract",
+ "type": "AMMO",
+@@ -147,46 +201,6 @@
+ "effects": [ "BEANBAG", "COOKOFF", "NOGIB" ]
+ },
+ {
+- "id": "shot_bird",
+- "copy-from": "shotshell_abstract",
+- "type": "AMMO",
+- "name": { "str_sp": "birdshot" },
+- "description": "Weak shotgun ammunition. Designed for hunting birds and other small game, its applications in combat are very limited.",
+- "price": 100,
+- "price_postapoc": 400,
+- "projectile_count": 100,
+- "shot_spread": 300,
+- "range": 18,
+- "shot_damage": { "damage_type": "bullet", "amount": 0.2 },
+- "damage": { "damage_type": "bullet", "amount": 50 },
+- "recoil": 1500,
+- "loudness": 128,
+- "effects": [ "COOKOFF", "SHOT", "NOGIB" ]
+- },
+- {
+- "id": "shot_dragon",
+- "copy-from": "shot_00",
+- "type": "AMMO",
+- "name": { "str": "dragon's breath shell" },
+- "description": "A shotgun shell filled with magnesium pellets or shards, used mostly as a distress flare or pyrotechnics tool. When the round is fired, high-temperature sparks and flames shoot out of the barrel, igniting everything in their path.",
+- "price": 1000,
+- "price_postapoc": 1600,
+- "proportional": { "damage": { "damage_type": "bullet", "amount": 0.2 }, "recoil": 0.6, "loudness": 0.8, "range": 0.5 },
+- "extend": { "effects": [ "INCENDIARY", "STREAM", "NOGIB" ] }
+- },
+- {
+- "id": "shot_flechette",
+- "copy-from": "shot_00",
+- "type": "AMMO",
+- "name": { "str": "flechette shell" },
+- "description": "A shotgun shell filled with tiny steel darts. Extremely damaging, plus the spread makes it very accurate at short range. Slices through most forms of armor with ease.",
+- "price": 2000,
+- "price_postapoc": 800,
+- "flags": [ "IRREPLACEABLE_CONSUMABLE" ],
+- "count": 10,
+- "relative": { "shot_damage": { "damage_type": "bullet", "amount": -3, "armor_penetration": 6 }, "shot_spread": -150, "range": 12 }
+- },
+- {
+ "id": "shot_he",
+ "copy-from": "shot_slug",
+ "type": "AMMO",
+@@ -218,19 +232,5 @@
+ "proportional": { "price": 0.6, "damage": { "damage_type": "bullet", "amount": 0.8 } },
+ "extend": { "effects": [ "RECYCLED", "MUZZLE_SMOKE", "BLACKPOWDER" ] },
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
+- },
+- {
+- "id": "shot_slug",
+- "copy-from": "shotshell_abstract",
+- "type": "AMMO",
+- "name": { "str": "shotgun slug" },
+- "description": "A heavy metal slug used to give a shotgun the range capabilities of a rifle. Extremely damaging but rather inaccurate.",
+- "price": 400,
+- "price_postapoc": 400,
+- "range": 24,
+- "dispersion": 100,
+- "damage": { "damage_type": "bullet", "amount": 50, "armor_penetration": 6 },
+- "recoil": 3500,
+- "effects": [ "COOKOFF" ]
+ }
+ ]
diff --git a/ammo-20_ammo-typos.patch b/ammo-20_ammo-typos.patch
new file mode 100644
index 0000000..7984b2c
--- /dev/null
+++ b/ammo-20_ammo-typos.patch
@@ -0,0 +1,29 @@
+--- a/data/json/items/ammo/50.json
++++ b/data/json/items/ammo/50.json
+@@ -71,7 +71,7 @@
+ "copy-from": "50_incendiary",
+ "type": "AMMO",
+ "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 by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo..",
++ "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 by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo..",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
+@@ -81,7 +81,7 @@
+ "copy-from": "50bmg",
+ "type": "AMMO",
+ "name": { "str_sp": ".50 BMG M33 Ball, reloaded" },
+- "description": ".50 BMG ammunition with a lead-cored FMJ bullet. 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. by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
++ "description": ".50 BMG ammunition with a lead-cored FMJ bullet. 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 by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
+@@ -91,7 +91,7 @@
+ "copy-from": "50ss",
+ "type": "AMMO",
+ "name": { "str_sp": ".50 BMG M2 AP, reloaded" },
+- "description": "A variant of the .50 BMG round that uses a core of hardened steel. Penetration is increased, but damage is reduced. This one has been hand-reloaded. by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
++ "description": "A variant of the .50 BMG round that uses a core of hardened steel. Penetration is increased, but damage is reduced. This one has been hand-reloaded by a survivor or perhaps a pre-Cataclysm hobbyist, leading to slightly inferior performance compared to factory-produced ammo.",
+ "proportional": { "price": 0.7, "damage": { "damage_type": "bullet", "amount": 0.9 }, "dispersion": 1.1 },
+ "extend": { "effects": [ "RECYCLED" ] },
+ "delete": { "effects": [ "NEVER_MISFIRES" ], "flags": [ "IRREPLACEABLE_CONSUMABLE" ] }
diff --git a/armor-01_ankle-ammo-pouch-is-not-a-backpack.patch b/armor-01_ankle-ammo-pouch-is-not-a-backpack.patch
index cc64d3c..fb8406a 100644
--- a/armor-01_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
-@@ -270,7 +270,7 @@
+@@ -277,7 +277,7 @@
"price_postapoc": 750,
- "material": [ "cotton" ],
+ "material": [ "nylon" ],
"symbol": "[",
- "looks_like": "ragpouch",
+ "looks_like": "bootstrap",
"color": "dark_gray",
- "covers": [ "foot_l", "foot_r" ],
"sided": true,
+ "material_thickness": 2,
diff --git a/armor-02_fix-survivor-fingerless-gloves-warmth.patch b/armor-02_fix-survivor-fingerless-gloves-warmth.patch
index dc95162..df564c8 100644
--- a/armor-02_fix-survivor-fingerless-gloves-warmth.patch
+++ b/armor-02_fix-survivor-fingerless-gloves-warmth.patch
@@ -1,11 +1,20 @@
---- 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,
+--- a/data/json/items/armor/bespoke_armor/custom_gloves.json
++++ b/data/json/items/armor/bespoke_armor/custom_gloves.json
+@@ -52,7 +52,7 @@
+ "material": [ "kevlar", "cotton" ],
+ "symbol": "[",
+ "color": "green",
- "warmth": 12,
+ "warmth": 15,
- "material_thickness": 2,
+ "material_thickness": 1,
"environmental_protection": 3,
- "flags": [ "VARSIZE", "WATERPROOF", "STURDY", "ALLOWS_NATURAL_ATTACKS", "ALLOWS_TALONS" ]
+ "flags": [ "VARSIZE", "WATERPROOF", "STURDY", "ALLOWS_NATURAL_ATTACKS" ],
+@@ -103,7 +103,7 @@
+ "material": [ "kevlar", "leather" ],
+ "symbol": "[",
+ "color": "brown",
+- "warmth": 12,
++ "warmth": 15,
+ "material_thickness": 3,
+ "environmental_protection": 3,
+ "flags": [ "VARSIZE", "WATERPROOF", "STURDY", "ALLOWS_NATURAL_ATTACKS", "ALLOWS_TALONS" ],
diff --git a/bionics-01_npc-can-use-more-bionics.patch b/bionics-01_npc-can-use-more-bionics.patch
index 2fed2be..84210b6 100644
--- a/bionics-01_npc-can-use-more-bionics.patch
+++ b/bionics-01_npc-can-use-more-bionics.patch
@@ -1,26 +1,26 @@
--- a/data/json/bionics.json
+++ b/data/json/bionics.json
-@@ -360,7 +360,7 @@
+@@ -758,7 +758,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 ] ],
+ "occupied_bodyparts": [ [ "head", 2 ] ],
- "flags": [ "BIONIC_TOGGLED", "IMMUNE_HEARING_DAMAGE" ],
+ "flags": [ "BIONIC_TOGGLED", "IMMUNE_HEARING_DAMAGE", "BIONIC_NPC_USABLE" ],
"active_flags": [ "SUPER_HEARING" ],
- "included_bionics": [ "bio_earplugs" ]
- },
-@@ -1223,6 +1223,6 @@
+ "auto_deactivates": [ "bio_earplugs" ],
+ "included_bionics": [ "bio_earplugs" ],
+@@ -1726,7 +1726,7 @@
"name": { "str": "Soporific Induction" },
"description": "An electrode has been implanted into your brain's ventrolateral preoptic nucleus. It turns on whenever you're trying to fall asleep, creating an artificial but effective sensation of fatigue.",
"occupied_bodyparts": [ [ "head", 1 ] ],
-- "flags": [ "BIONIC_TOGGLED" ]
-+ "flags": [ "BIONIC_TOGGLED", "BIONIC_NPC_USABLE" ]
- }
- ]
-
+- "flags": [ "BIONIC_TOGGLED" ],
++ "flags": [ "BIONIC_TOGGLED", "BIONIC_NPC_USABLE" ],
+ "enchantments": [ { "condition": "ACTIVE", "values": [ { "value": "SLEEPY", "add": 30 } ] } ]
+ },
+ {
--- a/data/json/items/bionics.json
+++ b/data/json/items/bionics.json
-@@ -275,7 +275,7 @@
+@@ -296,7 +296,7 @@
},
{
"id": "bio_ears",
@@ -29,7 +29,7 @@
"type": "BIONIC_ITEM",
"name": { "str": "Enhanced Hearing CBM" },
"looks_like": "bio_int_enhancer",
-@@ -760,7 +760,7 @@
+@@ -812,7 +812,7 @@
},
{
"id": "bio_fuel_cell_gasoline",
@@ -38,7 +38,7 @@
"type": "BIONIC_ITEM",
"name": { "str": "Gasoline Fuel Cell CBM" },
"looks_like": "bio_int_enhancer",
-@@ -858,7 +858,7 @@
+@@ -919,7 +919,7 @@
},
{
"id": "bio_surgical_razor",
diff --git a/etc-01_fix-rubbersplosion.patch b/etc-01_fix-rubbersplosion.patch
index 30fb82f..43ef7c8 100644
--- a/etc-01_fix-rubbersplosion.patch
+++ b/etc-01_fix-rubbersplosion.patch
@@ -1,6 +1,6 @@
--- a/data/json/items/ammo.json
+++ b/data/json/items/ammo.json
-@@ -768,7 +768,7 @@
+@@ -913,7 +913,7 @@
"count": 25
},
{
@@ -9,7 +9,7 @@
"id": "chunk_rubber",
"category": "spare_parts",
"price": 75,
-@@ -779,7 +779,6 @@
+@@ -924,7 +924,6 @@
"material": [ "rubber" ],
"volume": "250 ml",
"weight": "38 g",
diff --git a/etc-02_add-missing-price-postapoc.patch b/etc-02_add-missing-price-postapoc.patch
deleted file mode 100644
index fbccfc5..0000000
--- a/etc-02_add-missing-price-postapoc.patch
+++ /dev/null
@@ -1,82 +0,0 @@
---- 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
index 0bdff73..a43520e 100644
--- a/foods-01_fix-food-materials.patch
+++ b/foods-01_fix-food-materials.patch
@@ -1,29 +1,41 @@
+--- a/data/json/items/comestibles/bread.json
++++ b/data/json/items/comestibles/bread.json
+@@ -370,8 +370,8 @@
+ "description": "A dense and tasty fried bread treat.",
+ "price": 275,
+ "price_postapoc": 300,
+- "material": [ "wheat", "junk" ],
+- "primary_material": "wheat",
++ "material": [ "veggy", "junk" ],
++ "primary_material": "veggy",
+ "volume": "250 ml",
+ "charges": 6,
+ "flags": [ "EATEN_HOT" ],
--- 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.",
+@@ -38,7 +38,8 @@
+ "description": "Wait, you can milk almonds? Not quite, but you can blend them with water! A dairy-free alternative high in calcium, and rival to soy milk.",
"price": 40,
"price_postapoc": 50,
-- "material": [ "water" ],
+- "material": [ "water", "nut" ],
+ "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.",
+ "vitamins": [ [ "calcium", 11 ] ],
+@@ -61,7 +62,8 @@
+ "description": "Wait, you can milk soybeans? Not quite, but you can blend them with water! A dairy-free alternative high in protein, and rival to almond milk.",
"price": 40,
"price_postapoc": 50,
-- "material": [ "water" ],
+- "material": [ "water", "veggy" ],
+ "material": "veggy",
+ "primary_material": "water",
"volume": "250 ml",
"phase": "liquid",
- "vitamins": [ [ "vitA", 2 ], [ "iron", 1 ], [ "calcium", 7 ] ],
-
+ "vitamins": [ [ "iron", 1 ], [ "calcium", 7 ] ],
--- a/data/json/items/comestibles/nuts.json
-+++ a/data/json/items/comestibles/nuts.json
-@@ -445,6 +445,7 @@
++++ b/data/json/items/comestibles/nuts.json
+@@ -443,6 +443,7 @@
"volume": "250 ml",
"comestible_type": "DRINK",
"container": "jar_glass_sealed",
@@ -31,10 +43,9 @@
"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 @@
+@@ -79,6 +79,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,
diff --git a/foods-03_fix-mutant-bad-taste.patch b/foods-03_fix-mutant-bad-taste.patch
new file mode 100644
index 0000000..56e414c
--- /dev/null
+++ b/foods-03_fix-mutant-bad-taste.patch
@@ -0,0 +1,32 @@
+--- a/data/json/items/comestibles/carnivore.json
++++ b/data/json/items/comestibles/carnivore.json
+@@ -381,7 +381,8 @@
+ "cooks_like": "mutant_meat_scrap_cooked",
+ "proportional": { "price_postapoc": 0.2, "calories": 0.5 },
+ "vitamins": [ [ "mutant_toxin", 2 ] ],
+- "delete": { "flags": [ "SMOKABLE" ] }
++ "delete": { "flags": [ "SMOKABLE" ] },
++ "extend": { "flags": [ "BAD_TASTE" ] }
+ },
+ {
+ "id": "mutant_human_flesh",
+@@ -1237,7 +1238,8 @@
+ "description": "A chunk of raw fat butchered from a heavily-mutated animal. It smells, if anything, even more disgusting than the rest of the mutant. There are little puddles of unidentified oils dripping from it.",
+ "looks_like": "fat",
+ "proportional": { "price": 0.2 },
+- "vitamins": [ [ "mutant_toxin", 360 ] ]
++ "vitamins": [ [ "mutant_toxin", 360 ] ],
++ "extend": { "flags": [ "BAD_TASTE" ] }
+ },
+ {
+ "id": "mutant_tallow",
+@@ -1247,7 +1249,8 @@
+ "description": "A smooth white block of cleaned and rendered fat, sourced from a mutant animal. It will remain edible for a very long time, and can be used as an ingredient in many foods and projects.",
+ "looks_like": "tallow",
+ "proportional": { "price": 0.2 },
+- "vitamins": [ [ "mutant_toxin", 180 ] ]
++ "vitamins": [ [ "mutant_toxin", 180 ] ],
++ "extend": { "flags": [ "BAD_TASTE" ] }
+ },
+ {
+ "id": "mutant_lard",
diff --git a/itemgroups-01_hk46-is-milspec.patch b/itemgroups-01_hk46-is-milspec.patch
index ad2f0c6..f77b4d9 100644
--- a/itemgroups-01_hk46-is-milspec.patch
+++ b/itemgroups-01_hk46-is-milspec.patch
@@ -1,6 +1,6 @@
--- a/data/json/itemgroups/Weapons_Mods_Ammo/magazines.json
+++ b/data/json/itemgroups/Weapons_Mods_Ammo/magazines.json
-@@ -75,7 +75,6 @@
+@@ -81,7 +81,6 @@
{ "item": "fn57mag", "prob": 15, "charges": [ 0, 20 ] },
{ "item": "glockmag", "prob": 40, "charges": [ 0, 15 ] },
{ "item": "glock40mag", "prob": 30, "charges": [ 0, 15 ] },
@@ -8,11 +8,11 @@
{ "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 @@
+@@ -104,7 +103,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 ] },
+ { "item": "stanag30ranger", "prob": 5, "charges": [ 0, 30 ] },
diff --git a/itemgroups-02_fix-shelter-batteries.patch b/itemgroups-03_fix-shelter-batteries.patch
index d9330dd..aa8f112 100644
--- a/itemgroups-02_fix-shelter-batteries.patch
+++ b/itemgroups-03_fix-shelter-batteries.patch
@@ -15,7 +15,7 @@
{ "item": "light_disposable_cell", "prob": 10 },
{ "item": "lighter", "prob": 20, "charges": [ 60, 100 ] },
{ "item": "whistle", "prob": 70 },
-@@ -82,9 +88,21 @@
+@@ -83,9 +89,21 @@
"collection": [
{ "item": "extinguisher", "prob": 70, "charges": 100 },
{ "group": "full_1st_aid", "count": [ 1, 3 ], "prob": 65 },
diff --git a/jc_more-military-base-overmap.patch b/jc_more-military-base-overmap.patch
deleted file mode 100644
index a7aabfc..0000000
--- a/jc_more-military-base-overmap.patch
+++ /dev/null
@@ -1,800 +0,0 @@
---- 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_stop-sleeping-on-tables.patch b/jc_stop-sleeping-on-tables.patch
deleted file mode 100644
index 10a6793..0000000
--- a/jc_stop-sleeping-on-tables.patch
+++ /dev/null
@@ -1,55 +0,0 @@
---- a/src/character.cpp
-+++ b/src/character.cpp
-@@ -7017,20 +7017,24 @@
- }
- }
- // Not in a vehicle, start checking furniture/terrain/traps at this point in decreasing order
-- else if( furn_at_pos != f_null ) {
-+ else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 5 ) {
- comfort += 0 + furn_at_pos.obj().comfort;
- }
- // Web sleepers can use their webs if better furniture isn't available
- else if( websleep && web >= 3 ) {
- comfort += 1 + static_cast<int>( comfort_level::slightly_comfortable );
-+ } else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 4 ) {
-+ comfort += 0 + furn_at_pos.obj().comfort;
-+ } else if( !trap_at_pos.is_null() ) {
-+ comfort += 0 + trap_at_pos.comfort;
- } else if( ter_at_pos == t_improvised_shelter ) {
- comfort += 0 + static_cast<int>( comfort_level::slightly_comfortable );
-- } else if( ter_at_pos == t_floor || ter_at_pos == t_floor_waxed ||
-+ } else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 1 ) {
-+ comfort += 0 + furn_at_pos.obj().comfort;
-+ } else if( ter_at_pos == t_carpet_concrete || ter_at_pos == t_carpet_metal ||
- ter_at_pos == t_carpet_red || ter_at_pos == t_carpet_yellow ||
- ter_at_pos == t_carpet_green || ter_at_pos == t_carpet_purple ) {
- comfort += 1 + static_cast<int>( comfort_level::neutral );
-- } else if( !trap_at_pos.is_null() ) {
-- comfort += 0 + trap_at_pos.comfort;
- } else {
- // Not a comfortable sleeping spot
- comfort -= here.move_cost( p );
-
---- a/src/mapdata.h
-+++ b/src/mapdata.h
-@@ -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)
-- t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green,
-+ t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, t_carpet_concrete, t_carpet_metal,
- t_grate,
- t_slime,
- t_bridge,
-
---- a/src/mapdata.cpp
-+++ b/src/mapdata.cpp
-@@ -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)
-- t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green,
-+ t_carpet_red, t_carpet_yellow, t_carpet_purple, t_carpet_green, t_carpet_concrete, t_carpet_metal,
- t_linoleum_white, t_linoleum_gray,
- t_grate,
- t_slime,
diff --git a/meds-01_antibiotics-unhealthy.patch b/meds-01_antibiotics-unhealthy.patch
index 4b462bd..875de33 100644
--- a/meds-01_antibiotics-unhealthy.patch
+++ b/meds-01_antibiotics-unhealthy.patch
@@ -1,10 +1,10 @@
--- a/data/json/items/comestibles/med.json
+++ b/data/json/items/comestibles/med.json
-@@ -92,6 +92,7 @@
+@@ -95,6 +95,7 @@
"stack_size": 200,
"symbol": "!",
"color": "white",
+ "healthy": -4,
+ "container": "bottle_plastic_pill_prescription",
"use_action": [ "ANTIBIOTIC" ],
- "flags": [ "NPC_SAFE", "IRREPLACEABLE_CONSUMABLE" ]
- },
+ "flags": [ "NPC_SAFE", "IRREPLACEABLE_CONSUMABLE", "WATER_DISSOLVE", "EDIBLE_FROZEN" ]
diff --git a/mission-01_typos.patch b/mission-01_typos.patch
new file mode 100644
index 0000000..d5307d9
--- /dev/null
+++ b/mission-01_typos.patch
@@ -0,0 +1,19 @@
+--- a/src/mission_companion.cpp
++++ b/src/mission_companion.cpp
+@@ -2054,14 +2054,14 @@
+ int monsters = rng( 0, 10 );
+ if( skill * rng_float( .80, 1.2 ) > monsters * rng_float( .8, 1.2 ) ) {
+ if( one_in( 2 ) ) {
+- popup( _( "%s was able to scare off the bear after delivering a nasty "
++ popup( _( "%s was able to scare off the cougar after delivering a nasty "
+ "blow!" ), comp->get_name() );
+ } else {
+ popup( _( "%s beat the cougar into a bloody pulp!" ), comp->get_name() );
+ }
+ } else {
+ if( one_in( 2 ) ) {
+- popup( _( "%s was able to hold off the first wolf, but the others that were "
++ popup( _( "%s was able to hold off the first cougar, but the others that were "
+ "skulking in the tree line caught up…" ), comp->get_name() );
+ popup( _( "I'm sorry, there wasn't anything we could do…" ) );
+ } else {
diff --git a/mutations-01_fix-evac3-background-visible.patch b/mutations-02_fix-evac3-background-visible.patch
index 32f6868..b9b332d 100644
--- a/mutations-01_fix-evac3-background-visible.patch
+++ b/mutations-02_fix-evac3-background-visible.patch
@@ -1,9 +1,9 @@
--- a/data/json/npcs/BG_traits.json
+++ b/data/json/npcs/BG_traits.json
-@@ -153,6 +153,7 @@
+@@ -157,6 +157,7 @@
"name": { "str": "Survivor: Evacuee 3" },
"points": 0,
- "description": "This NPC could tell you about how they survived the Cataclysm",
+ "description": "This NPC could tell you about how they survived the Cataclysm.",
+ "player_display": false,
"valid": false,
"purifiable": false,
diff --git a/npc-01_dialogue-fixes.patch b/npc-01_dialogue-fixes.patch
deleted file mode 100644
index cb0fabc..0000000
--- a/npc-01_dialogue-fixes.patch
+++ /dev/null
@@ -1,23 +0,0 @@
---- 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/npc-08_nurse-takes-more-meds.patch b/npc-08_nurse-takes-more-meds.patch
new file mode 100644
index 0000000..9f17128
--- /dev/null
+++ b/npc-08_nurse-takes-more-meds.patch
@@ -0,0 +1,72 @@
+--- a/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json
++++ b/data/json/npcs/tacoma_ranch/NPC_ranch_nurse.json
+@@ -49,27 +49,67 @@
+ "repeat_responses": {
+ "for_item": [
+ "1st_aid",
+- "ifak",
++ "adderall",
++ "adrenaline_injector",
++ "anesthetic_kit",
+ "antibiotics",
++ "antifungal",
++ "antiparasitic",
+ "aspirin",
+ "bandages",
++ "bandages_makeshift",
++ "bandages_makeshift_bleached",
++ "bandages_makeshift_boiled",
+ "adhesive_bandages",
+ "bfipowder",
++ "bonemeal_tablet",
++ "caffeine",
++ "calcium_tablet",
++ "cattail_jelly",
+ "chem_hydrogen_peroxide",
+ "codeine",
++ "contacts",
++ "cotton_ball",
+ "dayquil",
++ "disincottonball",
+ "disinfectant",
++ "disinfectant_makeshift",
++ "disinrag",
++ "diazepam",
++ "eyedrops",
++ "flavored_bonemeal_tablet",
+ "flu_shot",
++ "gummy_vitamins",
++ "ifak",
++ "inj_vitb",
++ "inj_iron",
++ "iodine",
++ "makeshift_stethoscope",
++ "medical_gauze",
++ "medical_tape",
+ "morphine",
++ "mugwort_oil",
++ "nic_gum",
+ "nyquil",
+ "oxycodone",
++ "pepto",
++ "pills_sleep",
+ "poppy_pain",
+ "poppysyrup",
++ "prozac",
++ "prussian_blue",
+ "quikclot",
++ "saline",
++ "stethoscope",
++ "tea_bark",
++ "thermometer",
++ "thorazine",
+ "thyme_oil",
+ "tramadol",
++ "vitamins",
+ "weak_antibiotic",
+- "cattail_jelly"
++ "wrapped_rad_badge",
++ "xanax"
+ ],
+ "response": { "text": "Delivering <topic_item>.", "topic": "TALK_DELIVER_ASK" }
+ },
diff --git a/npc-09_broker-takes-more-foods.patch b/npc-09_broker-takes-more-foods.patch
new file mode 100644
index 0000000..e15bbd7
--- /dev/null
+++ b/npc-09_broker-takes-more-foods.patch
@@ -0,0 +1,165 @@
+--- a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_broker.json
++++ b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_broker.json
+@@ -88,21 +88,135 @@
+ "dynamic_line": "Excellent. What've you brought us?",
+ "repeat_responses": {
+ "for_item": [
+- "jerky",
+- "meat_smoked",
+- "fish_smoked",
+- "dry_meat",
+- "dry_veggy",
+- "dry_fruit",
++ "acorn_roasted",
++ "almond_roasted",
++ "apple_canned",
++ "apple_sugar",
++ "bacon",
++ "beer",
++ "belgian_ale",
++ "bum_wine",
++ "burdock_wine",
++ "can_beans",
++ "can_chicken",
++ "can_chowder",
++ "can_clams",
++ "can_corn",
++ "can_herring",
++ "can_peach",
++ "can_pineapple",
++ "can_salmon",
++ "can_sardine",
++ "can_spam",
++ "can_tuna",
++ "can_tomato",
++ "cheese_hard",
++ "chestnut_roasted",
++ "con_milk",
+ "cooking_oil",
+ "cooking_oil2",
+ "cornmeal",
++ "dandelion_wine",
++ "dried_salad",
++ "drink_kalimotxo",
++ "dry_beans",
++ "dry_fish",
++ "dry_fruit",
++ "dry_meat",
++ "dry_mushroom",
++ "dry_lentils",
++ "dry_rice",
++ "dry_tofu",
++ "dry_veggy",
++ "edamame_roasted",
++ "european_pilsner",
++ "fish_canned",
++ "fish_pickled",
++ "fish_smoked",
+ "flour",
++ "fruit_leather",
+ "fruit_wine",
+- "beer",
+- "sugar",
++ "granola",
++ "hardtack",
++ "hazelnut_roasted",
++ "hb_beer",
++ "hickory_nut_roasted",
++ "imperial_stout",
++ "india_pale_ale",
++ "irradiated_rose_hips",
++ "irradiated_elderberries",
++ "irradiated_mulberries",
++ "irradiated_huckleberries",
++ "irradiated_raspberries",
++ "irradiated_cranberries",
++ "irradiated_strawberries",
++ "irradiated_blueberries",
++ "irradiated_apple",
++ "irradiated_banana",
++ "irradiated_orange",
++ "irradiated_lemon",
++ "irradiated_grapefruit",
++ "irradiated_pear",
++ "irradiated_cherries",
++ "irradiated_plums",
++ "irradiated_grapes",
++ "irradiated_pineapple",
++ "irradiated_peach",
++ "irradiated_watermelon",
++ "irradiated_melon",
++ "irradiated_blackberries",
++ "irradiated_mango",
++ "irradiated_pomegranate",
++ "irradiated_papaya",
++ "irradiated_kiwi",
++ "irradiated_apricot",
++ "irradiated_lettuce",
++ "irradiated_cabbage",
++ "irradiated_tomato",
++ "irradiated_broccoli",
++ "irradiated_zucchini",
++ "irradiated_onion",
++ "irradiated_carrot",
++ "irradiated_corn",
++ "irradiated_pumpkin",
++ "irradiated_potato",
++ "irradiated_cucumber",
++ "irradiated_celery",
++ "irradiated_rhubarb",
++ "jerky",
++ "kompot",
++ "mead",
++ "meat_canned",
++ "meat_pickled",
++ "meat_salted",
++ "meat_smoked",
++ "milk_evap",
++ "milk_powder",
++ "milk_UHT",
++ "oatmeal",
++ "pale_ale",
++ "pecan_roasted",
++ "pemmican",
++ "pine_wine",
++ "pistachio_roasted",
++ "pork_beans",
++ "powder_eggs",
++ "ravioli",
++ "drink_rumcola",
+ "salt",
+- "vinegar"
++ "sausage",
++ "soup_chicken",
++ "soup_dumplings",
++ "soup_tomato",
++ "soy_nuts",
++ "stout",
++ "sugar",
++ "veggy_canned",
++ "veggy_pickled",
++ "veggy_salted",
++ "vinegar",
++ "wine_barley",
++ "yeast"
+ ],
+ "response": { "text": "Delivering <topic_item>.", "topic": "TALK_DELIVER_ASK" }
+ },
+@@ -142,7 +256,7 @@
+ {
+ "type": "talk_topic",
+ "id": "TALK_FREE_MERCHANT_STOCKS_WHY",
+- "dynamic_line": "All three are easy to locally produce in significant quantities and are non-perishable. We have a local farmer or two and a few hunter types that have been making attempts to provide us with the nutritious supplies. We do always need more suppliers though. This stuff is rather cheap in bulk, so I can pay a premium for any you have on you. Canned food and other edibles are handled by the merchant in the front in trade.",
++ "dynamic_line": "All three are easy to locally produce in significant quantities and are non-perishable. We have a local farmer or two and a few hunter types that have been making attempts to provide us with nutritious supplies. We do always need more suppliers though. This stuff is rather cheap in bulk, so I can pay a premium for any you have on you.",
+ "responses": [
+ { "text": "Are you looking to buy anything else?", "topic": "TALK_FREE_MERCHANT_STOCKS_ALL" },
+ { "text": "Very well… let's talk about something else.", "topic": "TALK_FREE_MERCHANT_STOCKS" }
+@@ -156,7 +270,7 @@
+ {
+ "type": "talk_topic",
+ "id": "TALK_FREE_MERCHANT_STOCKS_ALL",
+- "dynamic_line": "I'm actually accepting a number of different foodstuffs: beer, sugar, flour, smoked meat, smoked fish, dried fruit and vegetables, cooking oil, preservatives like salt and vinegar; and as mentioned before, jerky, cornmeal, and fruit wine."
++ "dynamic_line": "I'm actually accepting a number of different foodstuffs: Basic cooking supplies like flour, sugar, yeast, cooking oils, powdered eggs, powdered milk; Any sort of preserved meat, fish, cheese, fruit, nut, or vegetable; preservation supplies like salt and vinegar; low alcohol content liquors like fruit wine and beer; and of course, any sort of pre-cataclysm factory-sealed foods you can get your hands on."
+ },
+ {
+ "type": "talk_topic",
diff --git a/npc-11_npcs-reload-gas-mask.patch b/npc-11_npcs-reload-gas-mask.patch
new file mode 100644
index 0000000..12cb059
--- /dev/null
+++ b/npc-11_npcs-reload-gas-mask.patch
@@ -0,0 +1,124 @@
+--- a/data/json/items/tool_armor.json
++++ b/data/json/items/tool_armor.json
+@@ -1742,6 +1742,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_s": 100 } } ],
+ "ammo": "gasfilter_s",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "armor": [ { "encumbrance": 20, "rigid_layer_only": true, "coverage": 100, "covers": [ "mouth" ] } ]
+ },
+ {
+@@ -1769,7 +1770,8 @@
+ "environmental_protection_with_filter": 16,
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+- "use_action": [ "GASMASK" ]
++ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1
+ },
+ {
+ "id": "mask_gas_xl",
+@@ -1796,6 +1798,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "flags": [ "OVERSIZE", "SLEEP_IGNORE" ]
+ },
+ {
+@@ -1823,6 +1826,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "flags": [ "UNDERSIZE", "SLEEP_IGNORE" ]
+ },
+ {
+@@ -1847,6 +1851,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 60 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "armor": [ { "encumbrance": 20, "rigid_layer_only": true, "coverage": 100, "covers": [ "mouth" ] } ]
+ },
+ {
+@@ -1875,6 +1880,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "flags": [ "VARSIZE", "STURDY", "SUN_GLASSES", "SLEEP_IGNORE" ]
+ },
+ {
+@@ -1903,6 +1909,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "flags": [ "VARSIZE", "STURDY", "OVERSIZE", "SUN_GLASSES", "SLEEP_IGNORE" ]
+ },
+ {
+@@ -1934,6 +1941,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "warmth": 25,
+ "environmental_protection": 4,
+ "environmental_protection_with_filter": 16,
+@@ -1958,6 +1966,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "material": [ "kevlar_layered", "steel" ],
+ "symbol": "[",
+ "color": "dark_gray",
+@@ -1985,6 +1994,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "material": [ "kevlar_layered", "cotton" ],
+ "symbol": "[",
+ "color": "dark_gray",
+@@ -2012,6 +2022,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "material": [ "kevlar_layered", "cotton" ],
+ "symbol": "[",
+ "color": "dark_gray",
+@@ -2039,6 +2050,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "material": [ "kevlar_layered", "leather" ],
+ "symbol": "[",
+ "color": "dark_gray",
+@@ -2066,6 +2078,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "material": [ "kevlar_layered", "plastic" ],
+ "symbol": "[",
+ "color": "dark_gray",
+@@ -2137,6 +2150,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "material": [ "kevlar_layered", "fur" ],
+ "symbol": "[",
+ "color": "light_gray",
+@@ -2164,6 +2178,7 @@
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "gasfilter_m": 100 } } ],
+ "ammo": "gasfilter_m",
+ "use_action": [ "GASMASK" ],
++ "charges_per_use": 1,
+ "material": [ "kevlar_layered", "fur" ],
+ "symbol": "[",
+ "color": "light_gray",
diff --git a/npc-20_dialogue-fixes.patch b/npc-20_dialogue-fixes.patch
new file mode 100644
index 0000000..43468f2
--- /dev/null
+++ b/npc-20_dialogue-fixes.patch
@@ -0,0 +1,11 @@
+--- a/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json
++++ b/data/json/npcs/isherwood_farm/NPC_Lisa_Isherwood.json
+@@ -83,7 +83,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_4570-dragon-can-be-dismantled.patch
index cae2714..bee85e8 100644
--- a/recipes-01_dragon-can-be-dismantled.patch
+++ b/recipes-01_4570-dragon-can-be-dismantled.patch
@@ -1,10 +1,10 @@
--- a/data/json/recipes/ammo/shot.json
+++ b/data/json/recipes/ammo/shot.json
-@@ -69,6 +69,7 @@
+@@ -72,6 +72,7 @@
"batch_time_factors": [ 60, 5 ],
"book_learn": [ [ "recipe_bullets", 3 ], [ "manual_shotgun", 3 ] ],
"charges": 1,
+ "reversible": true,
"using": [ [ "ammo_shot", 1 ] ],
+ "proficiencies": [ { "proficiency": "prof_handloading" } ],
"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/src-01_radio-can-use-ups.patch b/src-01_radio-can-use-ups.patch
new file mode 100644
index 0000000..a47b1d4
--- /dev/null
+++ b/src-01_radio-can-use-ups.patch
@@ -0,0 +1,55 @@
+--- a/src/iuse.cpp
++++ b/src/iuse.cpp
+@@ -350,6 +350,7 @@
+ static const std::string flag_HEATS_FOOD( "HEATS_FOOD" );
+ static const std::string flag_PLANT( "PLANT" );
+ static const std::string flag_PLOWABLE( "PLOWABLE" );
++static const std::string flag_USE_UPS( "USE_UPS" );
+
+ // how many characters per turn of radio
+ static constexpr int RADIO_PER_TURN = 25;
+@@ -2205,7 +2206,8 @@
+ }
+ } else { // Activated
+ int ch = 1;
+- if( it->ammo_remaining() > 0 ) {
++ if( it->ammo_remaining() > 0 || ( it->has_flag( flag_USE_UPS ) &&
++ p->has_enough_charges( *it, false ) ) ) {
+ ch = uilist( _( "Radio:" ), {
+ _( "Scan" ), _( "Turn off" )
+ } );
+@@ -4074,7 +4076,8 @@
+ if( t ) { // Effects while simply on
+
+ } else {
+- if( !it->units_sufficient( *p ) ) {
++ if( !it->units_sufficient( *p ) || !( it->has_flag( flag_USE_UPS ) &&
++ p->has_enough_charges( *it, false ) ) ) {
+ p->add_msg_if_player( m_info, _( "Your tactical tonfa is out of power." ) );
+ it->convert( itype_shocktonfa_off ).active = false;
+ } else {
+@@ -4099,7 +4102,8 @@
+ int iuse::mp3( player *p, item *it, bool, const tripoint & )
+ {
+ // TODO: avoid item id hardcoding to make this function usable for pure json-defined devices.
+- if( !it->units_sufficient( *p ) ) {
++ if( !it->units_sufficient( *p ) || !( it->has_flag( flag_USE_UPS ) &&
++ p->has_enough_charges( *it, false ) ) ) {
+ p->add_msg_if_player( m_info, _( "The device's batteries are dead." ) );
+ } else if( p->has_active_item( itype_mp3_on ) || p->has_active_item( itype_smartphone_music ) ||
+ p->has_active_item( itype_afs_atomic_smartphone_music ) ||
+@@ -6366,9 +6370,12 @@
+ int iuse::einktabletpc( player *p, item *it, bool t, const tripoint &pos )
+ {
+ if( t ) {
+- if( !it->get_var( "EIPC_MUSIC_ON" ).empty() && ( it->ammo_remaining() > 0 ) ) {
++ if( !it->get_var( "EIPC_MUSIC_ON" ).empty() &&
++ ( it->ammo_remaining() > 0 || ( it->has_flag( flag_USE_UPS ) &&
++ p->has_enough_charges( *it, false ) ) ) ) {
+ if( calendar::once_every( 5_minutes ) ) {
+- it->ammo_consume( 1, p->pos() );
++ //it->ammo_consume( 1, p->pos() );
++ p->consume_charges( *it, 1 );
+ }
+
+ //the more varied music, the better max mood.
diff --git a/jc_ammo-loudness-ap-times-2.patch b/src-02_ammo-loudness-ap-times-2.patch
index 3df1ffd..3def080 100644
--- a/jc_ammo-loudness-ap-times-2.patch
+++ b/src-02_ammo-loudness-ap-times-2.patch
@@ -1,6 +1,6 @@
--- a/src/item_factory.cpp
+++ b/src/item_factory.cpp
-@@ -230,7 +230,7 @@
+@@ -221,7 +221,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_allow-bio-firestarter-on-smoker.patch b/src-03_allow-bio-firestarter-on-smoker.patch
index 4c5c548..21043e6 100644
--- a/jc_allow-bio-firestarter-on-smoker.patch
+++ b/src-03_allow-bio-firestarter-on-smoker.patch
@@ -1,6 +1,6 @@
--- a/src/iexamine.cpp
+++ b/src/iexamine.cpp
-@@ -2638,7 +2638,10 @@
+@@ -2476,7 +2476,10 @@
return;
}
@@ -12,30 +12,30 @@
add_msg( _( "This kiln is ready to be fired, but you have no fire source." ) );
return;
} else {
-@@ -5396,11 +5399,23 @@
+@@ -4950,11 +4953,23 @@
return;
}
- p.use_charges( itype_fire, 1 );
-- for( item &it : here.i_at( examp ) ) {
+- for( auto &it : here.i_at( examp ) ) {
- if( it.has_flag( flag_SMOKABLE ) ) {
-- it.process_temperature_rot( 1, examp, nullptr );
+- it.process_rot( examp );
- 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( item &it : here.i_at( examp ) ) {
++ for( auto &it : g->m.i_at( examp ) ) {
+ if( it.has_flag( flag_SMOKABLE ) ) {
-+ it.process_temperature_rot( 1, examp, nullptr );
++ it.process_rot( examp );
+ it.set_flag( flag_PROCESSING );
+ }
+ }
+ } else {
+ p.use_charges( itype_fire, 1 );
-+ for( item &it : here.i_at( examp ) ) {
++ for( auto &it : g->m.i_at( examp ) ) {
+ if( it.has_flag( flag_SMOKABLE ) ) {
-+ it.process_temperature_rot( 1, examp, nullptr );
++ it.process_rot( examp );
+ it.set_flag( flag_PROCESSING );
+ }
}
diff --git a/jc_stop-non-faction-npc-sleep-depirvation.patch b/src-04_stop-non-faction-npc-sleep-depirvation.patch
index 483080c..fb8941c 100644
--- a/jc_stop-non-faction-npc-sleep-depirvation.patch
+++ b/src-04_stop-non-faction-npc-sleep-depirvation.patch
@@ -1,6 +1,6 @@
--- a/src/npcmove.cpp
+++ b/src/npcmove.cpp
-@@ -1917,6 +1917,7 @@
+@@ -1871,6 +1871,7 @@
if( !is_player_ally() ) {
// TODO: Make tired NPCs handle sleep offscreen
set_fatigue( 0 );
diff --git a/jc_stop-non-faction-npc-malnourishment.patch b/src-05_stop-non-faction-npc-malnourishment.patch
index 509b2f1..0e58ff6 100644
--- a/jc_stop-non-faction-npc-malnourishment.patch
+++ b/src-05_stop-non-faction-npc-malnourishment.patch
@@ -1,8 +1,8 @@
--- 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" );
+@@ -137,6 +137,14 @@
+ static const trait_id trait_IGNORE_SOUND( "IGNORE_SOUND" );
+ static const trait_id trait_RETURN_TO_START_POS( "RETURN_TO_START_POS" );
+const vitamin_id vitamin_calcium( "calcium" );
+const vitamin_id vitamin_iron( "iron" );
@@ -12,21 +12,13 @@
+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() ) {
+ static const zone_type_id zone_type_NO_NPC_PICKUP( "NO_NPC_PICKUP" );
+ static const zone_type_id zone_type_NPC_RETREAT( "NPC_RETREAT" );
+
+@@ -3837,6 +3845,13 @@
// TODO: Remove this and let player "exploit" hungry NPCs
set_hunger( 0 );
+ set_thirst( 0 );
+ vitamin_set( vitamin_calcium, 0 );
+ vitamin_set( vitamin_iron, 0 );
+ vitamin_set( vitamin_vitA, 0 );
@@ -34,6 +26,6 @@
+ vitamin_set( vitamin_vitC, 0 );
+ vitamin_set( vitamin_mutant_toxin, 0 );
+ vitamin_set( vitamin_bad_food, 0 );
- set_thirst( 0 );
}
} else {
+ for( item * const &food_item : inv_food ) {
diff --git a/src-06_stop-sleeping-on-tables.patch b/src-06_stop-sleeping-on-tables.patch
new file mode 100644
index 0000000..5385655
--- /dev/null
+++ b/src-06_stop-sleeping-on-tables.patch
@@ -0,0 +1,22 @@
+--- a/src/character.cpp
++++ b/src/character.cpp
+@@ -5101,14 +5101,18 @@
+ }
+ }
+ // Not in a vehicle, start checking furniture/terrain/traps at this point in decreasing order
+- else if( furn_at_pos != f_null ) {
++ else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 5 ) {
+ comfort += 0 + furn_at_pos.obj().comfort;
+ }
+ // Web sleepers can use their webs if better furniture isn't available
+ else if( websleep && web >= 3 ) {
+ comfort += 1 + static_cast<int>( comfort_level::slightly_comfortable );
++ } else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 4 ) {
++ comfort += 0 + furn_at_pos.obj().comfort;
+ } else if( !trap_at_pos.is_null() ) {
+ comfort += 0 + trap_at_pos.comfort;
++ } else if( furn_at_pos != f_null && furn_at_pos.obj().comfort >= 1 ) {
++ comfort += 0 + furn_at_pos.obj().comfort;
+ } else {
+ // Not a comfortable sleeping spot
+ comfort -= here.move_cost( p );
diff --git a/jc_allow-hacker-laptop.patch b/src-07_allow-hacker-laptop.patch
index 75bcc07..e609004 100644
--- a/jc_allow-hacker-laptop.patch
+++ b/src-07_allow-hacker-laptop.patch
@@ -1,24 +1,24 @@
--- a/src/game.cpp
+++ b/src/game.cpp
-@@ -239,6 +239,7 @@
+@@ -250,6 +250,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 @@
+ static const itype_id itype_manhole_cover( "manhole_cover" );
+ static const itype_id itype_remotevehcontrol( "remotevehcontrol" );
+ static const itype_id itype_rope_30( "rope_30" );
+@@ -2474,7 +2475,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 ) ) ) {
++ + ( !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 @@
+@@ -2494,7 +2496,7 @@
remoteveh_cache_time = calendar::turn;
remoteveh_cache = veh;
if( veh != nullptr && !u.has_active_bionic( bio_remote ) &&
diff --git a/jc_npc-eat-from-further-camp.patch b/src-09_npc-eat-from-further-camp.patch
index d711156..b1c5e13 100644
--- a/jc_npc-eat-from-further-camp.patch
+++ b/src-09_npc-eat-from-further-camp.patch
@@ -1,6 +1,6 @@
--- a/src/npcmove.cpp
+++ b/src/npcmove.cpp
-@@ -3797,7 +3797,7 @@
+@@ -3758,7 +3758,7 @@
Character &player_character = get_player_character();
cata::optional<basecamp *> potential_bc;
for( const tripoint_abs_omt &camp_pos : player_character.camps ) {
diff --git a/src-11_remove-legacy-recruiting-penalty.patch b/src-11_remove-legacy-recruiting-penalty.patch
new file mode 100644
index 0000000..56c5958
--- /dev/null
+++ b/src-11_remove-legacy-recruiting-penalty.patch
@@ -0,0 +1,11 @@
+--- a/src/faction_camp.cpp
++++ b/src/faction_camp.cpp
+@@ -4835,6 +4835,8 @@
+ return 0;
+ }
+ sbase = e->second.cur_level * 5;
++ //sbase = e->second.cur_level * 5;
++ sbase = 0;
+ sexpansions = expansions.size() * 2;
+
+ //How could we ever starve?
diff --git a/src-12_fix-food-supply-calculations.patch b/src-12_fix-food-supply-calculations.patch
new file mode 100644
index 0000000..15ee206
--- /dev/null
+++ b/src-12_fix-food-supply-calculations.patch
@@ -0,0 +1,20 @@
+--- a/src/faction.cpp
++++ b/src/faction.cpp
+@@ -323,7 +323,7 @@
+ std::string faction::food_supply_text()
+ {
+ //Convert to how many days you can support the population
+- int val = food_supply / ( size * 288 );
++ int val = food_supply / ( size * 2500 );
+ if( val >= 30 ) {
+ return pgettext( "Faction food", "Overflowing" );
+ }
+@@ -341,7 +341,7 @@
+
+ nc_color faction::food_supply_color()
+ {
+- int val = food_supply / ( size * 288 );
++ int val = food_supply / ( size * 2500 );
+ if( val >= 30 ) {
+ return c_green;
+ } else if( val >= 14 ) {
diff --git a/terrain-01_tacoma-clinic-add-missing-floor.patch b/terrain-01_tacoma-clinic-add-missing-floor.patch
deleted file mode 100644
index 9accf88..0000000
--- a/terrain-01_tacoma-clinic-add-missing-floor.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json
-+++ b/data/json/npcs/tacoma_ranch/mission_mapgen_tacoma_commune.json
-@@ -543,7 +543,7 @@
- "[......wwwwwww.....[",
- "w......w.....w.....w",
- "w..............tt..w",
-- "[..... w.....w.....[",
-+ "[......w.....w.....[",
- "w......wwwwwww.....w",
- "www++www wwwwwww",
- " ",
diff --git a/terrain-02_make-firestation-shelter-wells-npc-drinkable.patch b/terrain-02_make-firestation-shelter-wells-npc-drinkable.patch
deleted file mode 100644
index d2a2b33..0000000
--- a/terrain-02_make-firestation-shelter-wells-npc-drinkable.patch
+++ /dev/null
@@ -1,71 +0,0 @@
---- 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" } ],
-- "blueprint_provides": [ { "id": "fbmc_firestation1_well" }, { "id": "relaying" }, { "id": "scouting" }, { "id": "patrolling" } ],
-+ "blueprint_provides": [
-+ { "id": "fbmc_firestation1_well" },
-+ { "id": "water_well" },
-+ { "id": "relaying" },
-+ { "id": "scouting" },
-+ { "id": "patrolling" }
-+ ],
- "blueprint_excludes": [ { "id": "fbmc_firestation1_well" } ],
- "blueprint_needs": {
- "time": "11 h",
-
---- a/data/json/recipes/basecamps/recipe_modular_shelter/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
-@@ -141,7 +141,13 @@
- "construction_blueprint": "fbmc_shelter_1_well",
- "blueprint_name": "build a well",
- "blueprint_requires": [ { "id": "fbmc_shelter_1_fire" } ],
-- "blueprint_provides": [ { "id": "fbmc_shelter_1_well" }, { "id": "relaying" }, { "id": "scouting" }, { "id": "patrolling" } ],
-+ "blueprint_provides": [
-+ { "id": "fbmc_shelter_1_well" },
-+ { "id": "water_well" },
-+ { "id": "relaying" },
-+ { "id": "scouting" },
-+ { "id": "patrolling" }
-+ ],
- "blueprint_excludes": [ { "id": "fbmc_shelter_1_well" } ],
- "blueprint_needs": {
- "time": "11 h",
-
---- a/data/json/recipes/basecamps/recipe_modular_shelter_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_2_well",
- "blueprint_name": "build a well",
- "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_2_well" },
-+ { "id": "water_well" },
-+ { "id": "relaying" },
-+ { "id": "scouting" },
-+ { "id": "patrolling" }
-+ ],
- "blueprint_excludes": [ { "id": "fbmc_shelter_2_well" } ],
- "blueprint_needs": {
- "time": "11 h",
diff --git a/terrain-04_lumbermill-gasoline-not-spilled.patch b/terrain-04_lumbermill-gasoline-not-spilled.patch
new file mode 100644
index 0000000..05e63ac
--- /dev/null
+++ b/terrain-04_lumbermill-gasoline-not-spilled.patch
@@ -0,0 +1,11 @@
+--- 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/terrain-08_more-military-base-overmap.patch b/terrain-08_more-military-base-overmap.patch
new file mode 100644
index 0000000..f2bc3cb
--- /dev/null
+++ b/terrain-08_more-military-base-overmap.patch
@@ -0,0 +1,257 @@
+--- 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",
diff --git a/terrain-11_clean-up-map-extras.patch b/terrain-11_clean-up-map-extras.patch
new file mode 100644
index 0000000..a299893
--- /dev/null
+++ b/terrain-11_clean-up-map-extras.patch
@@ -0,0 +1,113 @@
+--- a/data/json/overmap/map_extras.json
++++ b/data/json/overmap/map_extras.json
+@@ -145,8 +145,8 @@
+ {
+ "id": "mx_portal",
+ "type": "map_extra",
+- "name": { "str": "Portal" },
+- "description": "Portal is here.",
++ "name": { "str": "Shimmering Portal" },
++ "description": "Shimmering Portal is here.",
+ "generator": { "generator_method": "update_mapgen", "generator_id": "mx_portal" },
+ "min_max_zlevel": [ -5, 5 ],
+ "sym": "P",
+@@ -156,7 +156,7 @@
+ {
+ "id": "mx_portal_in",
+ "type": "map_extra",
+- "name": { "str": "Portal In" },
++ "name": { "str": "Tear in Reality" },
+ "description": "Another portal is here.",
+ "generator": { "generator_method": "map_extra_function", "generator_id": "mx_portal_in" },
+ "min_max_zlevel": [ -5, 5 ],
+@@ -238,7 +238,7 @@
+ "id": "mx_spider",
+ "type": "map_extra",
+ "name": { "str": "Spiders" },
+- "description": "This area is covered with webs. Probably spiders are nearby",
++ "description": "This area is covered with webs. Probably spiders are nearby.",
+ "generator": { "generator_method": "update_mapgen", "generator_id": "mx_spider" },
+ "min_max_zlevel": [ -2, 0 ],
+ "sym": "S",
+@@ -352,10 +352,13 @@
+ {
+ "id": "mx_trees",
+ "type": "map_extra",
+- "name": { "str": "Stand of trees" },
++ "name": { "str": "Copse of trees" },
+ "description": "A copse of trees.",
+ "generator": { "generator_method": "update_mapgen", "generator_id": "mx_trees_map" },
+- "min_max_zlevel": [ 0, 0 ]
++ "min_max_zlevel": [ 0, 0 ],
++ "sym": "t",
++ "color": "light_green",
++ "autonote": true
+ },
+ {
+ "id": "mx_trees2",
+@@ -384,7 +387,10 @@
+ "name": { "str": "Tall grass" },
+ "description": "A meadow of tall grass.",
+ "generator": { "generator_method": "update_mapgen", "generator_id": "mx_grass_map" },
+- "min_max_zlevel": [ 0, 0 ]
++ "min_max_zlevel": [ 0, 0 ],
++ "sym": "g",
++ "color": "light_green",
++ "autonote": true
+ },
+ {
+ "id": "mx_grass2",
+@@ -501,7 +507,10 @@
+ "description": "Some looters gathering everything not nailed down.",
+ "generator": { "generator_method": "map_extra_function", "generator_id": "mx_looters" },
+ "min_max_zlevel": [ -2, 0 ],
+- "flags": [ "MAN_MADE" ]
++ "flags": [ "MAN_MADE" ],
++ "sym": "L",
++ "color": "red",
++ "autonote": true
+ },
+ {
+ "id": "mx_corpses",
+@@ -510,7 +519,10 @@
+ "description": "Some unfortunates from the billions lost in the Cataclysm.",
+ "generator": { "generator_method": "map_extra_function", "generator_id": "mx_corpses" },
+ "min_max_zlevel": [ -5, 0 ],
+- "flags": [ "MAN_MADE" ]
++ "flags": [ "MAN_MADE" ],
++ "sym": "c",
++ "color": "light_red",
++ "autonote": true
+ },
+ {
+ "id": "mx_nest_wasp",
+@@ -541,7 +553,10 @@
+ "description": "A prison bus.",
+ "generator": { "generator_method": "update_mapgen", "generator_id": "mx_prison_bus" },
+ "min_max_zlevel": [ 0, 0 ],
+- "flags": [ "MAN_MADE" ]
++ "flags": [ "MAN_MADE" ],
++ "sym": "P",
++ "color": "blue",
++ "autonote": true
+ },
+ {
+ "id": "mx_mass_grave",
+@@ -558,11 +573,14 @@
+ {
+ "id": "mx_grave",
+ "type": "map_extra",
+- "name": { "str": "Grave" },
+- "description": "A grave.",
++ "name": { "str": "Solitary Grave" },
++ "description": "A solitary grave.",
+ "generator": { "generator_method": "update_mapgen", "generator_id": "mx_grave" },
+ "min_max_zlevel": [ 0, 0 ],
+- "flags": [ "MAN_MADE" ]
++ "flags": [ "MAN_MADE" ],
++ "sym": "c",
++ "color": "white",
++ "autonote": true
+ },
+ {
+ "id": "mx_city_trap",
diff --git a/tools-01_foldable-bottle-is-container.patch b/tools-01_foldable-bottle-is-container.patch
deleted file mode 100644
index b60fabc..0000000
--- a/tools-01_foldable-bottle-is-container.patch
+++ /dev/null
@@ -1,20 +0,0 @@
---- a/data/json/items/tool/container.json
-+++ b/data/json/items/tool/container.json
-@@ -2,7 +2,7 @@
- {
- "id": "bottle_metal",
- "type": "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/tools-02_normalize-drone-volume.patch b/tools-02_normalize-drone-volume.patch
deleted file mode 100644
index 52a4157..0000000
--- a/tools-02_normalize-drone-volume.patch
+++ /dev/null
@@ -1,56 +0,0 @@
---- a/data/json/items/corpses/inactive_bots.json
-+++ b/data/json/items/corpses/inactive_bots.json
-@@ -5,7 +5,7 @@
- "name": { "str": "inactive EMP hack" },
- "description": "This is an inactive EMP hack. EMP hacks are fist-sized robots that fly through the air. This one contains an EMP grenade and attacks by flying at its target and detonating. Use this item to reprogram and release the EMP hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
- "weight": "4700 g",
-- "volume": "750 ml",
-+ "volume": "250 ml",
- "price": 64500,
- "price_postapoc": 3000,
- "to_hit": -3,
-@@ -31,7 +31,7 @@
- "name": { "str": "inactive C-4 hack" },
- "description": "This is an inactive C-4 hack. C-4 hacks are fist-sized robots that fly through the air. This one contains some C-4 and attacks by flying at its target and detonating. Use this item to reprogram and activate the C-4 hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
- "weight": "5870 g",
-- "volume": "250 ml",
-+ "volume": "1000 ml",
- "price": 67500,
- "price_postapoc": 3000,
- "to_hit": -3,
-@@ -57,7 +57,7 @@
- "name": { "str": "inactive flashbang hack" },
- "description": "This is an inactive flashbang hack. Flashbang hacks are fist-sized robots that fly through the air. This one contains a flashbang and attacks by flying at its target and detonating. Use this item to reprogram and activate the flashbang hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
- "weight": "4536 g",
-- "volume": "750 ml",
-+ "volume": "250 ml",
- "price": 59500,
- "price_postapoc": 500,
- "to_hit": -3,
-@@ -83,7 +83,7 @@
- "name": { "str": "inactive tear gas hack" },
- "description": "This is an inactive tear gas hack. Tear gas hacks are fist-sized robots that fly through the air. This one contains a tear gas canister and attacks by flying at its target and releasing tear gas. Use this item to reprogram and activate the tear gas hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
- "weight": "5360 g",
-- "volume": "750 ml",
-+ "volume": "250 ml",
- "price": 60500,
- "price_postapoc": 500,
- "to_hit": -3,
-@@ -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,
-@@ -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": "16 L",
- "price": 2677500,
- "price_postapoc": 10000,
- "to_hit": -3,
diff --git a/tools-04_normalize-drone-volume.patch b/tools-04_normalize-drone-volume.patch
new file mode 100644
index 0000000..ef8d200
--- /dev/null
+++ b/tools-04_normalize-drone-volume.patch
@@ -0,0 +1,56 @@
+--- a/data/json/items/corpses/inactive_bots.json
++++ b/data/json/items/corpses/inactive_bots.json
+@@ -5,7 +5,7 @@
+ "name": { "str": "inactive EMP hack" },
+ "description": "An inactive EMP hack. Manhacks are fist-sized robots that fly through the air. This one contains an EMP grenade and attacks by flying at its target and detonating. Use this item to reprogram and release the EMP hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
+ "weight": "4700 g",
+- "volume": "750 ml",
++ "volume": "250 ml",
+ "price": 64500,
+ "price_postapoc": 3000,
+ "to_hit": -3,
+@@ -32,7 +32,7 @@
+ "name": { "str": "inactive C-4 hack" },
+ "description": "An inactive C-4 hack. Manhacks are fist-sized robots that fly through the air. This one contains a C-4 demolition charge and attacks by flying at its target and detonating. Use this item to reprogram and activate the C-4 hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
+ "weight": "5870 g",
+- "volume": "250 ml",
++ "volume": "1 L",
+ "price": 67500,
+ "price_postapoc": 3000,
+ "to_hit": -3,
+@@ -59,7 +59,7 @@
+ "name": { "str": "inactive flashbang hack" },
+ "description": "An inactive flashbang hack. Manhacks are fist-sized robots that fly through the air. This one contains a flashbang and attacks by flying at its target and detonating. Use this item to reprogram and activate the flashbang hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
+ "weight": "4536 g",
+- "volume": "750 ml",
++ "volume": "250 ml",
+ "price": 59500,
+ "price_postapoc": 500,
+ "to_hit": -3,
+@@ -86,7 +86,7 @@
+ "name": { "str": "inactive tear gas hack" },
+ "description": "An inactive tear gas hack. Manhacks 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 the gas. Use this item to reprogram and activate the tear gas hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.",
+ "weight": "5360 g",
+- "volume": "750 ml",
++ "volume": "250 ml",
+ "price": 60500,
+ "price_postapoc": 500,
+ "to_hit": -3,
+@@ -163,7 +163,7 @@
+ "name": { "str": "inactive manhack" },
+ "description": "An inactive manhack, a fist-sized robot that flies through the air. This one is covered with whirring blades and attacks by throwing itself against its 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,
+@@ -190,7 +190,7 @@
+ "name": { "str": "inactive mininuke hack" },
+ "description": "An inactive mininuke hack. Many times as large as a normal manhack, a mininuke hack contains a mininuke and attacks by flying at its 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": "16 L",
+ "price": 2677500,
+ "price_postapoc": 10000,
+ "to_hit": -3,
diff --git a/vampirism.patch b/vampirism.patch
index 319e1fd..4e1ce30 100644
--- a/vampirism.patch
+++ b/vampirism.patch
@@ -1,47 +1,54 @@
--- 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" );
+@@ -190,6 +190,7 @@
+ static const itype_id itype_burnt_out_bionic( "burnt_out_bionic" );
+ static const itype_id itype_muscle( "muscle" );
+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 @@
+@@ -506,7 +507,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( is_human && !( you.has_flag( json_flag_CANNIBAL ) ||
+ you.has_flag( json_flag_PSYCHOPATH ) ||
+- you.has_flag( json_flag_SAPIOVORE ) ) ) {
++ you.has_flag( json_flag_SAPIOVORE ) ||
++ you.has_flag( json_flag_VAMPIRE ) ) ) {
- if( u.is_player() ) {
+ if( you.is_avatar() ) {
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 @@
+@@ -441,6 +441,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_PACIFIST( "PACIFIST" );
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_PAINRESIST( "PAINRESIST" );
+@@ -477,6 +480,8 @@
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 @@
+ static const trait_id trait_WEB_SPINNER( "WEB_SPINNER" );
+@@ -500,6 +505,7 @@
+ case blood_type::blood_A: return "A";
+ case blood_type::blood_B: return "B";
+ case blood_type::blood_AB: return "AB";
++ case blood_type::blood_V: return "V";
+ // *INDENT-ON*
+ case blood_type::num_bt:
+ break;
+@@ -2270,6 +2276,9 @@
if( has_trait( trait_DEBUG_NIGHTVISION ) ) {
vision_mode_cache.set( DEBUG_NIGHTVISION );
}
@@ -51,10 +58,10 @@
if( has_nv() ) {
vision_mode_cache.set( NV_GOGGLES );
}
-@@ -2168,8 +2172,10 @@
- }
+@@ -2337,8 +2346,10 @@
+ ( LIGHT_AMBIENT_LIT - LIGHT_AMBIENT_MINIMAL ) );
- float range = get_per() / 3.0f - eyes_encumb / 10.0f;
+ float range = get_per() / 3.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] ) {
@@ -64,7 +71,7 @@
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 @@
+@@ -4274,7 +4285,15 @@
{
int pain_ticks = rate_multiplier;
while( get_pain() > 0 && pain_ticks-- > 0 ) {
@@ -81,29 +88,12 @@
}
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 @@
+@@ -4732,19 +4751,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 ) ) ) {
++ 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!" ) );
@@ -120,10 +110,10 @@
+ } else if( ( has_effect( effect_jetinjector ) &&
+ get_effect_dur( effect_jetinjector ) > 40_minutes ) &&
+ !( has_trait( trait_VAMP_SKIN ) ) ) {
- if( !( has_trait( trait_NOPAIN ) ) ) {
+ if( !has_trait( trait_NOPAIN ) ) {
add_msg_player_or_npc( m_bad,
_( "Your heart spasms painfully and stops." ),
-@@ -6176,13 +6192,14 @@
+@@ -4755,13 +4776,14 @@
}
get_event_bus().send<event_type::dies_from_drug_overdose>( getID(), effect_jetinjector );
set_part_hp_cur( body_part_torso, 0 );
@@ -140,7 +130,27 @@
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 @@
+@@ -8844,7 +8866,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;
+ }
+
+
+--- a/src/character_body.cpp
++++ b/src/character_body.cpp
+@@ -76,6 +76,7 @@
+ static const trait_id trait_PYROMANIA( "PYROMANIA" );
+ static const trait_id trait_SLIMY( "SLIMY" );
+ static const trait_id trait_URSINE_FUR( "URSINE_FUR" );
++static const trait_id trait_VAMP_SKIN( "VAMP_SKIN" );
+
+ static const vitamin_id vitamin_blood( "blood" );
+
+@@ -402,7 +403,7 @@
void Character::update_bodytemp()
{
@@ -149,19 +159,10 @@
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 @@
+@@ -120,6 +120,7 @@
/// @note vision modes do not necessarily match json ids or flags
enum vision_modes {
DEBUG_NIGHTVISION,
@@ -169,11 +170,19 @@
NV_GOGGLES,
NIGHTVISION_1,
NIGHTVISION_2,
-@@ -256,6 +256,8 @@
+@@ -241,6 +242,7 @@
+ blood_A,
+ blood_B,
+ blood_AB,
++ blood_V,
+ num_bt
+ };
+
+@@ -265,6 +267,8 @@
ALLERGY_WEAK,
/// Penalty for eating human flesh (unless psycho/cannibal)
CANNIBALISM,
-+ // Vampirism (unless psycho/cannibal)
++ /// Penalty for drinking human blood (unless vampire)
+ VAMPIRISM,
/// Comestible has parasites
PARASITES,
@@ -181,7 +190,25 @@
--- a/src/consumption.cpp
+++ b/src/consumption.cpp
-@@ -132,6 +132,7 @@
+@@ -77,11 +77,17 @@
+ static const efftype_id effect_took_thorazine( "took_thorazine" );
+ static const efftype_id effect_visuals( "visuals" );
+
++static const flag_id json_flag_ALLERGEN_ALCOHOL( "ALLERGEN_ALCOHOL" );
+ static const flag_id json_flag_ALLERGEN_EGG( "ALLERGEN_EGG" );
++static const flag_id json_flag_ALLERGEN_FOODSTUFF( "ALLERGEN_FOODSTUFF" );
+ static const flag_id json_flag_ALLERGEN_FRUIT( "ALLERGEN_FRUIT" );
++static const flag_id json_flag_ALLERGEN_HONEY( "ALLERGEN_HONEY" );
++static const flag_id json_flag_ALLERGEN_JUNK( "ALLERGEN_JUNK" );
+ static const flag_id json_flag_ALLERGEN_MEAT( "ALLERGEN_MEAT" );
++static const flag_id json_flag_ALLERGEN_MILK( "ALLERGEN_MILK" );
+ static const flag_id json_flag_ALLERGEN_NUT( "ALLERGEN_NUT" );
+ static const flag_id json_flag_ALLERGEN_VEGGY( "ALLERGEN_VEGGY" );
++static const flag_id json_flag_ALLERGEN_WATER( "ALLERGEN_WATER" );
+ static const flag_id json_flag_ALLERGEN_WHEAT( "ALLERGEN_WHEAT" );
+
+ static const item_category_id item_category_chems( "chems" );
+@@ -144,6 +150,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" );
@@ -189,57 +216,53 @@
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" )
+@@ -154,6 +161,15 @@
+ json_flag_ALLERGEN_WHEAT, json_flag_ALLERGEN_NUT
}};
-+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" )
++static const std::array<flag_id, 12> vamp_blacklist {{
++ json_flag_ALLERGEN_VEGGY, json_flag_ALLERGEN_FRUIT,
++ json_flag_ALLERGEN_WHEAT, json_flag_ALLERGEN_NUT,
++ json_flag_ALLERGEN_MEAT, json_flag_ALLERGEN_EGG,
++ json_flag_ALLERGEN_JUNK, json_flag_ALLERGEN_MILK,
++ json_flag_ALLERGEN_HONEY, json_flag_ALLERGEN_FOODSTUFF,
++ json_flag_ALLERGEN_ALCOHOL, json_flag_ALLERGEN_WATER
+ }};
+
- // 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!" ) );
+ static const std::array<flag_id, 2> herbivore_blacklist {{
+ json_flag_ALLERGEN_MEAT, json_flag_ALLERGEN_EGG
+ }};
+@@ -805,6 +821,12 @@
+ _( "Eww. Inedible plant stuff!" ) );
}
-+ if( has_trait_flag( STATIC( json_character_flag( "VAMPIRE" ) ) ) &&
-+ food.has_any_flag( vamp_blacklist ) &&
++ if( has_trait( trait_VAMP_HUNGER ) && food.has_any_flag( vamp_blacklist ) &&
+ !food.has_flag( flag_VAMPIRISM_OK ) ) {
+ return ret_val<edible_rating>::make_failure( 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 @@
+ if( ( has_trait( trait_HERBIVORE ) || has_trait( trait_RUMINANT ) ) &&
+ food.has_any_flag( herbivore_blacklist ) ) {
+ // Like non-cannibal, but more strict!
+@@ -851,8 +873,15 @@
}
}
+ 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" ) ) ) ) {
++ if( food_is_human_blood && !has_flag( STATIC( json_character_flag( "VAMPIRE" ) ) ) &&
++ !has_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 ) ||
+- const bool food_is_human_flesh = food.has_flag( flag_CANNIBALISM ) ||
++ const bool food_is_human_flesh = ( food.has_flag( flag_CANNIBALISM ) &&
++ !food.has_flag( flag_VAMPIRISM ) ) ||
( 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 @@
+ !has_flag( json_flag_STRICT_HUMANITARIAN ) );
+ if( food_is_human_flesh && !has_flag( STATIC( json_character_flag( "CANNIBAL" ) ) ) ) {
+@@ -1216,10 +1245,58 @@
}
}
@@ -253,6 +276,7 @@
+ const bool psycho = has_trait( trait_PSYCHOPATH );
+ const bool sapiovore = has_trait( trait_SAPIOVORE );
+ const bool spiritual = has_trait( trait_SPIRITUAL );
++ const bool numb = has_trait( trait_NUMB );
+ if( vamp ) {
+ add_msg_if_player( m_good, _( "You relish drinking the human blood." ) );
+ add_morale( MORALE_CANNIBAL, 30, 200 );
@@ -276,30 +300,33 @@
+ // 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." ) );
++ add_msg_if_player( _( "Meh. You've drank 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 if( numb ) {
++ add_msg_if_player( m_bad, _( "You find this drink distasteful, but necessary." ) );
++ 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_msg_if_player( m_bad, _( "You feel horrible for drinking of 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 ) );
+ !has_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?" ) );
+@@ -1303,6 +1380,11 @@
+ add_msg_if_player( m_bad, _( "Your stomach begins gurgling and you feel bloated and ill." ) );
add_morale( allergy, -75, -400, 30_minutes, 24_minutes );
}
-+ if( allergy != MORALE_NULL && has_trait_flag( STATIC( json_character_flag( "VAMPIRE" ) ) ) ) {
++ if( allergy != MORALE_NULL && has_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();
@@ -308,9 +335,35 @@
if( has_trait( trait_PROJUNK ) ) {
add_msg_if_player( m_good, _( "Mmm, junk food." ) );
+--- a/src/debug_menu.cpp
++++ b/src/debug_menu.cpp
+@@ -1728,6 +1728,7 @@
+ btype.addentry( static_cast<int>( blood_type::blood_A ), true, '2', "A" );
+ btype.addentry( static_cast<int>( blood_type::blood_B ), true, '3', "B" );
+ btype.addentry( static_cast<int>( blood_type::blood_AB ), true, '4', "AB" );
++ btype.addentry( static_cast<int>( blood_type::blood_AB ), true, '4', "V" );
+ btype.query();
+ if( btype.ret < 0 ) {
+ break;
+
+--- a/src/do_turn.cpp
++++ b/src/do_turn.cpp
+@@ -95,8 +95,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_CANNIBAL ) || u.has_trait( trait_PSYCHOPATH ) ) ) {
++ u.has_amount( itype_holybook_bible3, 1 ) || u.has_trait( trait_id( "THRESH_REAL_VAMP" ) ) ) {
++ if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) ||
++ u.has_trait( trait_id( "THRESH_REAL_VAMP" ) ) ) ) {
+ vRip.emplace_back( " _______ ___" );
+ vRip.emplace_back( " < `/ |" );
+ vRip.emplace_back( " > _ _ (" );
+
--- a/src/flag.cpp
+++ b/src/flag.cpp
-@@ -13,8 +13,11 @@
+@@ -15,13 +15,17 @@
const flag_id flag_ACT_IN_FIRE( "ACT_IN_FIRE" );
const flag_id flag_ACT_ON_RANGED_HIT( "ACT_ON_RANGED_HIT" );
const flag_id flag_ALARMCLOCK( "ALARMCLOCK" );
@@ -322,10 +375,17 @@
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_ALLERGEN_NUT( "ALLERGEN_NUT" );
+ const flag_id flag_ALLERGEN_VEGGY( "ALLERGEN_VEGGY" );
++const flag_id flag_ALLERGEN_WATER( "ALLERGEN_WATER" );
+ const flag_id flag_ALLERGEN_WHEAT( "ALLERGEN_WHEAT" );
+ const flag_id flag_ALLERGEN_WOOL( "ALLERGEN_WOOL" );
+ const flag_id flag_ALLOWS_NATURAL_ATTACKS( "ALLOWS_NATURAL_ATTACKS" );
+@@ -337,6 +341,9 @@
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_VAMPIRE( "VAMPIRE" );
+const flag_id flag_VAMPIRISM( "VAMPIRISM" );
+const flag_id flag_VAMPIRISM_OK( "VAMPIRISM_OK" );
const flag_id flag_VARSIZE( "VARSIZE" );
@@ -334,84 +394,71 @@
--- a/src/flag.h
+++ b/src/flag.h
-@@ -20,8 +20,11 @@
+@@ -24,13 +24,17 @@
extern const flag_id flag_ACT_IN_FIRE;
extern const flag_id flag_ACT_ON_RANGED_HIT;
extern const flag_id flag_ALARMCLOCK;
+extern const flag_id flag_ALLERGEN_ALCOHOL;
extern const flag_id flag_ALLERGEN_EGG;
-+extern const flag_id flag_ALLERGEN_FOODSTUFF;
extern const flag_id flag_ALLERGEN_FRUIT;
++extern const flag_id flag_ALLERGEN_FOODSTUFF;
+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_ALLERGEN_NUT;
+ extern const flag_id flag_ALLERGEN_VEGGY;
++extern const flag_id flag_ALLERGEN_WATER;
+ extern const flag_id flag_ALLERGEN_WHEAT;
+ extern const flag_id flag_ALLERGEN_WOOL;
+ extern const flag_id flag_ALLOWS_NATURAL_ATTACKS;
+@@ -342,6 +346,9 @@
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_VAMPIRE;
+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 @@
+@@ -170,6 +170,7 @@
+ static const itype_id itype_waterproof_gunmod( "waterproof_gunmod" );
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 json_character_flag json_flag_IMMUNE_SPOIL( "IMMUNE_SPOIL" );
- static const bionic_id bio_digestion( "bio_digestion" );
-
-@@ -1967,19 +1967,35 @@
- info.emplace_back( "DESCRIPTION",
+ static const matec_id RAPID( "RAPID" );
+@@ -2477,7 +2480,24 @@
_( "* 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 ) ) {
++ if( !player_character.has_flag( json_flag_CANNIBAL ) &&
++ !player_character.has_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 ) ) {
++ _( "* This food contains <bad>human flesh</bad>." ) );
++ } else if( player_character.has_flag( json_flag_CANNIBAL ) &&
++ !player_character.has_flag( json_flag_VAMPIRE ) ) {
+ info.emplace_back( "DESCRIPTION",
+ _( "* This food contains <good>human flesh</good>." ) );
+ } else {
+ info.emplace_back( "DESCRIPTION",
-+ _( "* This food contains <bad>human flesh</bad>." ) );
++ _( "* This food contains <good>human blood</good>." ) );
+ }
+ }
-
++
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 {
+ if( !player_character.has_flag( json_flag_CANNIBAL ) ) {
info.emplace_back( "DESCRIPTION",
-- _( "* This food contains <good>human flesh</good>." ) );
-+ _( "* This food contains <bad>human flesh</bad>." ) );
+@@ -2488,7 +2508,8 @@
}
}
@@ -421,7 +468,7 @@
info.emplace_back( "DESCRIPTION",
_( "* This food is <bad>tainted</bad> and will poison you." ) );
}
-@@ -4374,6 +4390,7 @@
+@@ -5959,6 +5980,7 @@
case ALLERGY:
case ALLERGY_WEAK:
case CANNIBALISM:
@@ -432,34 +479,62 @@
--- 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 },
+@@ -85,10 +85,13 @@
+
+ static const item_group_id Item_spawn_data_EMPTY_GROUP( "EMPTY_GROUP" );
+
++static const material_id material_alcohol( "alcohol" );
+ static const material_id material_bean( "bean" );
++static const material_id material_blood( "blood" );
+ static const material_id material_egg( "egg" );
+ static const material_id material_flesh( "flesh" );
+ static const material_id material_fruit( "fruit" );
++static const material_id material_foodplace_foodstuff( "foodplace_foodstuff" );
+ static const material_id material_garlic( "garlic" );
+ static const material_id material_hflesh( "hflesh" );
+ static const material_id material_honey( "honey" );
+@@ -101,6 +104,7 @@
+ static const material_id material_oil( "oil" );
+ static const material_id material_tomato( "tomato" );
+ static const material_id material_veggy( "veggy" );
++static const material_id material_water( "water" );
+ static const material_id material_wheat( "wheat" );
+ static const material_id material_wool( "wool" );
+
+@@ -3356,10 +3360,11 @@
+ // Set for all items (not just food and clothing) to avoid edge cases
+ void Item_factory::set_allergy_flags( itype &item_template )
+ {
+- static const std::array<std::pair<material_id, flag_id>, 22> all_pairs = { {
++ static const std::array<std::pair<material_id, flag_id>, 29> all_pairs = { {
+ // First allergens:
+ // An item is an allergen even if it has trace amounts of allergenic material
+ { material_hflesh, flag_CANNIBALISM },
++ { material_hflesh, flag_VAMPIRISM },
+
+ { material_hflesh, flag_ALLERGEN_MEAT },
+ { material_iflesh, flag_ALLERGEN_MEAT },
+@@ -3374,10 +3379,16 @@
+ { material_mushroom, flag_ALLERGEN_VEGGY },
+ { material_milk, flag_ALLERGEN_MILK },
+ { material_egg, flag_ALLERGEN_EGG },
++ { material_alcohol, flag_ALLERGEN_ALCOHOL },
++ { material_foodplace_foodstuff, flag_ALLERGEN_FOODSTUFF },
++ { material_water, flag_ALLERGEN_WATER },
++ { material_honey, flag_ALLERGEN_HONEY },
+ { material_junk, flag_ALLERGEN_JUNK },
+ // Not food, but we can keep it here
+ { material_wool, flag_ALLERGEN_WOOL },
+ // Now "made of". Those flags should not be passed
++ { material_blood, flag_VAMPIRISM_OK },
++ { material_blood, flag_CARNIVORE_OK },
+ { material_flesh, flag_CARNIVORE_OK },
+ { material_hflesh, flag_CARNIVORE_OK },
+ { material_iflesh, flag_CARNIVORE_OK },
--- a/src/iteminfo_query.h
+++ b/src/iteminfo_query.h
-@@ -41,6 +41,7 @@
+@@ -44,6 +44,7 @@
FOOD_VITAMINS,
FOOD_VIT_EFFECTS,
FOOD_CANNIBALISM,
@@ -471,74 +546,74 @@
--- a/src/iuse.cpp
+++ b/src/iuse.cpp
@@ -342,6 +342,7 @@
+ static const trait_id trait_THRESH_MYCUS( "THRESH_MYCUS" );
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" );
+ static const vitamin_id vitamin_blood( "blood" );
@@ -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. "
++ p->add_msg_if_player( _( "Your %s shows a 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();
+ std::string msg;
--- a/src/map_field.cpp
+++ b/src/map_field.cpp
-@@ -92,6 +92,7 @@
- static const trait_id trait_M_SKIN3( "M_SKIN3" );
+@@ -94,6 +94,7 @@
+ static const trait_id trait_THRESH_INSECT( "THRESH_INSECT" );
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_THRESH_SPIDER( "THRESH_SPIDER" );
using namespace map_field_processing;
-
-@@ -1558,7 +1559,8 @@
+@@ -1623,7 +1624,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 );
+ you.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 ||
++ if( !( you.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 );
+ you.add_env_effect( effect_blind, bodypart_id( "eyes" ), cur.get_field_intensity() * 2,
+ 10_seconds );
}
- }
-@@ -1685,7 +1687,8 @@
+@@ -1748,7 +1750,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 ) ) {
+- if( !( you.worn_with_flag( STATIC( flag_id( "GAS_PROOF" ) ) ) &&
++ if( !( you.has_trait( trait_VAMP_SKIN ) ) &&
++ !( you.worn_with_flag( STATIC( flag_id( "GAS_PROOF" ) ) ) &&
+ you.get_env_resist( bodypart_id( "mouth" ) ) >= 15 &&
+ you.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 @@
+@@ -60,6 +60,7 @@
+
static const trait_id trait_CANNIBAL( "CANNIBAL" );
static const trait_id trait_PSYCHOPATH( "PSYCHOPATH" );
++static const trait_id trait_THRESH_REAL_VAMP( "THRESH_REAL_VAMP" );
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 @@
+@@ -560,6 +561,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 vampire = player_character.has_trait( trait_THRESH_REAL_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 @@
+@@ -583,6 +585,10 @@
add( pgettext( "memorial_male", "Killed an innocent, %s." ),
pgettext( "memorial_female", "Killed an innocent, %s." ),
name );
@@ -552,71 +627,72 @@
--- 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" );
+@@ -101,6 +101,7 @@
+ const morale_type MORALE_BOOK( "morale_book" );
+ const morale_type MORALE_BUTCHER( "morale_butcher" );
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" );
+ const morale_type MORALE_CHAT( "morale_chat" );
+ const morale_type MORALE_COLD( "morale_cold" );
+ const morale_type MORALE_COMFY( "morale_comfy" );
+@@ -138,6 +139,7 @@
+ static const morale_type morale_book( "morale_book" );
+ static const morale_type morale_butcher( "morale_butcher" );
+ static const morale_type morale_cannibal( "morale_cannibal" );
++static const morale_type morale_vampire( "morale_vampire" );
+ static const morale_type morale_chat( "morale_chat" );
+ static const morale_type morale_cold( "morale_cold" );
+ static const morale_type morale_comfy( "morale_comfy" );
--- a/src/morale_types.h
+++ b/src/morale_types.h
-@@ -62,6 +62,7 @@
+@@ -64,6 +64,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_ANTIVEGGY;
extern const morale_type MORALE_MEATARIAN;
- extern const morale_type MORALE_ANTIFRUIT;
--- a/src/mutation.cpp
+++ b/src/mutation.cpp
-@@ -67,6 +67,7 @@
+@@ -82,6 +82,7 @@
+ static const trait_id trait_SNAIL_TRAIL( "SNAIL_TRAIL" );
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_VAMP_SKIN( "VAMP_SKIN" );
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;
+
+@@ -1032,6 +1033,11 @@
+ bool allow_bad = picked_bad;
+ bool allow_neutral = true;
+
+ 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.
++
+ if( true_random_chance > 0 && one_in( true_random_chance ) ) {
+ cat = mutation_category_ANY;
+ allow_good = true; // because i'm WILD YEAH
--- a/src/npc.cpp
+++ b/src/npc.cpp
-@@ -124,6 +124,7 @@
+@@ -156,6 +156,7 @@
static const trait_id trait_SAPIOVORE( "SAPIOVORE" );
- static const trait_id trait_SCHIZOPHRENIC( "SCHIZOPHRENIC" );
+ static const trait_id trait_SQUEAMISH( "SQUEAMISH" );
static const trait_id trait_TERRIFYING( "TERRIFYING" );
-+static const trait_id trait_THRESH_VAMP( "THRESH_VAMP" );
++static const trait_id trait_THRESH_REAL_VAMP( "THRESH_REAL_VAMP" );
class monfaction;
-@@ -2600,12 +2601,15 @@
+@@ -3012,12 +3013,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 vampire = player_character.has_trait( trait_THRESH_REAL_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 ) {
@@ -631,40 +707,30 @@
--- a/src/player_hardcoded_effects.cpp
+++ b/src/player_hardcoded_effects.cpp
-@@ -115,6 +115,8 @@
- static const trait_id trait_SEESLEEP( "SEESLEEP" );
+@@ -126,6 +126,8 @@
+ static const trait_id trait_NOPAIN( "NOPAIN" );
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_THRESH_REAL_VAMP( "THRESH_REAL_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 @@
- }
+ static const vitamin_id vitamin_blood( "blood" );
+@@ -721,7 +723,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
+ if( dur > 1800_minutes && one_in( 300 * 512 ) ) {
+- if( !u.has_trait( trait_NOPAIN ) ) {
++ if( u.has_trait( trait_VAMP_SKIN ) ) {
++ return;
++ } else if( !u.has_trait( trait_NOPAIN ) ) {
+ u.add_msg_if_player( m_bad,
+ _( "Your heart spasms painfully and stops, dragging you back to reality as you die." ) );
+ } else {
--- a/src/suffer.cpp
+++ b/src/suffer.cpp
-@@ -151,6 +151,8 @@
+@@ -176,6 +176,8 @@
static const trait_id trait_TROGLO2( "TROGLO2" );
static const trait_id trait_TROGLO3( "TROGLO3" );
static const trait_id trait_UNSTABLE( "UNSTABLE" );
@@ -673,76 +739,69 @@
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 @@
+@@ -286,7 +288,7 @@
- void Character::suffer_while_underwater()
+ void suffer::while_underwater( Character &you )
{
-- 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( !you.has_flag( json_flag_GILLS ) ) {
++ if( !you.has_flag( json_flag_GILLS ) && !you.has_trait( trait_VAMP_SKIN ) ) {
+ you.oxygen--;
}
- if( oxygen < 12 && worn_with_flag( flag_REBREATHER ) ) {
-@@ -746,7 +749,8 @@
- return;
+ if( you.oxygen < 12 && you.worn_with_flag( flag_REBREATHER ) ) {
+@@ -862,12 +864,12 @@
+ you.vitamin_mod( vitamin_vitC, 1 );
}
-- 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();
+- if( you.has_trait( trait_SUNBURN ) ) {
++ if( you.has_trait( trait_SUNBURN ) || you.has_trait( trait_VAMP_CURSE ) ) {
+ suffer::from_sunburn( you, true );
}
-@@ -772,6 +776,13 @@
- mod_int_bonus( -4 );
- mod_per_bonus( -4 );
+ // Albinism and datura have the same effects and do not stack with each other or sunburn.
+- if( !you.has_trait( trait_SUNBURN ) &&
++ if( ( !you.has_trait( trait_SUNBURN ) && !you.has_trait( trait_VAMP_CURSE ) ) &&
+ ( you.has_trait( trait_ALBINO ) || you.has_effect( effect_datura ) ) ) {
+ suffer::from_sunburn( you, false );
}
-+ 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 );
+@@ -895,6 +897,13 @@
+ you.mod_int_bonus( -4 );
+ you.mod_per_bonus( -4 );
+ }
++ if( you.has_trait( trait_VAMP_CURSE ) ) {
++ you.mod_str_bonus( -4 );
++ you.mod_dex_bonus( -4 );
++ you.add_miss_reason( _( "You can't tolerate the sunlight!" ), 4 );
++ you.mod_int_bonus( -4 );
++ you.mod_per_bonus( -4 );
+ }
}
std::map<bodypart_id, float> Character::bodypart_exposure()
-@@ -803,7 +814,8 @@
-
- void Character::suffer_from_sunburn()
+@@ -948,7 +957,10 @@
+ void suffer::from_sunburn( Character &you, bool severe )
{
-- 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 ) ) {
+ // Sunburn effects and albinism/datura occur about once per minute
+- if( !one_turn_in( 1_minutes ) ) {
++ // Vampirism is ten times per minute
++ if( !one_turn_in( 1_minutes ) && !you.has_trait( trait_VAMP_CURSE ) ) {
++ return;
++ } else if( !one_turn_in( 6_seconds ) && you.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" );
- }
+@@ -2034,7 +2046,7 @@
+
+ healing_factor *= mutation_value( "mending_modifier" );
- // Sunglasses can keep the sun off the eyes.
-@@ -897,7 +915,7 @@
+- if( has_flag( json_flag_MEND_ALL ) ) {
++ if( has_flag( json_flag_MEND_ALL ) || has_trait( trait_VAMP_SKIN ) ) {
+ needs_splint = false;
}
- // 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 @@
+@@ -376,7 +376,7 @@
"has_fume": true,
"percent_spread": 90,
"dirty_transparency_cache": true,
@@ -751,7 +810,7 @@
},
{
"id": "fd_rubble",
-@@ -429,7 +429,7 @@
+@@ -467,7 +467,7 @@
"dirty_transparency_cache": true,
"percent_spread": 10,
"outdoor_age_speedup": "0 turns",
@@ -760,7 +819,7 @@
"priority": 8,
"half_life": "2 minutes",
"phase": "gas",
-@@ -515,7 +515,7 @@
+@@ -553,7 +553,7 @@
"outdoor_age_speedup": "3 minutes",
"dirty_transparency_cache": true,
"has_fume": true,
@@ -769,16 +828,25 @@
"priority": 8,
"half_life": "10 minutes",
"phase": "gas",
-@@ -544,7 +544,7 @@
- "outdoor_age_speedup": "0 turns",
+@@ -609,7 +609,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",
+@@ -638,7 +638,7 @@
+ "outdoor_age_speedup": "0 turns",
+ "dirty_transparency_cache": true,
+ "has_fume": true,
+- "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ] ] },
++ "immunity_data": { "body_part_env_resistance": [ [ "mouth", 15 ], [ "eyes", 15 ] ], "traits": [ "VAMP_SKIN" ] },
+ "priority": 8,
"half_life": "5 minutes",
"phase": "gas",
-@@ -590,7 +590,7 @@
+@@ -684,7 +684,7 @@
"wandering_field": "fd_toxic_gas",
"gas_absorption_factor": 15,
"dirty_transparency_cache": true,
@@ -787,7 +855,7 @@
"phase": "gas",
"display_items": false,
"display_field": true,
-@@ -1138,7 +1138,7 @@
+@@ -1240,7 +1240,7 @@
"outdoor_age_speedup": "5 minutes",
"dirty_transparency_cache": true,
"has_fume": true,
@@ -796,7 +864,7 @@
"priority": 8,
"half_life": "50 minutes",
"phase": "gas",
-@@ -1160,7 +1160,7 @@
+@@ -1262,7 +1262,7 @@
"outdoor_age_speedup": "1 minutes",
"dirty_transparency_cache": true,
"has_fume": true,
@@ -805,7 +873,20 @@
"priority": 8,
"half_life": "15 minutes",
"phase": "gas",
-@@ -1407,7 +1407,7 @@
+@@ -1306,7 +1306,11 @@
+ "outdoor_age_speedup": "5 turns",
+ "dirty_transparency_cache": true,
+ "has_fume": true,
+- "immunity_data": { "flags": [ "MYCUS_IMMUNE" ], "body_part_env_resistance": [ [ "mouth", 15 ], [ "sensor", 15 ] ] },
++ "immunity_data": {
++ "flags": [ "MYCUS_IMMUNE" ],
++ "body_part_env_resistance": [ [ "mouth", 15 ], [ "sensor", 15 ] ],
++ "traits": [ "VAMP_SKIN" ]
++ },
+ "priority": 8,
+ "half_life": "4 minutes",
+ "phase": "gas",
+@@ -1509,7 +1509,7 @@
"outdoor_age_speedup": "3 minutes",
"dirty_transparency_cache": true,
"has_fume": true,
@@ -814,7 +895,7 @@
"priority": 8,
"half_life": "10 minutes",
"phase": "gas"
-@@ -1427,7 +1427,7 @@
+@@ -1529,7 +1529,7 @@
"outdoor_age_speedup": "1 minutes",
"dirty_transparency_cache": true,
"has_fume": true,
@@ -823,7 +904,7 @@
"priority": 8,
"half_life": "30 minutes",
"phase": "gas",
-@@ -1449,7 +1449,7 @@
+@@ -1551,7 +1551,7 @@
"outdoor_age_speedup": "1 minutes",
"dirty_transparency_cache": true,
"has_fume": true,
@@ -835,50 +916,49 @@
--- a/data/json/flags.json
+++ b/data/json/flags.json
-@@ -1120,6 +1120,21 @@
- "context": [ "COMESTIBLE" ]
+@@ -1120,6 +1120,22 @@
+ "type": "json_flag"
},
{
+ "id": "ALLERGEN_HONEY",
-+ "type": "json_flag",
-+ "context": [ "COMESTIBLE" ]
++ "type": "json_flag"
+ },
+ {
+ "id": "ALLERGEN_ALCOHOL",
-+ "type": "json_flag",
-+ "context": [ "COMESTIBLE" ]
++ "type": "json_flag"
+ },
+ {
+ "id": "ALLERGEN_FOODSTUFF",
-+ "type": "json_flag",
-+ "context": [ "COMESTIBLE" ]
++ "type": "json_flag"
++ },
++ {
++ "id": "ALLERGEN_WATER",
++ "type": "json_flag"
+ },
+ {
"id": "ALLERGEN_JUNK",
- "type": "json_flag",
- "context": [ "COMESTIBLE" ]
-@@ -1199,6 +1214,16 @@
- "type": "json_flag",
- "context": [ ]
+ "type": "json_flag"
},
-+ {
+@@ -1189,6 +1205,14 @@
+ "type": "json_flag"
+ },
+ {
+ "id": "VAMPIRISM",
-+ "type": "json_flag",
-+ "context": [ ]
++ "type": "json_flag"
+ },
+ {
+ "id": "VAMPIRISM_OK",
-+ "type": "json_flag",
-+ "context": [ ]
++ "type": "json_flag"
+ },
- {
++ {
"id": "CASING",
- "type": "json_flag",
+ "type": "json_flag"
+ },
--- a/data/json/morale_types.json
+++ b/data/json/morale_types.json
@@ -130,6 +130,11 @@
- "text": "Ate Demihuman Flesh"
+ "text": "Ate demihuman flesh"
},
{
+ "id": "morale_vampire",
@@ -888,11 +968,11 @@
+ {
"id": "morale_vegetarian",
"type": "morale_type",
- "text": "Ate Vegetables"
+ "text": "Ate vegetables"
--- a/data/json/mutations/mutation_ordering.json
+++ b/data/json/mutations/mutation_ordering.json
-@@ -75,6 +75,7 @@
+@@ -80,6 +80,7 @@
"TROGLO2",
"TROGLO3",
"URSINE_FUR",
@@ -900,12 +980,12 @@
"VISCOUS"
],
"order": 1500
-@@ -182,7 +183,7 @@
+@@ -189,7 +190,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": [ "ELFA_EARS", "FELINE_EARS", "LUPINE_EARS", "RABBIT_EARS", "URSINE_EARS" ], "order": 5500 },
+ { "id": [ "ANTENNAE", "ANTLERS", "HORNS_CURLED", "HORNS", "HORNS_POINTED" ], "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": [ "COMPOUND_EYES", "ELFAEYES", "FEL_EYE", "LIZ_EYE", "REAL_VAMP_EYES" ], "order": 6500 },
{
"id": [
"BEAK",
diff --git a/vehicles-02_fix-fbi-car-name.patch b/vehicles-02_fix-fbi-car-name.patch
new file mode 100644
index 0000000..2ee5ff2
--- /dev/null
+++ b/vehicles-02_fix-fbi-car-name.patch
@@ -0,0 +1,11 @@
+--- a/data/json/vehicles/emergency.json
++++ b/data/json/vehicles/emergency.json
+@@ -76,7 +76,7 @@
+ {
+ "id": "car_fbi",
+ "type": "vehicle",
+- "name": "FBI, Emergency",
++ "name": "FBI Car",
+ "blueprint": [
+ [ "-o++o-" ],
+ [ "+=##'|" ],
diff --git a/vehicles-03_black-box-can-be-installed.patch b/vehicles-03_black-box-can-be-installed.patch
new file mode 100644
index 0000000..dddeba5
--- /dev/null
+++ b/vehicles-03_black-box-can-be-installed.patch
@@ -0,0 +1,14 @@
+--- a/data/json/vehicleparts/vehicle_parts.json
++++ b/data/json/vehicleparts/vehicle_parts.json
+@@ -550,7 +550,10 @@
+ "broken_color": "dark_gray",
+ "flags": [ "NO_REPAIR" ],
+ "requirements": {
+- "install": { "skills": [ [ "mechanics", 2 ] ], "qualities": [ { "id": "SCREW", "level": 3 }, { "id": "WRENCH", "level": 3 } ] },
++ "install": {
++ "skills": [ [ "mechanics", 2 ] ],
++ "qualities": [ { "id": "SCREW_FINE", "level": 1 }, { "id": "WRENCH_FINE", "level": 1 } ]
++ },
+ "removal": { "skills": [ [ "mechanics", 2 ] ], "using": [ [ "vehicle_screw", 1 ] ] }
+ },
+ "breaks_into": [