summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjc_gargma <jc_gargma@iserlohn-fortress.net>2022-01-26 18:58:13 -0800
committerjc_gargma <jc_gargma@iserlohn-fortress.net>2022-01-26 18:58:13 -0800
commit580b2c5970d96a2e94b0e82e7a41b7c798057db9 (patch)
tree5a97a107d6a9b81dfbe54b61c189dc2250243b23
parentFix many patch fuzzing warnings. (diff)
downloadcataclysm-bn-580b2c5970d96a2e94b0e82e7a41b7c798057db9.tar.xz
Port faction updates from DDA.
Port Island Prison updates from DDA. Port Kindred updates from DDA. Port Mr Lapin updates from DDA.
-rw-r--r--PKGBUILD59
-rw-r--r--faction-01_more-factions.patch141
-rw-r--r--npc-04_island-prison-update.patch1796
-rw-r--r--npc-05_kindred-update.patch1171
-rw-r--r--npc-06_lapin-update.patch126
-rw-r--r--npc-10_dialogue-fixes.patch (renamed from npc-04_dialogue-fixes.patch)0
6 files changed, 3280 insertions, 13 deletions
diff --git a/PKGBUILD b/PKGBUILD
index fb1d706..94fe6d6 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -15,7 +15,7 @@ pkgname=cataclysm-bn
_pkgname=Cataclysm-BN-cbn-experimental
pkgver=202201220831
_pkgver=2022-01-22-0831
-pkgrel=3
+pkgrel=5
pkgdesc="A post-apocalyptic roguelike."
#url="http://cataclysmrl.blogspot.com/"
#url="http://www.cataclysm.glyphgryph.com/"
@@ -42,6 +42,8 @@ source=("$pkgname-$_pkgver.tar.gz::https://github.com/cataclysmbnteam/Cataclysm-
"bionics-01_npc-can-use-more-bionics.patch"
+ "faction-01_more-factions.patch"
+
"foods-01_fix-food-materials.patch"
"foods-02_fix-food-naming.patch"
@@ -60,9 +62,13 @@ source=("$pkgname-$_pkgver.tar.gz::https://github.com/cataclysmbnteam/Cataclysm-
"npc-01_isherwood-update.patch"
"npc-02_tacoma-update.patch"
"npc-03_godco-update.patch"
- #"npc-04_refugee.patch"
- #"npc-05_robofac.patch"
- "npc-04_dialogue-fixes.patch"
+ "npc-04_island-prison-update.patch"
+ "npc-05_kindred-update.patch"
+ "npc-06_lapin-update.patch"
+ #"npc-nn_refugee.patch"
+ #"npc-nn_robofac.patch"
+ #"npc-nn_lighthouse-family.patch"
+ "npc-10_dialogue-fixes.patch"
"recipes-01_4570-dragon-can-be-dismantled.patch"
@@ -117,6 +123,7 @@ b2sums=('028de65b63ac40c23bff23b3e0521e5b464e6835b34fc8a6cfaca330ec5804499c8fb1b
'0884229f513f843099dbd397d96fd8b37aad2d1ae0aee2771f57f54188241d6ed0ede8750780b9564bd9e3dc8d215039d409081a8eb46ce25b90edb196eb6bf4'
'f4ad4c90cfcf11af42c6cfc6d2027b21af3f58ac274b9bd0852a52ef60b606476766f194b281f6baf12f81647b384a98f745519bb48bc2e4f5fe03984c7c0e65'
'f3bdbaac5dbe9384571fe5ec14d2d25035f227a977c25349b8188e7343804e3973b898b44c34f9abe9318666294f4fdfe780fd516dcbdb29c4ac52f6d0ed6cad'
+ '1ce956dbcd0af3e16c336ce15995a7df19b8bed78765890304ff9dcaf6d30c602580bef050d6c659fdff945a31dce880f5f4042dfc295cdef44c34155a3e644c'
'43937dd83705b5ab62ae02cf1d043426c82f37e600afe06a287706e8450b596b84cc23138fbda31d67b9a2206ebfdc69754e329e7621075cbf480691f7d61871'
'b3f3be15fb87b1cdb6230216328f648e66d06fd2eeee9a6a3ff3f6b8e94c5213af7a2a4643f1e59ca8801056325ad4be4b88d723c2ec52c4ecc6f8c356ff8c82'
'76c816df10aceec8f1a7d1356220eb3f00b16fac455e84eb8aefe76db29cd037dc74fb5cfa344b8d283b188951bd100c26e351ce2e27c16c836a547fe2c99e46'
@@ -130,6 +137,9 @@ b2sums=('028de65b63ac40c23bff23b3e0521e5b464e6835b34fc8a6cfaca330ec5804499c8fb1b
'24c5f9ee5553b66ac937785b3312378adbca096888b05da8b0cdc9c0586ee51e9a3754615cc03a659cfe70ba2f48f7ce0359025c816c887c7691424c685f5f96'
'4f98126afadd7ad3346e2a55c02a06e1f5709406984835ff4ee206c4b52ef7ce8c52eee3f581fa36799a59578e05375b5db884b88b35866fbc6bb1330b79fe83'
'613a9d7a7a512cdf7dc1f1121ecaec7272efe740f5494ce425c3781d41a0ec92e044142d82a28c6445416e84699131745c6872c9b33cb5b93528d0197745455a'
+ '71bd229c0ee32703e3fc44021939f2909adca148035e6bfac44f35cb68cd8e03c01b477bfb29fe05f568728f27bd5b6311a267338d05cdbd5680af0900324c08'
+ 'aa0d3cbb74e42a90c8fc5f61b28ca007904856efa70211d5ff644c7c658be4ca124cfc0589220e20935da42749eb148fea5e7b0c7ddd7b7546c4ea9780126662'
+ '17ded8bdfccef7555cc01727984c768ecc601878319bc8cc959cff51b5091335dd43f45cf69ec12dfd478644ccceab48c7a49c3469bbe3eee9ec9b380cfac7fb'
'adcf0b46ad57390488b3932910fba5a5be8152f91b45864bf078a2b8d92dc89e9944c320dafb7a0d4786e1fce48bedea714d671feefe565ffbbb74baca21d98e'
'3373939e76f1ddb788b45424533c2e7687bbacae840fb3e6b1d49034e18315297af66dddf1b13d4f42033608123929b78819f38cca6cbc6c5ecca09bc67ab69f'
'b8a64accada87ee5be989c5307805610c9b5c0327bc107aab237ac3225dd9e4c51b6c79a2a7de15fe187d3c32d7cbe1c462f9b0e9fb5d5a55a74236c7061e96e'
@@ -192,7 +202,7 @@ prepare() {
# Fix mulitple inconsistent ammuntion names and handloaded status.
patch -Np1 -i "$srcdir"/ammo-01_inconsistent-ammo-names.patch
- # Set a fixed loudness of 20x66mm shotgun shells like that of other shotguns:
+ # 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
@@ -229,6 +239,12 @@ prepare() {
patch -Np1 -i "$srcdir"/bionics-01_npc-can-use-more-bionics.patch
+ # # faction fixes
+ echo "Applying faction fixes"
+ # Backport the factions.json updates from DDA
+ patch -Np1 -i "$srcdir"/faction-01_more-factions.patch
+
+
# # food fixes
echo "Applying food fixes"
# Fix several foods not being marked as the correct material:
@@ -284,24 +300,41 @@ prepare() {
# # npc fixes
echo "Applying NPC fixes"
- # Port over updates to Isherwood Farm
+ # Port the updates to Isherwood Farm from DDA
patch -Np1 -i "$srcdir"/npc-01_isherwood-update.patch
- # Port over updates to Tacoma Commune
+ # Port the updates to Tacoma Commune from DDA
patch -Np1 -i "$srcdir"/npc-02_tacoma-update.patch
- # Port over updates to New England Church Community
+ # Port the updates to New England Church Community from DDA
patch -Np1 -i "$srcdir"/npc-03_godco-update.patch
- # Port over updates to Free Merchant Center
- #patch -Np1 -i "$srcdir"/npc-04_refugee.patch
+ # Port the updates to prison and island prison from DDA
+ patch -Np1 -i "$srcdir"/npc-04_island-prison-update.patch
+
+ # Port the updates to kindred from DDA
+ # rm the old file else the linter errors from empty file
+ rm data/json/npcs/NPC_Brigitte_LaCroix.json
+ patch -Np1 -i "$srcdir"/npc-05_kindred-update.patch
+
+ # Port the updates to Mr Lapin from DDA
+ patch -Np1 -i "$srcdir"/npc-06_lapin-update.patch
+
+ # Port the updates to Free Merchant Center from DDA
+ # Relies on new json functions :/
+ #patch -Np1 -i "$srcdir"/npc-nn_refugee.patch
+
+ # Port the updates to Hub 01 from DDA
+ # Relies on new json functions :/
+ #patch -Np1 -i "$srcdir"/npc-nn_robofac.patch
- # Port over updates to Hub 01
- #patch -Np1 -i "$srcdir"/npc-05_robofac.patch
+ # Port the lighthouse family from DDA
+ # Relies on new json functions :/
+ #patch -Np1 -i "$srcdir"/npc-nn_lighthouse-family.patch
# Assorted typos in NPC dialogue.
# Fix Jack Isherwood mission listing 10 jars, when it is actually 20.
- patch -Np1 -i "$srcdir"/npc-04_dialogue-fixes.patch
+ patch -Np1 -i "$srcdir"/npc-10_dialogue-fixes.patch
# # recipe fixes
diff --git a/faction-01_more-factions.patch b/faction-01_more-factions.patch
new file mode 100644
index 0000000..e3165af
--- /dev/null
+++ b/faction-01_more-factions.patch
@@ -0,0 +1,141 @@
+--- a/data/json/npcs/factions.json
++++ b/data/json/npcs/factions.json
+@@ -54,6 +54,7 @@
+ "type": "faction",
+ "id": "robofac",
+ "name": "Hub 01",
++ "mon_faction": "robofac",
+ "likes_u": -200,
+ "respects_u": 0,
+ "known_by_u": false,
+@@ -578,5 +579,130 @@
+ "marloss": { "kill on sight": true }
+ },
+ "description": "A small group of churchgoers that formed a community in the woods. They welcome anyone in their faction, but hate the unnatural."
++ },
++ {
++ "type": "faction",
++ "id": "lapin",
++ "name": "Rabbit Enthusiasts",
++ "likes_u": 30,
++ "respects_u": 20,
++ "known_by_u": false,
++ "size": 1,
++ "power": 1,
++ "currency": "fur",
++ "food_supply": 87500,
++ "wealth": 82500,
++ "relations": {
++ "free_merchants": {
++ "kill on sight": false,
++ "watch your back": false,
++ "share my stuff": false,
++ "guard your stuff": false,
++ "lets you in": true,
++ "defends your space": false,
++ "knows your voice": true
++ },
++ "old_guard": {
++ "kill on sight": false,
++ "watch your back": false,
++ "share my stuff": false,
++ "guard your stuff": false,
++ "lets you in": false,
++ "defends your space": false,
++ "knows your voice": false
++ },
++ "tacoma_commune": {
++ "kill on sight": false,
++ "watch your back": false,
++ "share my stuff": false,
++ "guard your stuff": false,
++ "lets you in": true,
++ "defends your space": false
++ },
++ "lobby_beggars": {
++ "kill on sight": false,
++ "watch your back": false,
++ "share my stuff": false,
++ "guard your stuff": false,
++ "lets you in": true,
++ "defends your space": false
++ },
++ "no_faction": {
++ "kill on sight": false,
++ "watch your back": false,
++ "share my stuff": false,
++ "guard your stuff": false,
++ "lets you in": true,
++ "defends your space": false,
++ "knows your voice": true
++ },
++ "wasteland_scavengers": {
++ "kill on sight": false,
++ "watch your back": false,
++ "share my stuff": false,
++ "guard your stuff": false,
++ "lets you in": true,
++ "defends your space": false,
++ "knows your voice": true
++ },
++ "isherwood_family": {
++ "kill on sight": false,
++ "watch your back": false,
++ "share my stuff": false,
++ "guard your stuff": false,
++ "lets you in": true,
++ "defends your space": false,
++ "knows your voice": true
++ },
++ "hells_raiders": { "kill on sight": true },
++ "marloss": { "kill on sight": true }
++ },
++ "description": "Mr Lapin and any acolytes he may have gathered in the apocalypse."
++ },
++ {
++ "type": "faction",
++ "id": "fisherman_family",
++ "name": "Fisherman Family",
++ "likes_u": 0,
++ "respects_u": 0,
++ "known_by_u": false,
++ "size": 3,
++ "power": 3,
++ "food_supply": 100,
++ "wealth": 20000,
++ "relations": {
++ "free_merchants": { "knows your voice": true },
++ "old_guard": { "knows your voice": true },
++ "your_followers": { "knows your voice": true },
++ "no_faction": { "knows your voice": true }
++ },
++ "description": "A small family trying to survive in this new world."
++ },
++ {
++ "type": "faction",
++ "id": "prisoners",
++ "name": "Prisoners",
++ "likes_u": 0,
++ "respects_u": 0,
++ "known_by_u": true,
++ "size": 100,
++ "power": 100,
++ "food_supply": 230400,
++ "wealth": 45000000,
++ "relations": {
++ "hells_raiders": {
++ "kill on sight": false,
++ "watch your back": true,
++ "share my stuff": true,
++ "guard your stuff": true,
++ "lets you in": true,
++ "defends your space": true,
++ "knows your voice": true
++ },
++ "free_merchants": { "kill on sight": true },
++ "old_guard": { "kill on sight": true },
++ "your_followers": { "kill on sight": false }
++ },
++ "description": "Former prisoners who got their freedom during the apocalypse."
+ }
+ ]
diff --git a/npc-04_island-prison-update.patch b/npc-04_island-prison-update.patch
new file mode 100644
index 0000000..193df11
--- /dev/null
+++ b/npc-04_island-prison-update.patch
@@ -0,0 +1,1796 @@
+--- a/data/json/npcs/island_prison/prisoners.json
++++ b/data/json/npcs/island_prison/prisoners.json
+@@ -0,0 +1,634 @@
++[
++ {
++ "type": "npc",
++ "id": "prisoner_generic",
++ "//": "Former prisoner with a melee or ranged weapon and prison clothing. Sometimes they also have prison guards' gear.",
++ "name_suffix": "prisoner",
++ "class": "NC_THUG_PRISONER",
++ "attitude": 0,
++ "mission": 8,
++ "chat": "TALK_PRISONER_GENERIC",
++ "faction": "prisoners"
++ },
++ {
++ "type": "npc",
++ "id": "prisoner_greeter",
++ "//": "Former prisoner with a melee or ranged weapon and prison clothing. Sometimes they also have prison guards' gear.",
++ "name_suffix": "gatekeeper",
++ "class": "NC_THUG_PRISONER",
++ "attitude": 0,
++ "mission": 8,
++ "chat": "TALK_PRISONER_GREET",
++ "faction": "prisoners"
++ },
++ {
++ "type": "npc",
++ "id": "prisoner_leader",
++ "//": "Former prisoner with a melee or ranged weapon and prison clothing. Sometimes they also have prison guards' gear.",
++ "name_suffix": "leader of prisoners",
++ "class": "NC_THUG_PRISONER",
++ "attitude": 0,
++ "mission": 8,
++ "chat": "TALK_PRISONER_LEADER_GREET",
++ "faction": "prisoners",
++ "mission_offered": "MISSION_PRISONER_LEADER_GET_ID_CARD"
++ },
++ {
++ "type": "npc_class",
++ "id": "NC_THUG_PRISONER",
++ "name": { "str": "Prisoner" },
++ "job_description": "I'm here to kick ass.",
++ "traits": [
++ { "group": "BG_survival_story_CRIMINAL" },
++ { "group": "NPC_starting_traits" },
++ { "group": "Appearance_demographics" }
++ ],
++ "bonus_str": { "rng": [ 2, 4 ] },
++ "bonus_dex": { "rng": [ 0, 2 ] },
++ "skills": [
++ { "skill": "ALL", "level": { "sum": [ { "dice": [ 3, 2 ] }, { "constant": -4 } ] } },
++ { "skill": "dodge", "bonus": { "rng": [ 1, 3 ] } },
++ { "skill": "melee", "bonus": { "rng": [ 2, 4 ] } },
++ { "skill": "unarmed", "bonus": { "rng": [ 1, 3 ] } },
++ { "skill": "bashing", "bonus": { "rng": [ 1, 5 ] } },
++ { "skill": "stabbing", "bonus": { "rng": [ 1, 5 ] } },
++ { "skill": "cutting", "bonus": { "rng": [ 1, 5 ] } }
++ ],
++ "worn_override": "NC_THUG_PRISONER_worn",
++ "weapon_override": "NC_THUG_PRISONER_wield"
++ },
++ {
++ "type": "item_group",
++ "id": "NC_THUG_PRISONER_worn",
++ "subtype": "collection",
++ "entries": [
++ { "group": "male_underwear" },
++ { "distribution": [ { "group": "clothing_prisoner_shoes" }, { "group": "cop_shoes" } ] },
++ { "distribution": [ { "item": "striped_shirt" }, { "group": "cop_torso" } ] },
++ { "distribution": [ { "item": "striped_pants" }, { "group": "cop_pants" } ] },
++ { "distribution": [ { "item": "tacvest" }, { "item": "kevlar" } ], "prob": 15 },
++ { "group": "socks_unisex" },
++ { "group": "cop_gloves", "prob": 20 },
++ { "distribution": [ { "item": "bandana" }, { "group": "cop_helmet" } ], "prob": 50 },
++ { "group": "clothing_glasses", "prob": 20 },
++ { "group": "clothing_watch", "prob": 20 },
++ { "item": "police_belt", "prob": 20 }
++ ]
++ },
++ {
++ "type": "item_group",
++ "id": "NC_THUG_PRISONER_wield",
++ "items": [
++ [ "baton-extended", 50 ],
++ [ "PR24-retracted", 50 ],
++ [ "knife_steak", 30 ],
++ [ "knife_chef", 30 ],
++ [ "knife_paring", 30 ],
++ [ "knife_butcher", 30 ],
++ [ "knife_meat_cleaver", 30 ],
++ [ "knife_carving", 30 ],
++ [ "pointy_stick", 30 ],
++ [ "cudgel", 20 ],
++ [ "knuckle_nail", 20 ],
++ [ "spear_spike", 20 ],
++ [ "spear_knife", 15 ],
++ [ "makeshift_sap", 15 ],
++ [ "homewrecker", 15 ],
++ [ "makeshift_knife", 15 ],
++ [ "nailboard", 15 ],
++ [ "sword_wood", 10 ],
++ [ "glass_shiv", 5 ],
++ [ "rock_sock", 5 ],
++ [ "sharp_toothbrush", 5 ],
++ [ "chisel", 5 ],
++ [ "scissors", 5 ],
++ [ "screwdriver", 5 ],
++ [ "knife_steak", 5 ],
++ [ "knuckle_brass", 5 ],
++ [ "switchblade", 5 ],
++ [ "throwing_knife", 5 ],
++ {
++ "distribution": [ { "group": "longguns_cop", "prob": 50, "contents-item": "shoulder_strap" }, { "group": "sidearms_cop", "prob": 50 } ],
++ "prob": 40
++ }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_GENERIC",
++ "type": "talk_topic",
++ "dynamic_line": "<get_lost>",
++ "responses": [
++ { "text": "Ok, sorry, I'm already leaving!", "topic": "TALK_DONE" },
++ { "text": "Hey, <fuck_you>!", "topic": "TALK_DONE", "effect": "hostile" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_GREET",
++ "type": "talk_topic",
++ "dynamic_line": {
++ "u_has_var": "first_meeting",
++ "type": "dialogue",
++ "context": "first_meeting",
++ "value": "yes",
++ "no": "Hey, who the fuck are you? I haven't seen you 'round. Ah, fuck it, it doesn't matter.\nHere's the rules. The first and most important one: ALWAYS CLOSE THE FUCKING ENTRY DOOR BEHIND YOUR ASS! If you're okay with that, the following rules are: don't fuck with us, don't steal from us, don't start a fight without a reason with someone from us. Got it, punk? Now get lost.",
++ "yes": "<get_lost>"
++ },
++ "speaker_effect": { "effect": { "u_add_var": "first_meeting", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ "responses": [
++ {
++ "text": "Yeah, I got it. See ya.",
++ "topic": "TALK_DONE",
++ "condition": { "not": { "u_has_var": "first_meeting", "type": "dialogue", "context": "first_meeting", "value": "yes" } }
++ },
++ {
++ "text": "I just wanted to ask if you have a job for me.",
++ "topic": "TALK_PRISONER_ANNOYED",
++ "condition": {
++ "and": [
++ { "u_has_var": "first_meeting", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ {
++ "not": { "u_has_var": "talked_to_greeter", "type": "dialogue", "context": "annoyed_greeter", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "I'm just hungry, and I thought you might give me some food for some job.",
++ "topic": "TALK_PRISONER_ANGRY",
++ "condition": {
++ "and": [
++ { "u_has_var": "first_meeting", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "talked_to_greeter", "type": "dialogue", "context": "annoyed_greeter", "value": "yes" },
++ {
++ "not": { "u_has_var": "talked_to_greeter", "type": "dialogue", "context": "angry_greeter", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Can we just talk it over?",
++ "topic": "TALK_PRISONER_READY_TO_MUG",
++ "condition": {
++ "and": [
++ { "u_has_var": "first_meeting", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "talked_to_greeter", "type": "dialogue", "context": "angry_greeter", "value": "yes" }
++ ]
++ }
++ },
++ { "text": "Hey, <fuck_you>!", "topic": "TALK_DONE", "effect": "hostile" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_ANNOYED",
++ "type": "talk_topic",
++ "dynamic_line": {
++ "u_has_var": "talked_to_greeter",
++ "type": "dialogue",
++ "context": "annoyed_greeter",
++ "value": "yes",
++ "no": "Do I have a <swear> exclamation sign over my <swear> head, like I'm a <swear> quest-giver from some <swear> video game?",
++ "yes": "<get_lost>"
++ },
++ "speaker_effect": { "effect": { "u_add_var": "talked_to_greeter", "type": "dialogue", "context": "annoyed_greeter", "value": "yes" } },
++ "responses": [
++ {
++ "text": "No, of course not! Sorry, I'm leaving.",
++ "topic": "TALK_DONE",
++ "condition": { "not": { "u_has_var": "talked_to_greeter", "type": "dialogue", "context": "annoyed_greeter", "value": "yes" } }
++ },
++ { "text": "Hey, <fuck_you>!", "topic": "TALK_DONE", "effect": "hostile" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_ANGRY",
++ "type": "talk_topic",
++ "dynamic_line": {
++ "u_has_var": "talked_to_greeter",
++ "type": "dialogue",
++ "context": "annoyed_greeter",
++ "value": "yes",
++ "no": "<get_lost>",
++ "yes": "Are you deaf or stupid? I said I don't give a fuck for you and your <swear> problems. Bother me one more time, and you'll regret that. <get_lost>"
++ },
++ "speaker_effect": { "effect": { "u_add_var": "talked_to_greeter", "type": "dialogue", "context": "angry_greeter", "value": "yes" } },
++ "responses": [
++ {
++ "text": "Ok, sorry, I promise I won't bother you anymore.",
++ "topic": "TALK_DONE",
++ "condition": { "not": { "u_has_var": "talked_to_greeter", "type": "dialogue", "context": "angry_greeter", "value": "yes" } }
++ },
++ { "text": "Hey, <fuck_you>!", "topic": "TALK_DONE", "effect": "hostile" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_READY_TO_MUG",
++ "type": "talk_topic",
++ "dynamic_line": "You think you're immortal, huh, <name_b>?",
++ "responses": [
++ { "text": "Gee, what's the matter with you? Okay, okay, I'm leaving.", "topic": "TALK_PRISONER_MUG" },
++ {
++ "text": "It would be you who will regret talking to me like that.",
++ "topic": "TALK_DONE",
++ "effect": "hostile"
++ }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_MUG",
++ "type": "talk_topic",
++ "dynamic_line": [ "Not so fast, I think you need to pay for breaking your promise and bothering me. Give me your shit, now!" ],
++ "responses": [
++ { "text": "Please don't hurt me! Take all that you want.", "topic": "TALK_MUG" },
++ { "text": "What, <no>!", "topic": "TALK_DONE", "effect": "hostile" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_GREET",
++ "type": "talk_topic",
++ "dynamic_line": {
++ "u_has_var": "prisoner_leader_mission",
++ "type": "mission",
++ "context": "military_id",
++ "value": "yes",
++ "yes": "I have nothing more to say to you. <get_lost>",
++ "no": {
++ "u_has_var": "prisoner_leader_mission",
++ "type": "mission",
++ "context": "accepted",
++ "value": "yes",
++ "yes": "So, what are you waiting for?",
++ "no": {
++ "u_has_var": "prisoner_leader_mission",
++ "type": "mission",
++ "context": "completed",
++ "value": "yes",
++ "yes": "I don't know if you know, but there are sewers underneath the prison. I was planning an escape long before <the_cataclysm>, and while I was working on cleaning the sewers, I noticed a damaged wall section. There was a flow of fresh air coming out of it, so I think it's leading to the surface. It could be your way to freedom. Feel free to use it.",
++ "no": {
++ "u_has_var": "talked_to_leader",
++ "type": "dialogue",
++ "context": "first_meeting",
++ "value": "yes",
++ "yes": {
++ "u_has_var": "talked_to_leader",
++ "type": "dialogue",
++ "context": "cannibal",
++ "value": "yes",
++ "no": "It's you again.",
++ "yes": "You are what you eat, as they say."
++ },
++ "no": "Hello there. Haven't seen you around before. You must be from the other wing. Managed to survive, huh?"
++ }
++ }
++ }
++ },
++ "speaker_effect": { "effect": { "u_add_var": "talked_to_leader", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ "responses": [
++ {
++ "text": "Yeah, I've been through situations far worse than that.",
++ "topic": "TALK_PRISONER_LEADER_INQUIRY",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "talked_to_leader", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "It was a nightmare, lots of <zombies>, blood everywhere! Thank god I'm among living people again.",
++ "topic": "TALK_PRISONER_LEADER_FROWN",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "talked_to_leader", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "[Cannibal] It's hard to die of hunger when there's so many tasty corpses lying around.",
++ "topic": "TALK_PRISONER_LEADER_LEARNED_ABOUT_CANNIBAL",
++ "condition": {
++ "and": [
++ { "u_has_trait": "CANNIBAL" },
++ {
++ "not": { "u_has_var": "talked_to_leader", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ { "not": { "u_has_var": "talked_to_leader", "type": "dialogue", "context": "cannibal", "value": "yes" } },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "I want to get out of this <swear> prison. I hoped you could help me with that.",
++ "topic": "TALK_PRISONER_LEADER_GIVES_WORK",
++ "condition": {
++ "and": [
++ { "u_has_var": "talked_to_leader", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" }
++ },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "I'm on my way.",
++ "topic": "TALK_DONE",
++ "condition": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ },
++ {
++ "text": "I don't know if I'll take your advice, but thanks nevertheless.",
++ "topic": "TALK_DONE",
++ "condition": {
++ "and": [
++ { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Wait, what? A <swear> can of beans?! I went through hell to get this <swear> thing for you, and all you give me as reward is a <swear> can of beans?! I demand something more substantial.",
++ "topic": "TALK_PRISONER_LEADER_DEMANDED_SUBSTANTIAL_REWARD",
++ "condition": {
++ "and": [
++ { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Nice talking to ya. Farewell.",
++ "topic": "TALK_DONE",
++ "condition": {
++ "and": [
++ { "u_has_var": "talked_to_leader", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" }
++ },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Okay.",
++ "topic": "TALK_DONE",
++ "condition": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" }
++ }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_LEARNED_ABOUT_CANNIBAL",
++ "type": "talk_topic",
++ "dynamic_line": [
++ "Huh, even so? I'm not saying I approve your… tastes, but I definitely respect people who use all possibilities life has to offer."
++ ],
++ "speaker_effect": { "effect": { "u_add_var": "talked_to_leader", "type": "dialogue", "context": "cannibal", "value": "yes" } },
++ "responses": [ { "text": "Yeah, we share the same opinions on this matter.", "topic": "TALK_NONE" } ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_INQUIRY",
++ "type": "talk_topic",
++ "dynamic_line": [
++ "Well, that's a boastful statement. Not that I don't believe it, it's just…. Ah, nevermind. Let's get to the point. What do you want?"
++ ],
++ "responses": [
++ {
++ "text": "I want to get out of this <swear> prison. I hoped you could help me with that.",
++ "topic": "TALK_PRISONER_LEADER_GIVES_WORK"
++ }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_FROWN",
++ "type": "talk_topic",
++ "dynamic_line": [ "Hold the horses, pal. Nobody allowed you to stay here - yet." ],
++ "responses": [
++ {
++ "text": "Please! I don't want to go back there! I'm tired and hungry! I just need time to rest!",
++ "topic": "TALK_PRISONER_LEADER_ANNOYED"
++ },
++ { "text": "Shit! Looks like I'm on my own now. Thanks for nothing. Bye.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_ANNOYED",
++ "type": "talk_topic",
++ "dynamic_line": [
++ "We don't have much space, and there's not much food. Besides, I don't know you at all, and something tells me you won't survive another day."
++ ],
++ "responses": [
++ {
++ "text": "[STR 11] I'm tougher than it seems!",
++ "topic": "TALK_PRISONER_LEADER_NO",
++ "condition": { "u_has_strength": 11 }
++ },
++ {
++ "text": "[Survival 2] I have some survival expertise!",
++ "topic": "TALK_PRISONER_LEADER_NO",
++ "condition": { "u_has_skill": { "skill": "survival", "level": 2 } }
++ },
++ { "text": "I guess I need to find some other place…", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_NO",
++ "type": "talk_topic",
++ "dynamic_line": [
++ "The answer is still no. In fact it might be better for us to kill you right away - you know, the less mouths to feed, the better. But I'm in a good mood today, so I've decided to help you get out of this island."
++ ],
++ "responses": [
++ { "text": "Ok, I'm listening.", "topic": "TALK_PRISONER_LEADER_GIVES_WORK" },
++ { "text": "You know, I think I'll manage without your help. Bye.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_GIVES_WORK",
++ "type": "talk_topic",
++ "dynamic_line": {
++ "u_has_var": "prisoner_leader_mission",
++ "type": "mission",
++ "context": "accepted",
++ "value": "yes",
++ "no": "I need you to retrieve some stuff from a locked safe. Interested?",
++ "yes": "So, what are you waiting for?"
++ },
++ "responses": [
++ {
++ "text": "[Show the military id card] You mean this stuff?",
++ "topic": "TALK_PRISONER_LEADER_SHOW_MILITARY_ID",
++ "condition": {
++ "and": [
++ { "u_has_item": "id_military" },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "What's in the safe?",
++ "topic": "TALK_PRISONER_LEADER_ASKED_ABOUT_SAFE_CONTENTS",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" } },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "What for do you need it?",
++ "topic": "TALK_PRISONER_LEADER_ASKED_ABOUT_WHAT_FOR_DO_YOU_NEED_IT",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" } },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Yeah, sure.",
++ "topic": "TALK_MISSION_OFFER",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" } },
++ {
++ "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "I have a bad feeling about this. Sorry, I'll pass.",
++ "topic": "TALK_DONE",
++ "condition": { "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" } }
++ },
++ {
++ "text": "I'm on my way.",
++ "topic": "TALK_DONE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" } },
++ { "u_has_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" }
++ ]
++ }
++ }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_ASKED_ABOUT_SAFE_CONTENTS",
++ "type": "talk_topic",
++ "dynamic_line": [
++ "As I said, that's the thing I need. You don't need to know what's that exactly. Just grab all things you find in the safe, and call it a day."
++ ],
++ "responses": [
++ { "text": "That's weird.", "topic": "TALK_NONE" },
++ { "text": "I have a bad feeling about this. Sorry, I'll pass.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_ASKED_ABOUT_WHAT_FOR_DO_YOU_NEED_IT",
++ "type": "talk_topic",
++ "dynamic_line": [ "Let's say that's none of your <swear> business. Other questions?" ],
++ "responses": [
++ { "text": "That's weird.", "topic": "TALK_NONE" },
++ { "text": "I have a bad feeling about this. Sorry, I'll pass.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_SHOW_MILITARY_ID",
++ "type": "talk_topic",
++ "speaker_effect": { "effect": { "u_add_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" } },
++ "dynamic_line": [ "Hey, where did you get it? Nevermind, just give it to me. Just <swear> now." ],
++ "responses": [
++ {
++ "text": "Hey, no need to be hostile. Here you go, I don't need it anyway.",
++ "topic": "TALK_DONE",
++ "effect": { "u_sell_item": "id_military" }
++ },
++ {
++ "text": "I went through incredible hardships to get it. Please, can I keep this to myself?",
++ "trial": { "type": "PERSUADE", "difficulty": 5, "mod": [ [ "ALTRUISM", 3 ], [ "TRUST", 1 ] ] },
++ "failure": { "topic": "TALK_DONE", "effect": "hostile" },
++ "success": { "topic": "TALK_PRISONER_LEADER_TRIAL_SUCCESS" }
++ },
++ {
++ "text": "I killed tons of <zombies> while I was trying to get this thing. Do you really think you and your handful of losers pose a threat to me?",
++ "trial": { "type": "INTIMIDATE", "difficulty": 30, "mod": [ [ "BRAVERY", -1 ], [ "FEAR", 3 ] ] },
++ "failure": { "topic": "TALK_DONE", "effect": "hostile" },
++ "success": { "topic": "TALK_PRISONER_LEADER_TRIAL_SUCCESS" }
++ },
++ { "text": "What, <no>!", "topic": "TALK_DONE", "effect": "hostile" }
++ ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_TRIAL_SUCCESS",
++ "type": "talk_topic",
++ "dynamic_line": [
++ "Okay. It was convincing. I'll still get what I want, one way or another. You better watch your back from now on."
++ ],
++ "responses": [ { "text": "Noted. Bye.", "topic": "TALK_DONE" } ]
++ },
++ {
++ "id": "TALK_PRISONER_LEADER_DEMANDED_SUBSTANTIAL_REWARD",
++ "type": "talk_topic",
++ "speaker_effect": { "effect": { "u_add_var": "prisoner_leader_mission", "type": "mission", "context": "military_id", "value": "yes" } },
++ "dynamic_line": [ "I'm afraid you're not in the position to demand anything from me, <name_b>. <get_lost>" ],
++ "responses": [
++ { "text": "Hey, <fuck_you>! You'll regret that!", "topic": "TALK_DONE", "effect": "hostile" },
++ { "text": "Okay, fine. Cheapskate!", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "id": "MISSION_PRISONER_LEADER_GET_ID_CARD",
++ "type": "mission_definition",
++ "name": { "str": "Get The Thing from the chief's office" },
++ "difficulty": 1,
++ "value": 0,
++ "goal": "MGOAL_FIND_ITEM",
++ "item": "id_military",
++ "origins": [ "ORIGIN_SECONDARY" ],
++ "dialogue": {
++ "describe": "Here's the job…",
++ "offer": "My snitch whispered in my ear that the thing I need is located in the chief's safe in his office. You need to crack it open and bring the contents to me. Don't try to use anything you find in there! Just bring all the stuff to me, and I'll help you. Deal?",
++ "accepted": "Great! Don't forget that I need all stuff from the safe, try not to lose a thing.",
++ "rejected": "Fine, I'll get the thing in any case, sooner or later.",
++ "advice": "The chief's office is on the other side of the prison. I think the road there is full of <zombies>, so you better find a weapon. Also you probably will need some tools to crack the safe open.",
++ "inquire": "Did you get the stuff already?",
++ "success": "At last! Give me a few moments to check if it isn't damaged. Here, take this for your troubles.",
++ "success_lie": "Huh. This isn't going to work like I thought.",
++ "failure": "You're useless. I should've killed you when I met you."
++ },
++ "has_generic_rewards": false,
++ "start": { "effect": [ { "u_add_var": "prisoner_leader_mission", "type": "mission", "context": "accepted", "value": "yes" } ] },
++ "end": {
++ "effect": [
++ { "u_add_var": "prisoner_leader_mission", "type": "mission", "context": "completed", "value": "yes" },
++ { "u_lose_var": "prisoner_leader_mission", "type": "mission", "context": "accepted" },
++ { "u_buy_item": "can_beans", "container": "can_medium" }
++ ]
++ }
++ }
++]
+--- a/data/json/monsters/zed_prisoner.json
++++ b/data/json/monsters/zed_prisoner.json
+@@ -10,5 +10,32 @@
+ "color": "green",
+ "melee_dice_sides": 4,
+ "death_drops": "mon_zombie_prisoner_death_drops"
++ },
++ {
++ "id": "mon_zombie_prisoner_brute",
++ "type": "MONSTER",
++ "name": { "str": "prisoner brute" },
++ "description": "This muscular zombie wears black and white striped prisoner clothes.",
++ "copy-from": "mon_zombie_brute",
++ "looks_like": "mon_zombie_brute",
++ "death_drops": "mon_zombie_prisoner_death_drops"
++ },
++ {
++ "id": "mon_zombie_prisoner_fat",
++ "type": "MONSTER",
++ "name": { "str": "fat prisoner" },
++ "description": "This fat zombie wears black and white striped prisoner clothes.",
++ "copy-from": "mon_zombie_fat",
++ "looks_like": "mon_zombie_fat",
++ "death_drops": "mon_zombie_prisoner_death_drops"
++ },
++ {
++ "id": "mon_zombie_prisoner_tough",
++ "type": "MONSTER",
++ "name": { "str": "tough prisoner" },
++ "description": "This tough-looking zombie wears black and white striped prisoner clothes.",
++ "copy-from": "mon_zombie_tough",
++ "looks_like": "mon_zombie_tough",
++ "death_drops": "mon_zombie_prisoner_death_drops"
+ }
+ ]
+--- a/data/json/mapgen/prison_1.json
++++ b/data/json/mapgen/prison_1.json
+@@ -25,12 +25,12 @@
+ " s_____________________________________s+,,,,d,|--------+---|G|h|h|h|h| ",
+ " s_____________________________________s+,,,,dh|S,T|l,,,,,+<|,|g|g|g|g| ",
+ " s_____________________________________s|hhh,,,+,,,|l,,,,,--|,|h|h|h|h| ",
+- " s____Y____Y____Y____Y____Y____Y_______s|------|---|l,3333,l|,|,,,,,,,| ",
++ " s____Y____Y____Y____Y____Y____Y_______s|------|---|l,5555,l|,|,,,,,,,| ",
+ " s____Y____Y____Y____Y____Y____Y_______s|,,,,,,,,,,|l,,,,,,l|G|------G| ",
+- " s____Y____Y____Y____Y____Y____Y_______s@,,,,,,,,d,|l,3333,l|,,,,,,,|,| ",
++ " s____Y____Y____Y____Y____Y____Y_______s@,,,,,,,,d,|l,5555,l|,,,,,,,|,| ",
+ " s____Y____Y____Y____Y____Y____Y_______s@,,,,,,,,dh|l,,,,,,l|hth,hth|,| ",
+- " s____Y____Y____Y____Y____Y____Y_______s|,,,,,,,,d,|l,3333,l|hth,hth|,| ",
+- " sssssssssssssssssssssssssssssssssssssss|33333,,,,,|l,,,,,,l|,,,,,,,|,| ",
++ " s____Y____Y____Y____Y____Y____Y_______s|,,,,,,,,d,|l,5555,l|hth,hth|,| ",
++ " sssssssssssssssssssssssssssssssssssssss|55555,,,,,|l,,,,,,l|,,,,,,,|,| ",
+ " |---------------------------------------------@@-------@-----R-G-R--G| ",
+ " | f ss f s s s| ",
+ " | sssssssssssssssssssssssssssssssssHssssHsssssssssssssssssss| ",
+@@ -168,9 +168,20 @@
+ "^": "t_concrete",
+ "P": "t_concrete",
+ "Y": "t_pavement_y",
++ "C": "t_floor",
++ "L": "t_floor",
++ "5": "t_floor",
+ "Z": "t_door_bar_o"
+ },
+- "furniture": { "X": "f_exercise", "C": "f_counter", "P": "f_rack", "2": "f_home_furnace", "4": "f_water_heater", "L": "f_locker" },
++ "furniture": {
++ "X": "f_exercise",
++ "C": "f_counter",
++ "5": "f_bench",
++ "P": "f_rack",
++ "2": "f_home_furnace",
++ "4": "f_water_heater",
++ "L": "f_locker"
++ },
+ "items": {
+ "l": [
+ { "item": "prison_weapons", "chance": 30 },
+@@ -465,7 +476,14 @@
+ ],
+ "?": { "item": "autodoc_supplies", "chance": 100 }
+ },
+- "monster": { "Z": { "monster": "mon_zombie_prisoner" }, "C": { "monster": "mon_broken_cyborg" } }
++ "monster": {
++ "Z": [
++ { "monster": "mon_zombie_prisoner" },
++ { "monster": "mon_zombie_prisoner_fat" },
++ { "monster": "mon_zombie_prisoner_tough" }
++ ],
++ "C": { "monster": "mon_broken_cyborg" }
++ }
+ }
+ },
+ {
+@@ -602,7 +620,6 @@
+ "L": [ "t_floor" ],
+ "M": [ "t_floor" ],
+ "N": [ "t_floor" ],
+- "O": [ "t_floor" ],
+ "P": [ "t_floor" ],
+ "Q": [ "t_floor" ],
+ "R": [ "t_floor" ],
+@@ -628,7 +645,6 @@
+ "L": [ "f_drill_press" ],
+ "M": [ "f_heavy_lathe" ],
+ "N": [ "f_utility_shelf" ],
+- "O": [ "f_shredder" ],
+ "P": [ "f_workbench" ],
+ "Q": [ "f_cupboard" ],
+ "R": [ "f_locker" ],
+@@ -663,7 +679,7 @@
+ "U": { "item": "prison_canine_bowl", "chance": 70 },
+ "Y": { "item": "clothing_outdoor_torso", "chance": 60 },
+ "q": { "item": "trash_cart", "chance": 50, "repeat": [ 2, 3 ] },
+- "n": { "item": "oven", "chance": 70 },
++ "n": { "item": "SUS_oven", "chance": 70 },
+ "r": { "item": "cleaning", "chance": 50 },
+ ":": { "item": "animalshelter_toys", "chance": 5 },
+ "1": { "item": "office_paper", "chance": 50 },
+@@ -672,19 +688,39 @@
+ "2": [ { "item": "cannedfood", "chance": 70, "repeat": [ 1, 3 ] }, { "item": "pasta", "chance": 70, "repeat": [ 1, 3 ] } ]
+ },
+ "monster": {
+- ",": [ { "monster": "mon_zombie_cop", "chance": 1 }, { "monster": "mon_zombie_prisoner", "chance": 2 } ],
+- "_": [ { "monster": "mon_zombie_cop", "chance": 1 }, { "monster": "mon_zombie_prisoner", "chance": 2 } ],
+- "(": [ { "monster": "mon_zombie_cop", "chance": 1 }, { "monster": "mon_zombie_prisoner", "chance": 2 } ],
+- "#": [ { "monster": "mon_zombie_cop", "chance": 1 }, { "monster": "mon_zombie_prisoner", "chance": 2 } ],
++ ",": [
++ { "monster": "mon_zombie_cop", "chance": 1 },
++ { "monster": "mon_zombie_prisoner", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_fat", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_tough", "chance": 2 }
++ ],
++ "_": [
++ { "monster": "mon_zombie_cop", "chance": 1 },
++ { "monster": "mon_zombie_prisoner", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_fat", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_tough", "chance": 2 }
++ ],
++ "(": [
++ { "monster": "mon_zombie_cop", "chance": 1 },
++ { "monster": "mon_zombie_prisoner", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_fat", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_tough", "chance": 2 }
++ ],
++ "#": [
++ { "monster": "mon_zombie_cop", "chance": 1 },
++ { "monster": "mon_zombie_prisoner", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_fat", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_tough", "chance": 2 }
++ ],
+ "`": { "monster": "mon_zhark", "chance": 1 },
+ ".": { "monster": "mon_zombie_cop", "chance": 1 },
+- "^": { "monster": "mon_zombie_brute", "chance": 1 },
++ "^": { "monster": "mon_zombie_prisoner_brute", "chance": 1 },
+ " ": { "monster": "mon_dog_zombie_cop", "chance": 1 },
+ "U": { "monster": "mon_dog_gshepherd", "chance": 10 },
+ ":": { "monster": "mon_dog_gshepherd", "chance": 1 },
+ "<": { "monster": "mon_turret_riot" }
+ },
+- "place_monster": [ { "monster": "mon_zombie_hulk", "x": 45, "y": 3 }, { "monster": "mon_zombie_brute", "x": 60, "y": 56 } ],
++ "place_monster": [ { "monster": "mon_zombie_hulk", "x": 45, "y": 3 }, { "monster": "mon_zombie_prisoner_brute", "x": 60, "y": 56 } ],
+ "place_graffiti": [ { "text": "Dufresne was here", "x": 19, "y": 22 } ],
+ "computers": {
+ "a": {
+@@ -740,7 +776,7 @@
+ " ",
+ " ",
+ " ",
+- " 54444444444444444445 54444444444444444444444444445 ",
++ " Ю444444444444444444Ю Ю444444444444444444444444444Ю ",
+ " 1..................1 1...........................1 ",
+ " 1..................1 1...........................1 ",
+ " 1..................1 1...........................1 ",
+@@ -757,7 +793,7 @@
+ " wdh,,qw(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((wq,,hdw ",
+ " |-w+w-| |-w+w-| ",
+ " (^( (^( ",
+- " (^( 5444444444444444444444444444444444444444444444444444444444444444444444445 (^( ",
++ " (^( Ю44444444444444444444444444444444444444444444444444444444444444444444444Ю (^( ",
+ " (^( 1.......................................................................1 (^( ",
+ " (^( 1.......................................................................1 (^( ",
+ " (^( 1.......................................................................1 (^( ",
+@@ -783,10 +819,10 @@
+ " (^( 1.......................1 1...............................1 (^( ",
+ " (^( 1.......................1 1...............................1 (^( ",
+ " (^( 1.......................1 1...............................1 (^( ",
+- " (^( 54444444444441..........1 1...............................1 (^( ",
++ " (^( Ю4444444444441..........1 1...............................1 (^( ",
+ " (^( 1 1..........1 1...............................1 (^( ",
+ " (^( 1 1..........1 1...............................1 (^( ",
+- " (^( 1444444444444444444444445444444444444444544444444444444444444444444444445 (^( ",
++ " (^( 144444444444444444444444Ю444444444444444Ю4444444444444444444444444444444Ю (^( ",
+ " (^( (^( ",
+ " |-w+w-| |-w+w-| ",
+ " wdh,,qw(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((wq,,hdw ",
+@@ -806,7 +842,7 @@
+ "^": [ "t_concrete" ],
+ "1": [ "t_gutter_north" ],
+ "4": [ "t_gutter_west" ],
+- "5": [ "t_gutter_drop" ],
++ "Ю": [ "t_gutter_drop" ],
+ "q": [ "t_floor" ]
+ },
+ "furniture": { "q": [ "f_locker" ] },
+@@ -816,6 +852,682 @@
+ }
+ },
+ {
++ "type": "mapgen",
++ "method": "json",
++ "om_terrain": [
++ [ "prison_island_1_1", "prison_island_1_2", "prison_island_1_3", "prison_island_1_4", "prison_island_1_5" ],
++ [ "prison_island_1_6", "prison_island_1_7", "prison_island_1_8", "prison_island_1_9", "prison_island_1_10" ],
++ [ "prison_island_1_11", "prison_island_1_12", "prison_island_1_13", "prison_island_1_14", "prison_island_1_15" ]
++ ],
++ "object": {
++ "faction_owner": [ { "id": "prisoners", "x": [ 5, 18 ], "y": [ 33, 47 ] }, { "id": "prisoners", "x": [ 5, 18 ], "y": [ 48, 56 ] } ],
++ "fill_ter": "t_region_groundcover_barren",
++ "rows": [
++ "````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
++ "````````````###*********````````````````№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№````````````````````",
++ "```````*****###****#¦***```````````````№№''''''''''''''''''''''''''''''''''''''''''''''''''''''''''№````````````````````",
++ "``******###***##***#****``````````````№№'' |----------| '№№№№№'№````````````````````",
++ "``*####*###***##***#******####```````№№'' |7Б7Б77Б7Б7| '№..>№'№````````````````````",
++ "***########******###******######````№№'' |7Б7Б77Б7Б7| '№...№'№````````````````````",
++ "*#############*###################`№№'' |7ББББББББ7| '№№@№№'№````````````````````",
++ "*№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№'' |----?-----| '''''''№````````````````````",
++ "*№''''''''''''''''''''''''''''''''''' /|,,,,,,,,,,| ' №````````````````````",
++ "*№'№№№№№' |--g--|XXX,,,3333|/ ' №````````````````````",
++ "*№'№>пп№' |-----------------------------|,,,,,|----?-----|--------------------------| ' №````````````````````",
++ "*№'№ппп№' |bo|bo|bo|bo|bo|bo|bo|bo|bo|bo|,,,,,,,,,,,,,,,,|bo|bo|bo|bo|bo|bo|bo|bo|b<| ' №````````````````````",
++ "`№'№№@№№' |b,|b,|b,|b,|b,|b,|b,|b,|b,|b,|,,,,,,,,,,,,,,,,|b,|b,|b,|b,|b,|b,|b,|b,|b,| ' №````````````````````",
++ "`№''''''' |T,|T,|T,|T,|T,|T,|T,|T,|T,|T,|,,,|---@----|,,,|T,|T,|T,|T,|T,|T,|T,|T,|T,| ' №````````````````````",
++ "`№'' |-G|-G|-G|-G|-G|-G|-G|-G|-G|-G|,,,|h...Y.А%|,,,|-G|-G|-G|-G|-G|-G|-G|-G|-G| ' №````````````````````",
++ "`№'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,|dd.....1|,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,| ' №````````````````````",
++ "`№'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,B,,,|.......1|,,,B,,,,,,,,,,,,,,,,,,,,,,,,,,| ' №````````````````````",
++ "`№'' g,,,3333,,,3333,,,3333,,,3333,G,,,|dh.11..6|,,,G,3333,,,3333,,,3333,,,3333g ' №````````````````````",
++ "`№'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,B,,,|d..66...|,,,B,,,,,,,,,,,,,,,,,,,,,,,,,,| ' №````````````````````",
++ "`№'' |,,,,,,,,,,,,,,,,,,,,,,,,,,,,,|,,,|6h..h..6|,,,|,,,,,,,,,,,,,,,,,,,,,,,,,,| ' №````````````````````",
++ "`№'' |-G|-G|-G|-G|-G|-G|-G|-G|-G|-G|,,,|6.....h6|,,,|-G|-G|-G|-G|-G|-G|-G|-G|-G| ' №````````````````````",
++ "`№'' |T,|T,|T,|T,|T,|T,|T,|T,|T,|T,|,,,|--------|,,,|T,|T,|T,|T,|T,|T,|T,|T,|T,| ' №````````````````````",
++ "`№'' |b,|b,|b,|b,|b,|b,|b,|b,|b,|b,|,,,,,,,,,,,,,,,,|b,|b,|b,|b,|b,|b,|b,|b,|b,| ' №````````````````````",
++ "`№'' |bo|bo|bo|bo|bo|bo|bo|bo|bo|bo|,,,,,,,,,,,,,,,,|bo|bo|bo|bo|bo|bo|bo|bo|bo| ' №````````````````````",
++ "`№'' |-----------------------------|,,,,,,,,,,,,,,,,|-----------|--------------| ' №````````````````````",
++ "`№'' B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|------BGGB------|,,,,,,,,,,,|Н,,,,,,?¡¡¡¡¡¿B ' №````````````````````",
++ "`№'' B^E^^^888^^^E^^^^^^^^^^^^^^^^^^|bbT|,,,,,,|Tbb|L,,,P,,P,,,M|dh,,,,н|-?|¡¡¿B ' №````````````````````",
++ "`№'' B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8|o,,G,,,,,,G,,o|,,,,P,,P,,,,|---?---|О,|¡¡¿B ' №````````````````````",
++ "`№'' B^E^^^888^^^E^^^^^^^^^^^^^^^^^8|---|,,3,,,|---|L,,,P,,P,,,M|,,,,,,,|--|-----|-| ' №````````````````````",
++ "`№'' B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^8|bbT|,,3,,,|Tbb|,,,,P,,P,,,,|,,ttt,,|,,+,hgh,=,|/ ' №````````````````````",
++ "`№'' B^E^^^888^^^K^^^^^^^^^^^^^^^^^^|o,,G,,3,,,G,,o|L,,,P,,P,,,M|,,,,,,,|,,|-----|,|---|№№Ĝ№№````````````````````",
++ "`№'' / B^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|---|,,3,,,|---|,,,,,,,,,,,,|333,333|,,+,hgh,=,=,,3| ' №````````````````````",
++ "`№''|-------|------|-------|))_____)_____))|bbT|,,,,,,|Tbb|lll,,,,,NNNN|,,,,,,,|,,|-----|,|,,3| ' №№```````````````````",
++ "`№''|°°°°°°°°°°°°°°|o,,T,,o|_))____)____))_|o,,G,,,,,,G,,o|---|,,,|----|333,333|,,+,hgh,=,|,,3| ' №№ZZZZZZZ!!{!!ZZZZZZ",
++ "`№''|°33333°°33333°|bb,,,bb|__))___)___))__|---|,,,,,,|---|М,ММ,,,,мммм|---?---|@-|-----|-|,,,|''''''№!!!!!!!!!!!!!!!!!Z",
++ "`№''|°uuuuu°°uuuuu°|-o,3,o-|f__)___)___)__f|bbT|,,3,,,|Tbb|М,,,,,,,,,,,|^^^^^^^^^^Ĝ,,,,,,,,,,,g''''''B!!!!!!!!!!!!!!!!!Z",
++ "`№''|°33333°°33333°|bb,3,bb|__))___)___))__|o,,G,,3,,,G,,o|М,ММ,,,,,,,,@^^^^^^^^^^Ĝ,,,,,,,,,,,@''''''Ĝ!!!!!!!!!!!!!!!!!Z",
++ "`№''|°°°°°°°°°°°°°°|-o,3,o-|_))____)____))_|---|,,3,,,|---|М,ММ,,,,,,,,|^^^^^|-gg-|------|,,,,g''''''B!!!!!!!!!!!!!!!!!Z",
++ "`№''|°°°°°°°°°°°°°°|bb,3,bb|))_____)_____))|bbT|,,3,,,|Tbb|М,,,,,,,мммм|^^^^^|hd.6|qd...o|,,,,|''''''№!!!!!!!!!!!!!!!!!Z",
++ "`№''|°33333°°33333°|-o,,,o-|^^^^^^^^^^^^^^^|o,,G,,,,,,G,,o|М,ММ,,,,,,,,|^^^^^|.d.6|hd..h.?,,,,| ' №№ZZZZZZZ!!{!!ZZZZZZ",
++ "`№''|°uuuuu°°uuu°°°|bb,,,bb|^^^^^88888^^^^-|---|-BGGB-|---|---|-?-|мммм|^^^^^@...6|......|,,,,| ' №№```````````````````",
++ "`№''|°33333°°33333°|---G---|--G--|--------|^^^^^^^^^^^^|,X|777|,,,|----|-BĜB-|Y..1|%А.11Y|,,,А| ' №````````````````````",
++ "`№''|°°°°°°°°°°°°°°|^^^^^^^^^^^^^|66666611|^^^^^^^^^^^^|,X|БББ|Л,л|йББи|^^^^^|%...|----|-|-?--|№№Ĝ№№````````````````````",
++ "`№''|°°°°°°°°°°°°°°ПØ^^^^^^^^^^^^|..h..h..|^^^^^^^^^^^^|,X|Б77|Л,л|КБББ=^^^^^|66..|Аd.1|vV...J| ' №````````````````````",
++ "`№''|°°°°°°°°°°°°°°ПØ^^^^^^^^^^^^g........@^^^^^^^^^^^^?,,?Б77|Л,л|----|^^^^^|--|?|hd.1|......g ' №±±±±±±``````````````",
++ "`№''|°°°°°°°°°°°°°°|Ø^^^^^^^^^^^^|.h,.....|^^^^^^^^^^^^|,3|БББ|Л,л|КБББ=^^^|-|А%|'|....|...t,A| ' №`````}``````````````",
++ "`№''|°33333°°°°3u3°|^^^^^^^^^^^^^|ddd66А%Y|^^|---|^^^^^|,3|777|,,,|йББи|^^^|Y...|'|A..A|A..t,A| ' №`````}``````````````",
++ "`№''|°uuuuu°°°°3u3°|^^^^^^^^^^^^^|--------|^^|%dq|^^^^^|--|---|-@-|----|^^^@....|'|A..A|A..t,A| ' №`````}``````````````",
++ "`№''|°33333°°°°3u3°|^^^^^^^^^^^^^^^^^^^^^^^^^|hd,?^^^^^^^^^^^^^^^^^^^^^^^^^|1.d.|'|....?......g ''}!!!!µ±``````````````",
++ "`№''|°°°°°°°°°°°°°°|^^^^^^^^^^^^^^^^^^^^^^^^^|,,,|^^^^^^^^^^^^^^^^^^^^^^^^^|1.dH|'|11.%|qА%ooа| ''¶±±±±±±``````````````",
++ "`№''|-------??-----|ĜĜ|------|-ĜĜ-|---?--|---|,,,|^^^^^^^^^^^^^^^^^^^^^^^^^|o.dƼ|'|----|-|----| ' №````````````````````",
++ "`№'' /|22²²ИИИИ³³©©|''||00000|^^^^|x,,,,y|,s,s,,s|^^^^^^^^^^^^^^^^^^^^^^^^^|----|''''''''|дддД| ' №````````````````````",
++ "`№'' |°°°°°°°°°°°°|''}Ĝ....0|^^^^|x,,,,y|,h,h,,h|^^^^|-@---|^^^^^^^^^^^^^^?....|-?----|'|§¢¢¢| ' №````````````````````",
++ "`№'' g§°°°nnnn°°°°@''||....0|^^^^|,,,,,,|,,,,,,,|^^^^|%...6|^^^^^^^^^^^^^^|....|¢¢¢¢¥¢|'|--?-| ' №````````````````````",
++ "`№'' g§°°°nnnn°°°°|'a||00000|^^^^|DDDWWW|,s,s,,s|^^^^|...h6|^^^^^^^^^^^^^^|ЖЖЖЖ|оЁ£|''''''В ' №````````````````````",
++ "`№'' |°°°°°°°°°°°°|---------|^^^^|-------|h,h,,h|^^^^|А1ddd|----G----|-@--|----|---|--|ГВВВВВВ ' №````````````````````",
++ "`№'' |qqИИeeИИИИSS|b|b|b|b|b|^^^^|АAAAooo|------|-G--|--|gg|bo|,,,|ob|Y..А|S44|%.dq|/ ' №````````````````````",
++ "`№''|--------------|bobobobob|^^^^|,,,,,,,H|b,T|.....|T,b| |b,G,,,G,b|........?..dHg''''''''''''' №````````````````````",
++ "`№''|U|U|U|U|З...dd|,,,,,,,,,|^^^^?,,ddd,,,|b,,G.....G,,b| |,T|,,,|T,|........|....|' |w-|w-|w-|--№````````````````````",
++ "`№''|Г|Г|Г|Г|1....h|T,,3333,,G^^^^|%,,h,,,H|---|.....|---| |--|,,,|--|=-|=-|=-|m.1-|' |CI|CI|CI|Кй№````````````````````",
++ "`№''g..............|,,,,,,,,,|^^^^|--------|b,T|.....|T,b| |bo|,,,|ob|,c|,c|,c|m.З|'' |C.|C.|C.|ББ№````````````````````",
++ "`№''|..........|-@-|,obobobob|^^^^@......d5|b,,G.....G,,b| |b,G,,,G,b|,,|,,|,,|---|' |.h|.h|.h|ББ№````````````````````",
++ "`№''|QQQRRRcccS|/''|9|b|b|b|b|^^^^|-=|Y..dH|---|.....|---| |,T|,,,|T,|bb|bb|bb|/ '' /|.d|.d|.d|Би№````````````````````",
++ "`№''|-------g--|'''|---------|-ĜĜ-|ББ|.....|b,T|.ddd.|T,b| |--|---|--|--------| '|--|+-|+-|+-|=-№````````````````````",
++ "`№'''''''В::::::'''Г'''''''''''''/|йи|11.%q|b,,G.6h..G,,b|''''''''''''''''''''''''''+..............g````````````````````",
++ "`№'№№@№№'В:::::::::В ''' |-----g--|---|-----|---|' №№@№№ |+-|+-|+-|+-|=-№````````````````````",
++ "`№'№...№'В:;;;:::::В ''''''''''''''''''''''''''''' №...№ |.d|.d|.d|.d|БЙ№````````````````````",
++ "`№'№>..№'В:::::::::В '' №..>№ |.h|.h|.h|.h|ББ№````````````````````",
++ "`№'№№№№№'ВВВВВВВВВВВ '' №№№№№ |C.|C.|C.|C.|ББ№````````````````````",
++ "`№''''''''''''''''''''''''''' |CI|CI|CI|CI|Б7№````````````````````",
++ "`№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№g№№g№№g№№g№№№№№````````````````````",
++ "````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
++ ],
++ "palettes": [ "prison_palette" ],
++ "terrain": {
++ " ": [
++ [ "t_region_groundcover_urban", 20 ],
++ [ "t_region_groundcover_barren", 5 ],
++ [ "t_region_shrub", 2 ],
++ [ "t_region_tree", 1 ]
++ ],
++ "-": "t_brick_wall",
++ "|": "t_brick_wall",
++ "№": "t_concrete_wall",
++ ".": [ "t_floor" ],
++ ":": [ "t_region_groundcover_barren" ],
++ "#": [ "t_sand" ],
++ "*": [ "t_region_groundcover_barren" ],
++ ";": [ "t_trunk" ],
++ "/": [ "t_gutter_downspout" ],
++ "<": [ "t_slope_down" ],
++ "¦": [ "t_slope_down" ],
++ "§": [ "t_stairs_down" ],
++ "!": [ "t_dock" ],
++ "¡": [ "t_region_groundcover" ],
++ "¿": [ "t_shrub_rose" ],
++ "µ": [ "t_gates_control_metal" ],
++ "{": [ "t_dock" ],
++ ")": [ "t_pavement_y" ],
++ "}": [ "t_door_metal_locked" ],
++ "`": [ [ "t_water_dp", 20 ], "t_water_sh" ],
++ "^": [ "t_concrete" ],
++ "'": [ "t_concrete" ],
++ "Ø": [ "t_concrete" ],
++ "£": [ "t_thconc_floor" ],
++ "¢": [ "t_thconc_floor" ],
++ "¤": [ "t_thconc_floor" ],
++ "¥": [ "t_thconc_floor" ],
++ "²": [ "t_floor" ],
++ "³": [ "t_floor" ],
++ "©": [ "t_floor" ],
++ "°": [ "t_floor" ],
++ "¶": [ "t_card_industrial" ],
++ "@": [ "t_door_metal_pickable" ],
++ "?": [ "t_door_locked" ],
++ "%": [ "t_floor" ],
++ "±": [ "t_wall_metal" ],
++ "0": [ "t_floor" ],
++ "1": [ "t_floor" ],
++ "2": [ "t_floor" ],
++ "3": [ "t_floor" ],
++ "4": [ "t_floor" ],
++ "5": [ "t_floor" ],
++ "Ƽ": [ "t_floor" ],
++ "6": [ "t_console_broken" ],
++ "7": [ "t_floor" ],
++ "8": [ "t_concrete" ],
++ "9": [ "t_floor" ],
++ "a": [ "t_card_military" ],
++ "A": [ "t_floor" ],
++ "C": [ "t_floor" ],
++ "E": [ "t_concrete" ],
++ "f": [ "t_backboard" ],
++ "Ĝ": [ "t_door_bar_locked" ],
++ "G": [ "t_door_bar_c", "t_door_bar_o" ],
++ "H": [ "t_floor" ],
++ "I": [ "t_floor" ],
++ "J": [ "t_floor" ],
++ "K": [ "t_concrete" ],
++ "L": [ "t_floor" ],
++ "M": [ "t_floor" ],
++ "N": [ "t_floor" ],
++ "P": [ "t_floor" ],
++ "q": [ "t_floor" ],
++ "Q": [ "t_floor" ],
++ "R": [ "t_floor" ],
++ "s": [ "t_floor" ],
++ "u": [ "t_floor" ],
++ "U": [ "t_concrete" ],
++ "v": [ "t_floor" ],
++ "V": [ "t_floor" ],
++ "y": [ "t_floor" ],
++ "Y": [ "t_floor" ],
++ "x": [ "t_floor" ],
++ "X": [ "t_floor" ],
++ "Z": [ "t_fence_rope" ],
++ "А": [ "t_floor" ],
++ "а": [ "t_floor" ],
++ "Б": [ "t_linoleum_white" ],
++ "В": [ "t_chainfence" ],
++ "Г": [ "t_chaingate_l" ],
++ "Д": [ "t_sewage_pump" ],
++ "д": [ "t_sewage_pipe" ],
++ "Е": [ "t_water_pump" ],
++ "Ё": [ "t_thconc_floor" ],
++ "Ж": [ "t_floor" ],
++ "З": [ "t_floor" ],
++ "И": [ "t_floor" ],
++ "и": [ "t_linoleum_white" ],
++ "Й": [ "t_linoleum_white" ],
++ "й": [ "t_linoleum_white" ],
++ "К": [ "t_linoleum_white" ],
++ "Л": [ "t_floor" ],
++ "л": [ "t_floor" ],
++ "М": [ "t_floor" ],
++ "м": [ "t_floor" ],
++ "Н": [ "t_floor" ],
++ "н": [ "t_floor" ],
++ "О": [ "t_floor" ],
++ "о": [ "t_thconc_floor" ],
++ "П": [ "t_door_boarded" ],
++ "п": [ "t_floor" ]
++ },
++ "furniture": {
++ "²": [ "f_cupboard" ],
++ "³": [ "f_cupboard" ],
++ "©": [ "f_cupboard" ],
++ "<": [ "f_bookcase" ],
++ "{": [ "f_bitts" ],
++ "%": [ "f_air_conditioner" ],
++ "*": [ "f_boulder_large" ],
++ "Ø": [ "f_dumpster" ],
++ "0": [ "f_locker" ],
++ "1": [ "f_filing_cabinet" ],
++ "2": [ "f_cupboard" ],
++ "3": [ "f_metal_bench" ],
++ "4": [ "f_glass_fridge" ],
++ "5": [ "f_safe_l" ],
++ "Ƽ": [ "f_safe_l" ],
++ "7": [ "f_shower" ],
++ "8": [ "f_metal_bench" ],
++ "9": [ "f_dumpster" ],
++ "A": [ "f_sofa" ],
++ "C": [ "f_bed" ],
++ "H": [ "f_armchair" ],
++ "I": [ "f_dresser" ],
++ "J": [ "f_pinball_machine" ],
++ "K": [ "f_floor_canvas" ],
++ "L": [ "f_drill_press" ],
++ "M": [ "f_heavy_lathe" ],
++ "N": [ "f_utility_shelf" ],
++ "P": [ "f_workbench" ],
++ "q": [ "f_trashcan" ],
++ "Q": [ "f_cupboard" ],
++ "R": [ "f_locker" ],
++ "s": [ "f_desk" ],
++ "u": [ "f_table" ],
++ "U": [ "f_fiber_mat" ],
++ "x": [ "f_clothing_rail" ],
++ "X": [ "f_rack_coat" ],
++ "y": [ "f_locker" ],
++ "Y": [ "f_rack_coat" ],
++ "А": [ "f_speaker_cabinet" ],
++ "а": [ "f_fridge" ],
++ "Ж": [ "f_locker" ],
++ "З": [ "f_bookcase" ],
++ "И": [ "f_counter" ],
++ "и": [ "f_sink" ],
++ "Й": [ "f_rack_coat" ],
++ "й": [ "f_toilet" ],
++ "К": [ "f_trashcan" ],
++ "Л": [ "f_utility_shelf" ],
++ "л": [ "f_rack_coat" ],
++ "М": [ "f_crate_c" ],
++ "м": [ "f_crate_c" ],
++ "Н": [ "f_bookcase" ],
++ "н": [ "f_wardrobe" ],
++ "О": [ "f_locker" ],
++ "о": [ "f_locker" ],
++ "п": [ "f_bookcase" ]
++ },
++ "toilets": { "й": { } },
++ "place_item": [
++ { "item": "stethoscope", "x": 82, "y": 56, "chance": 100 },
++ { "item": "basketball", "x": [ 29, 41 ], "y": [ 32, 38 ], "chance": 100, "repeat": [ 1, 2 ] },
++ { "item": "baseball", "x": [ 28, 42 ], "y": [ 25, 28 ], "chance": 100, "repeat": [ 1, 3 ] },
++ { "item": "holy_symbol", "x": 74, "y": 29, "chance": 90 },
++ { "item": "holybook_bible1", "x": 75, "y": 29, "chance": 90 },
++ { "item": "icon", "x": 76, "y": 29, "chance": 90 },
++ { "item": "pliers", "x": 81, "y": 54, "chance": 100 },
++ { "item": "hammer", "x": 59, "y": 32, "chance": 100 },
++ { "item": "id_industrial", "x": 42, "y": 61, "chance": 100 },
++ { "item": "id_military", "x": 79, "y": 50, "chance": 100 },
++ { "item": "holster", "x": 79, "y": 50, "chance": 100 },
++ { "item": "m9", "x": 79, "y": 50, "chance": 100 },
++ { "item": "m9mag", "x": 79, "y": 50, "chance": 100 },
++ { "item": "9mm", "x": 79, "y": 50, "chance": 100 }
++ ],
++ "item": { "н": { "item": "cassock", "chance": 95 } },
++ "place_items": [
++ { "item": "table_destruction", "x": 16, "y": 40, "chance": 100 },
++ { "item": "table_destruction", "x": 17, "y": 40, "chance": 100 }
++ ],
++ "items": {
++ "²": { "item": "SUS_knife_drawer", "chance": 80 },
++ "³": { "item": "SUS_cookware", "chance": 80 },
++ "©": { "item": "SUS_spice_collection", "chance": 80 },
++ "Ø": { "item": "trash_cart", "chance": 50, "repeat": [ 2, 3 ] },
++ "c": { "item": "animalshelter_utility", "chance": 45, "repeat": [ 2, 3 ] },
++ "C": { "item": "bed", "chance": 70 },
++ "I": [ { "item": "cop_torso", "chance": 33 }, { "item": "cop_pants", "chance": 33 }, { "item": "cop_shoes", "chance": 33 } ],
++ "l": [ { "item": "hand_tools", "chance": 50 }, { "item": "tools_carpentry", "chance": 50 } ],
++ "m": [ { "item": "drugs_rare", "chance": 80, "repeat": [ 1, 2 ] } ],
++ "N": [ { "item": "hand_tools", "chance": 50 }, { "item": "tools_carpentry", "chance": 50 } ],
++ "n": { "item": "SUS_oven", "chance": 70 },
++ "q": { "item": "trash_cart", "chance": 50, "repeat": [ 2, 3 ] },
++ "Q": { "item": "prison_canine_food", "chance": 70, "repeat": [ 3, 5 ] },
++ "R": [
++ { "item": "animalshelter_softdrug", "chance": 70, "repeat": [ 1, 2 ] },
++ { "item": "animalshelter_hardrug", "chance": 30, "repeat": [ 1, 2 ] }
++ ],
++ "u": { "item": "mil_base_mess_hall", "chance": 30 },
++ "U": { "item": "prison_canine_bowl", "chance": 70 },
++ "x": [ { "item": "prison_textile", "chance": 90, "repeat": [ 1, 5 ] } ],
++ "Y": { "item": "clothing_outdoor_torso", "chance": 60 },
++ ":": { "item": "animalshelter_toys", "chance": 5 },
++ "0": [
++ { "item": "prison_weapons", "chance": 50, "repeat": [ 1, 3 ] },
++ { "item": "prison_armor", "chance": 50, "repeat": [ 1, 3 ] }
++ ],
++ "1": { "item": "SUS_office_filing_cabinet", "chance": 50 },
++ "2": { "item": "SUS_utensils", "chance": 80 },
++ "4": [ { "item": "softdrugs", "chance": 50 }, { "item": "harddrugs", "chance": 50 } ],
++ "5": { "item": "alcohol_bottled_canned", "chance": 95, "repeat": [ 1, 3 ] },
++ "9": { "item": "trash_cart", "chance": 50, "repeat": [ 2, 3 ] },
++ "а": { "item": "SUS_fridge_breakroom", "chance": 65 },
++ "Ж": { "item": "SUS_janitors_closet", "chance": 95 },
++ "З": { "item": "doctors_books", "chance": 75, "repeat": [ 1, 2 ] },
++ "Л": { "item": "prison_workshop_safety", "chance": 75 },
++ "л": { "item": "prison_jumpsuit", "chance": 75 },
++ "М": { "item": "wood_workshop", "chance": 75 },
++ "м": { "item": "supplies_metal", "chance": 75 },
++ "Н": { "item": "religious_books", "chance": 90, "repeat": [ 1, 3 ] },
++ "О": [
++ { "item": "tools_earthworking", "chance": 90, "repeat": [ 1, 2 ] },
++ { "item": "farming_tools", "chance": 90, "repeat": [ 1, 2 ] },
++ { "item": "hazmat_boots", "chance": 90 }
++ ],
++ "о": { "item": "tools_electronics", "chance": 90, "repeat": [ 1, 2 ] }
++ },
++ "vendingmachines": { "v": { "item_group": "vending_drink" }, "V": { "item_group": "vending_food" } },
++ "monster": {
++ ",": [
++ { "monster": "mon_zombie_prisoner", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_fat", "chance": 2 },
++ { "monster": "mon_zombie_prisoner_tough", "chance": 2 }
++ ],
++ ".": { "monster": "mon_zombie_cop", "chance": 1 },
++ "¢": { "monster": "mon_zombie_technician", "chance": 20 },
++ "^": { "monster": "mon_zombie_prisoner_brute", "chance": 1 },
++ "`": { "monster": "mon_zhark", "chance": 1 },
++ ":": { "monster": "mon_dog_gshepherd", "chance": 1 },
++ "U": { "monster": "mon_dog_gshepherd", "chance": 10 },
++ "'": [ { "monster": "mon_dog_zombie_cop", "chance": 1 }, { "monster": "mon_zombie_cop", "chance": 1 } ]
++ },
++ "place_monster": [
++ { "monster": "mon_zombie_brute_shocker", "x": 65, "y": 36, "name": "The Foreman" },
++ { "monster": "mon_zombie_master", "x": 40, "y": 63, "name": "The Warden" },
++ { "monster": "mon_zombie_kevlar_2", "x": 77, "y": 48, "name": "The Chief" },
++ { "monster": "mon_zombie_scientist", "x": 81, "y": 58, "name": "The Doctor" },
++ { "monster": "mon_zombie_necro", "x": 75, "y": 28, "name": "The Priest" },
++ { "monster": "mon_zombie_prisoner_brute", "x": 50, "y": 33, "name": "The Bully" }
++ ],
++ "place_npcs": [
++ { "class": "prisoner_generic", "x": 17, "y": 53 },
++ { "class": "prisoner_greeter", "x": 17, "y": 43 },
++ { "class": "prisoner_generic", "x": 15, "y": 41 },
++ { "class": "prisoner_generic", "x": 10, "y": 41 },
++ { "class": "prisoner_generic", "x": 8, "y": 41 },
++ { "class": "prisoner_generic", "x": 9, "y": 53 },
++ { "class": "prisoner_generic", "x": 17, "y": 47 }
++ ],
++ "place_zones": [
++ { "type": "NPC_INVESTIGATE_ONLY", "faction": "prisoners", "x": [ 5, 18 ], "y": [ 33, 47 ] },
++ { "type": "NPC_INVESTIGATE_ONLY", "faction": "prisoners", "x": [ 5, 18 ], "y": [ 48, 56 ] }
++ ],
++ "nested": {
++ "^": { "chunks": [ [ "corpse_blood_3x3", 5 ], [ "null", 95 ] ] },
++ ".": { "chunks": [ [ "corpse_blood_3x3", 5 ], [ "null", 95 ] ] },
++ ",": { "chunks": [ [ "corpse_blood_3x3", 5 ], [ "null", 95 ] ] },
++ "'": { "chunks": [ [ "corpse_blood_3x3", 5 ], [ "null", 95 ] ] },
++ "Б": { "chunks": [ [ "corpse_blood_3x3", 5 ], [ "null", 95 ] ] }
++ },
++ "place_vehicles": [ { "vehicle": "boat_motor_single", "x": 100, "y": 45, "chance": 100, "status": 0 } ]
++ }
++ },
++ {
++ "type": "mapgen",
++ "method": "json",
++ "om_terrain": [
++ [
++ "prison_island_1_2f_1",
++ "prison_island_1_2f_2",
++ "prison_island_1_2f_3",
++ "prison_island_1_2f_4",
++ "prison_island_1_2f_5"
++ ],
++ [
++ "prison_island_1_2f_6",
++ "prison_island_1_2f_7",
++ "prison_island_1_2f_8",
++ "prison_island_1_2f_9",
++ "prison_island_1_2f_10"
++ ],
++ [
++ "prison_island_1_2f_11",
++ "prison_island_1_2f_12",
++ "prison_island_1_2f_13",
++ "prison_island_1_2f_14",
++ "prison_island_1_2f_15"
++ ]
++ ],
++ "object": {
++ "rows": [
++ " ",
++ " №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ",
++ " №№ № ",
++ " №№ |----------| 14w41 № ",
++ " №№ |..........| wd,<1 № ",
++ " №№ |..........| wdh,1 № ",
++ " №№ |..........| 14w41 № ",
++ " №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ |..........| № ",
++ " № |..........| № ",
++ " № 14w41 |-----Ю..........| № ",
++ " № 1<,dw |-----------------------------|................Ю--------------------------| № ",
++ " № 1,hdw |.........................................................................| № ",
++ " № 14w41 |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |.........................................................................| № ",
++ " № |-----------------------------|....................................|------| № ",
++ " № |-...................................| № ",
++ " № |...................................|--| № ",
++ " № |......................................| № ",
++ " № |......................................|-------| № ",
++ " № |..............................................| № ",
++ " № |..............................................Ю---| № ",
++ " № |..................................................| № ",
++ " № |---Ю------------------| |..................................................| №№ ",
++ " № |......................| |..................................................| №№ ",
++ " № |......................| |...........................|----------|...........| № ",
++ " № |......................| |...........................| |...........| № ",
++ " № |......................| |...........................| |...........| № ",
++ " № |......................| |...........................| |----|...........| № ",
++ " № |......................| |...........................| |................| № ",
++ " № |......................| |...........................| |................| №№ ",
++ " № |......................| -|-----------|...............| |................| №№ ",
++ " № |..............|-------| |--------| |...............| |................| № ",
++ " № |..............| |........| |...............| |................| № ",
++ " № |..............| |........| |...............| |................| № ",
++ " № |..............| |........| |...............| |..|-|...........| № ",
++ " № |..............| |........| |...............| |-|..| |...........| №..... ",
++ " № |..............| |........| |---| |...............| |....| |...........| №..... ",
++ " № |..............| |--------| |...| |---------------| |....| |...........| №..... ",
++ " № |..............| |...| |....| |...........| №..... ",
++ " № |..............| |...| |....| |...........| № ",
++ " № |-Ю............|---------| |----------|...| |....| |------|....| № ",
++ " № |......................| |..............| |....| |....| № ",
++ " № |......................| |..............| |-----| |....|------| |....| № ",
++ " № |......................| |..............| |.....| |...........| |----| № ",
++ " № |......................| |..............| |.....| |...........| № ",
++ " № |......................| |..............| |.....|--------------|........Ю--| № ",
++ " № |......................| |..............|----|..|--|.......................| № ",
++ " № |-|......................| |......................| |.......................| № ",
++ " № |........................| |......................| |.......................| |----------|№ ",
++ " № |........................| |......................| |......................-| |..........|№ ",
++ " № |........................| |......................| |......................| |..........|№ ",
++ " № |..........|---|.........| |......................| |..................Ю---| |..........|№ ",
++ " № |..........| |.........| |......................| |..................| |..........|№ ",
++ " № |----------| |---------| |......................| |------------------| |--Ю..........|№ ",
++ " № |......................| |.............|№ ",
++ " № 14w41 Ю----------------------| 14w41 |.............|№ ",
++ " № 1,hdw wdh,1 |.............|№ ",
++ " № 1<,dw wd,<1 |.............|№ ",
++ " № 14w41 44w41 |.............|№ ",
++ " № |-------------|№ ",
++ " №№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№№ ",
++ " "
++ ],
++ "palettes": [ "prison_palette" ],
++ "terrain": {
++ " ": [ "t_open_air" ],
++ ".": [ "t_flat_roof" ],
++ "№": "t_concrete_wall",
++ "1": "t_brick_wall",
++ "4": "t_brick_wall",
++ "|": [ "t_gutter_north" ],
++ "-": [ "t_gutter_west" ],
++ "w": [ "t_metal_grate_window_noglass" ],
++ "Ю": [ "t_gutter_drop" ]
++ },
++ "item": { ".": { "item": "feces_bird", "chance": 2 } }
++ }
++ },
++ {
++ "type": "mapgen",
++ "method": "json",
++ "om_terrain": [
++ [
++ "prison_island_1_ug_1",
++ "prison_island_1_ug_2",
++ "prison_island_1_ug_3",
++ "prison_island_1_ug_4",
++ "prison_island_1_ug_5"
++ ],
++ [
++ "prison_island_1_ug_6",
++ "prison_island_1_ug_7",
++ "prison_island_1_ug_8",
++ "prison_island_1_ug_9",
++ "prison_island_1_ug_10"
++ ],
++ [
++ "prison_island_1_ug_11",
++ "prison_island_1_ug_12",
++ "prison_island_1_ug_13",
++ "prison_island_1_ug_14",
++ "prison_island_1_ug_15"
++ ]
++ ],
++ "object": {
++ "faction_owner": [ { "id": "prisoners", "x": [ 8, 23 ], "y": [ 50, 57 ] } ],
++ "rows": [
++ " ",
++ " ",
++ " @ ",
++ " ` |----------| ",
++ " ```````` |~~~~~~~~~~| ",
++ " ` |---|~|----| ",
++ " ``````` |~| ",
++ " ` |---|~|----| ",
++ " ``` |~~~~~~~~~~| ",
++ " ` |---|~|----| ",
++ " ` |~| ",
++ " ` |~| ",
++ " `` |---------------------------------------|~|-------------------------------| ",
++ " `` |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~@| ",
++ " ` |---------------------------------------|~|-------------------------------| ",
++ " `` |~| ",
++ " ` |~| ",
++ " ` |~| ",
++ " ` |~| ",
++ " ` |~| ",
++ " ` |---------------------------------------|~|-------------------------------| ",
++ " `` |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ",
++ " ``` |--------------------------------|~|-------------------|~|----------------| ",
++ " `` |~| |~| ",
++ " ` ^^^^^^ |~| |~| ",
++ " `` ^ ^^^^' |~| |~| ",
++ " ` ^ ' |~| |~| ",
++ " ``` ^ ' |~| |~| ",
++ " `` ^^^^^^^^^ ' |~| |~| ",
++ " ` ^ ^ ' |~| |~| ",
++ " ` ^ ^ '' |~| |~| ",
++ " ` ^ ' |~| |~| ",
++ " ` ^^^^ '' |~| |~| ",
++ " `` ^^^^^^^ ' |~| |~| ",
++ " ` ^^^ ^^^^^^^^ '' |~| |~| ",
++ " ` ^^^ ^^ ^ ' |~| |~| ",
++ " `` ^^^ ^^ ^ ' |~| |~| ",
++ " ` ^^^ ^ ' |~| |~| ",
++ " ` ^^^ ^ ' |~| |~| ",
++ " ` ^^^ ^^ ' |~| |~| ",
++ " ` ^^^````` ^^ '' |~| |-| |~| ",
++ " ` ````` '' |~| |~| |~| ",
++ " ``````````` '' |~|-----------|~|-----|~| ",
++ " ' |~~~~~~~~~~~~~~~~~~~~~~~| ",
++ " '' |~|-----------|~|-----|~| ",
++ " '' |~| |~| |~| ",
++ " ' |~| |~| |~| ",
++ " ' |~| |-| |~| ",
++ " ' |~| |~| ",
++ " !!!!!!!!!!!!!!!!! '''' |~| |~| |----| ",
++ " !1.2!3.4!5.6!7.8! ' |------------|~|--------------------~|-------------------|____| ",
++ " !1:2!3:4!5:6!7:8! ' |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~д___| ",
++ " !!!!?!!!?!!!?!!!?!! '' |~|---|~|----|~|-------------------|~|-----------------|~|>___| ",
++ " !>.d..:.......:...! ''' |~| ||~|| |~| |~| |~|----| ",
++ " !>.h..:.......:...! ' |~| |~~~| |~| |~| |~| ",
++ " !!!!?!!!?!!!?!!!?!! |--/---~| |---| |~| |~| |~| ",
++ " !9:9!0:A!B:C!D:D! |~~~~~~~| |~| |~| |~| ",
++ " !9.9!0.A!B.C!D.D! |-------| |~| |~| |~| ",
++ " !!!!!!!!!!!!!!!!! |~| |~| |~| ",
++ " |~| |~| |~| ",
++ " |~| |~| |~| ",
++ " |~| |~| |~| ",
++ " |-------------------------------|~|-------------------|~|-----------------|~|---------| ",
++ " |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~| ",
++ " |-----------------------------------------------------------------------------------|~| ",
++ " |~| ",
++ " |~| ",
++ " |~| ",
++ " |~| ",
++ " |~| ",
++ " |-| ",
++ " "
++ ],
++ "palettes": [ "prison_palette" ],
++ "terrain": {
++ " ": [ "t_rock" ],
++ "^": [ "t_rock_floor" ],
++ "_": [ "t_grate" ],
++ "~": [ "t_sewage" ],
++ "'": [ "t_water_sh_murky_underground" ],
++ "`": [ "t_swater_dp_underground" ],
++ "|": [ "t_brick_wall" ],
++ "-": [ "t_brick_wall" ],
++ "/": [ "t_brick_wall_halfway" ],
++ ">": [ "t_stairs_up" ],
++ "@": [ "t_slope_up" ],
++ ".": [ "t_thconc_floor" ],
++ ":": [ "t_thconc_floor_olight" ],
++ "!": [ "t_concrete_wall" ],
++ "?": [ "t_door_bar_locked" ],
++ "1": [ "t_thconc_floor" ],
++ "2": [ "t_thconc_floor" ],
++ "3": [ "t_thconc_floor" ],
++ "4": [ "t_thconc_floor" ],
++ "5": [ "t_thconc_floor" ],
++ "6": [ "t_thconc_floor" ],
++ "7": [ "t_thconc_floor" ],
++ "8": [ "t_thconc_floor" ],
++ "9": [ "t_thconc_floor" ],
++ "0": [ "t_thconc_floor" ],
++ "A": [ "t_thconc_floor" ],
++ "B": [ "t_thconc_floor" ],
++ "C": [ "t_thconc_floor" ],
++ "D": [ "t_thconc_floor" ],
++ "d": [ "t_thconc_floor" ],
++ "h": [ "t_thconc_floor" ],
++ "д": [ "t_sewage_pipe" ]
++ },
++ "furniture": {
++ "1": "f_crate_o",
++ "2": "f_crate_o",
++ "3": "f_crate_o",
++ "4": "f_crate_o",
++ "5": "f_crate_o",
++ "6": "f_crate_o",
++ "7": "f_crate_o",
++ "8": "f_crate_o",
++ "9": "f_utility_shelf",
++ "0": "f_utility_shelf",
++ "A": "f_utility_shelf",
++ "B": "f_utility_shelf",
++ "C": "f_utility_shelf",
++ "D": "f_fridge"
++ },
++ "item": {
++ "1": { "item": "carrot", "chance": 95, "repeat": [ 1, 20 ] },
++ "2": { "item": "potato", "chance": 95, "repeat": [ 1, 20 ] },
++ "3": { "item": "onion", "chance": 95, "repeat": [ 1, 20 ] },
++ "4": { "item": "cabbage", "chance": 95, "repeat": [ 1, 20 ] },
++ "5": { "item": "corn", "chance": 95, "repeat": [ 1, 20 ] },
++ "6": { "item": "garlic", "chance": 95, "repeat": [ 1, 10 ] },
++ "7": { "item": "apple", "chance": 95, "repeat": [ 1, 20 ] },
++ "8": { "item": "lemon", "chance": 95, "repeat": [ 1, 10 ] }
++ },
++ "items": {
++ "9": { "item": "SUS_pantry", "chance": 95 },
++ "0": { "item": "teabag_box", "chance": 95, "repeat": [ 1, 20 ] },
++ "A": { "item": "groce_ingredient", "chance": 95, "repeat": [ 1, 20 ] },
++ "B": { "item": "groce_bread", "chance": 95, "repeat": [ 1, 20 ] },
++ "C": { "item": "groce_cereal", "chance": 95, "repeat": [ 1, 20 ] },
++ "D": { "item": "butcher_raw_meat", "chance": 95, "repeat": [ 1, 20 ] },
++ "d": { "item": "magazines", "chance": 50 }
++ },
++ "monster": { "~": { "monster": "mon_sewer_fish", "chance": 2 }, "'": { "monster": "mon_sewer_snake", "chance": 10 } },
++ "place_npcs": [
++ { "class": "prisoner_leader", "x": 9, "y": 54 },
++ { "class": "prisoner_generic", "x": 14, "y": 53 },
++ { "class": "prisoner_generic", "x": 18, "y": 54 },
++ { "class": "prisoner_generic", "x": 22, "y": 53 }
++ ]
++ }
++ },
++ {
++ "id": "table_destruction",
++ "type": "item_group",
++ "subtype": "collection",
++ "items": [
++ { "item": "2x4", "count": [ 2, 4 ] },
++ { "item": "wood_panel", "count": [ 0, 1 ] },
++ { "item": "nail", "charges": [ 4, 8 ] },
++ { "item": "splinter", "count": 1 }
++ ]
++ },
++ {
+ "id": "prison_canine_food",
+ "type": "item_group",
+ "items": [ { "item": "dogfood", "prob": 100, "container-item": "can_medium" } ]
+@@ -839,5 +1552,63 @@
+ [ "jerky", 40 ],
+ [ "rope_6", 15 ]
+ ]
++ },
++ {
++ "type": "item_group",
++ "id": "prison_workshop_safety",
++ "subtype": "collection",
++ "items": [
++ { "item": "mask_dust", "prob": 75, "damage": [ 1, 4 ] },
++ { "item": "gloves_work", "prob": 75, "damage": [ 1, 4 ] },
++ { "item": "glasses_safety", "prob": 75, "damage": [ 1, 4 ] }
++ ]
++ },
++ {
++ "id": "prison_jumpsuit",
++ "type": "item_group",
++ "items": [ { "item": "jumpsuit", "prob": 75, "damage": [ 1, 4 ] } ]
++ },
++ {
++ "type": "item_group",
++ "id": "prisoner_or_cop_clothes",
++ "subtype": "collection",
++ "entries": [
++ { "group": "male_underwear", "damage": [ 1, 4 ] },
++ {
++ "distribution": [
++ {
++ "collection": [
++ { "item": "striped_shirt", "damage": [ 1, 4 ] },
++ { "item": "striped_pants", "damage": [ 1, 4 ] },
++ { "group": "clothing_prisoner_shoes", "damage": [ 1, 4 ], "prob": 20 },
++ { "item": "bandana", "damage": [ 1, 4 ] }
++ ]
++ },
++ {
++ "collection": [
++ { "group": "cop_pants", "damage": [ 1, 4 ] },
++ { "group": "cop_shoes", "damage": [ 1, 4 ], "prob": 20 },
++ { "group": "cop_torso", "damage": [ 1, 4 ] },
++ { "group": "clothing_watch", "prob": 20 },
++ { "item": "police_belt", "damage": [ 1, 4 ], "prob": 20 }
++ ]
++ }
++ ],
++ "prob": 90
++ },
++ { "group": "socks_unisex", "damage": [ 1, 4 ] },
++ { "group": "clothing_glasses", "prob": 20 },
++ { "item": "corpse_generic_human", "damage": 4 }
++ ]
++ },
++ {
++ "type": "mapgen",
++ "method": "json",
++ "nested_mapgen_id": "corpse_blood_3x3",
++ "object": {
++ "mapgensize": [ 3, 3 ],
++ "place_items": [ { "item": "prisoner_or_cop_clothes", "x": 0, "y": 0, "chance": 30 } ],
++ "place_fields": [ { "field": "fd_blood", "x": [ 0, 2 ], "y": [ 0, 2 ], "intensity": 1, "age": 10 } ]
++ }
+ }
+ ]
+--- a/data/json/itemgroups/Weapons_Mods_Ammo/guns.json
++++ b/data/json/itemgroups/Weapons_Mods_Ammo/guns.json
+@@ -733,31 +743,39 @@
+ },
+ {
+ "type": "item_group",
+- "id": "guns_cop",
+- "//": "Police issue weapons of all types",
++ "id": "longguns_cop",
+ "items": [
+- { "item": "ar15", "prob": 15, "charges-min": 0, "charges-max": 30 },
+- { "item": "cx4", "prob": 20, "charges-min": 0, "charges-max": 15 },
+- { "item": "fn57", "prob": 20, "charges-min": 0, "charges-max": 20 },
+- { "item": "fn_p90", "prob": 5, "charges-min": 0, "charges-max": 50 },
+- { "item": "glock_19", "prob": 15, "charges-min": 0, "charges-max": 15 },
+- { "item": "glock_22", "prob": 20, "charges-min": 0, "charges-max": 15 },
+- { "item": "hk_mp5", "prob": 10, "charges-min": 0, "charges-max": 30 },
+- { "item": "m9", "prob": 5, "charges-min": 0, "charges-max": 15 },
+- { "item": "mossberg_500", "prob": 15, "charges-min": 0, "charges-max": 8 },
+- { "item": "remington_700", "prob": 5, "charges-min": 0, "charges-max": 4 },
+- { "item": "remington_870", "prob": 20, "charges-min": 0, "charges-max": 6 },
+- { "item": "sig_40", "prob": 20, "charges-min": 0, "charges-max": 12 },
+- { "item": "usp_45", "prob": 10, "charges-min": 0, "charges-max": 12 },
+- { "item": "usp_9mm", "prob": 10, "charges-min": 0, "charges-max": 15 },
+- { "item": "kp32", "prob": 1, "charges-min": 0, "charges-max": 7 },
+- { "item": "kp3at", "prob": 2, "charges-min": 0, "charges-max": 6 },
+- { "item": "rugerlcp", "prob": 2, "charges-min": 0, "charges-max": 6 },
+- { "item": "kpf9", "prob": 3, "charges-min": 0, "charges-max": 7 }
++ { "item": "ar15", "prob": 20, "charges": [ 0, 30 ] },
++ { "item": "mossberg_500", "prob": 10, "charges": [ 0, 6 ] },
++ { "item": "remington_700", "prob": 5, "charges": [ 0, 4 ] },
++ { "item": "remington_870", "prob": 10, "charges": [ 0, 5 ] }
+ ]
+ },
+ {
+ "type": "item_group",
++ "id": "sidearms_cop",
++ "items": [
++ { "item": "fn57", "prob": 20, "charges": [ 0, 20 ] },
++ { "item": "glock_19", "prob": 15, "charges": [ 0, 15 ] },
++ { "item": "glock_22", "prob": 20, "charges": [ 0, 15 ] },
++ { "item": "m9", "prob": 5, "charges": [ 0, 15 ] },
++ { "item": "sig_40", "prob": 20, "charges": [ 0, 12 ] },
++ { "item": "usp_45", "prob": 10, "charges": [ 0, 12 ] },
++ { "item": "usp_9mm", "prob": 10, "charges": [ 0, 15 ] },
++ { "item": "kp32", "prob": 1, "charges": [ 0, 7 ] },
++ { "item": "kp3at", "prob": 2, "charges": [ 0, 6 ] },
++ { "item": "rugerlcp", "prob": 2, "charges": [ 0, 6 ] },
++ { "item": "kpf9", "prob": 3, "charges": [ 0, 7 ] }
++ ]
++ },
++ {
++ "type": "item_group",
++ "id": "guns_cop",
++ "//": "Police issue weapons of all types",
++ "items": [ { "group": "longguns_cop", "prob": 50 }, { "group": "sidearms_cop", "prob": 50 } ]
++ },
++ {
++ "type": "item_group",
+ "id": "guns_swat",
+ "//": "Guns issued to paramilitary forces in addition to standard police issue.",
+ "items": [
+--- a/data/json/overmap/overmap_special/specials.json
++++ b/data/json/overmap/overmap_special/specials.json
+@@ -948,6 +982,67 @@
+ },
+ {
+ "type": "overmap_special",
++ "id": "Island prison",
++ "overmaps": [
++ { "point": [ -1, -1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 0, -1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 1, -1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 2, -1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 3, -1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 4, -1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 5, -1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 5, 0, 0 ], "overmap": "lake_surface" },
++ { "point": [ 5, 1, 0 ], "overmap": "lake_surface" },
++ { "point": [ 5, 2, 0 ], "overmap": "lake_surface" },
++ { "point": [ 5, 3, 0 ], "overmap": "lake_surface" },
++ { "point": [ 4, 3, 0 ], "overmap": "lake_surface" },
++ { "point": [ 3, 3, 0 ], "overmap": "lake_surface" },
++ { "point": [ 2, 3, 0 ], "overmap": "lake_surface" },
++ { "point": [ 1, 3, 0 ], "overmap": "lake_surface" },
++ { "point": [ 0, 3, 0 ], "overmap": "lake_surface" },
++ { "point": [ -1, 3, 0 ], "overmap": "lake_surface" },
++ { "point": [ -1, 2, 0 ], "overmap": "lake_surface" },
++ { "point": [ -1, 1, 0 ], "overmap": "lake_surface" },
++ { "point": [ -1, 0, 0 ], "overmap": "lake_surface" },
++ { "point": [ 0, 0, 0 ], "overmap": "prison_island_1_1_north" },
++ { "point": [ 1, 0, 0 ], "overmap": "prison_island_1_2_north" },
++ { "point": [ 2, 0, 0 ], "overmap": "prison_island_1_3_north" },
++ { "point": [ 3, 0, 0 ], "overmap": "prison_island_1_4_north" },
++ { "point": [ 4, 0, 0 ], "overmap": "prison_island_1_5_north" },
++ { "point": [ 0, 1, 0 ], "overmap": "prison_island_1_6_north" },
++ { "point": [ 1, 1, 0 ], "overmap": "prison_island_1_7_north" },
++ { "point": [ 2, 1, 0 ], "overmap": "prison_island_1_8_north" },
++ { "point": [ 3, 1, 0 ], "overmap": "prison_island_1_9_north" },
++ { "point": [ 4, 1, 0 ], "overmap": "prison_island_1_10_north" },
++ { "point": [ 0, 2, 0 ], "overmap": "prison_island_1_11_north" },
++ { "point": [ 1, 2, 0 ], "overmap": "prison_island_1_12_north" },
++ { "point": [ 2, 2, 0 ], "overmap": "prison_island_1_13_north" },
++ { "point": [ 3, 2, 0 ], "overmap": "prison_island_1_14_north" },
++ { "point": [ 4, 2, 0 ], "overmap": "prison_island_1_15_north" },
++ { "point": [ 0, 0, 1 ], "overmap": "prison_island_1_2f_1_north" },
++ { "point": [ 1, 0, 1 ], "overmap": "prison_island_1_2f_2_north" },
++ { "point": [ 2, 0, 1 ], "overmap": "prison_island_1_2f_3_north" },
++ { "point": [ 3, 0, 1 ], "overmap": "prison_island_1_2f_4_north" },
++ { "point": [ 4, 0, 1 ], "overmap": "prison_island_1_2f_5_north" },
++ { "point": [ 0, 1, 1 ], "overmap": "prison_island_1_2f_6_north" },
++ { "point": [ 1, 1, 1 ], "overmap": "prison_island_1_2f_7_north" },
++ { "point": [ 2, 1, 1 ], "overmap": "prison_island_1_2f_8_north" },
++ { "point": [ 3, 1, 1 ], "overmap": "prison_island_1_2f_9_north" },
++ { "point": [ 4, 1, 1 ], "overmap": "prison_island_1_2f_10_north" },
++ { "point": [ 0, 2, 1 ], "overmap": "prison_island_1_2f_11_north" },
++ { "point": [ 1, 2, 1 ], "overmap": "prison_island_1_2f_12_north" },
++ { "point": [ 2, 2, 1 ], "overmap": "prison_island_1_2f_13_north" },
++ { "point": [ 3, 2, 1 ], "overmap": "prison_island_1_2f_14_north" },
++ { "point": [ 4, 2, 1 ], "overmap": "prison_island_1_2f_15_north" }
++ ],
++ "locations": [ "lake_surface" ],
++ "city_distance": [ 3, -1 ],
++ "city_sizes": [ 4, 12 ],
++ "occurrences": [ 50, 100 ],
++ "flags": [ "CLASSIC", "LAKE", "UNIQUE" ]
++ },
++ {
++ "type": "overmap_special",
+ "id": "Prison Hidden Lab",
+ "overmaps": [
+ { "point": [ 0, -1, 0 ], "overmap": "road_end_north" },
+--- a/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json
++++ b/data/json/overmap/overmap_terrain/overmap_terrain_public_institutional.json
+@@ -256,7 +285,52 @@
+ "prison_alcatraz_12_2f",
+ "prison_alcatraz_13_2f",
+ "prison_alcatraz_14_2f",
+- "prison_alcatraz_15_2f"
++ "prison_alcatraz_15_2f",
++ "prison_island_1_1",
++ "prison_island_1_2",
++ "prison_island_1_3",
++ "prison_island_1_4",
++ "prison_island_1_5",
++ "prison_island_1_6",
++ "prison_island_1_7",
++ "prison_island_1_8",
++ "prison_island_1_9",
++ "prison_island_1_10",
++ "prison_island_1_11",
++ "prison_island_1_12",
++ "prison_island_1_13",
++ "prison_island_1_14",
++ "prison_island_1_15",
++ "prison_island_1_2f_1",
++ "prison_island_1_2f_2",
++ "prison_island_1_2f_3",
++ "prison_island_1_2f_4",
++ "prison_island_1_2f_5",
++ "prison_island_1_2f_6",
++ "prison_island_1_2f_7",
++ "prison_island_1_2f_8",
++ "prison_island_1_2f_9",
++ "prison_island_1_2f_10",
++ "prison_island_1_2f_11",
++ "prison_island_1_2f_12",
++ "prison_island_1_2f_13",
++ "prison_island_1_2f_14",
++ "prison_island_1_2f_15",
++ "prison_island_1_ug_1",
++ "prison_island_1_ug_2",
++ "prison_island_1_ug_3",
++ "prison_island_1_ug_4",
++ "prison_island_1_ug_5",
++ "prison_island_1_ug_6",
++ "prison_island_1_ug_7",
++ "prison_island_1_ug_8",
++ "prison_island_1_ug_9",
++ "prison_island_1_ug_10",
++ "prison_island_1_ug_11",
++ "prison_island_1_ug_12",
++ "prison_island_1_ug_13",
++ "prison_island_1_ug_14",
++ "prison_island_1_ug_15"
+ ],
+ "name": "prison",
+ "sym": "p",
+--- a/data/json/start_locations.json
++++ b/data/json/start_locations.json
+@@ -303,11 +348,17 @@
+ {
+ "type": "start_location",
+ "id": "sloc_prison_alcatraz",
+- "name": "Island prison",
++ "name": "Island prison type A",
+ "terrain": [ "prison_alcatraz_3" ]
+ },
+ {
+ "type": "start_location",
++ "id": "sloc_prison_island",
++ "name": "Island prison type B",
++ "terrain": [ "prison_island_1_1" ]
++ },
++ {
++ "type": "start_location",
+ "id": "sloc_mi-go_camp",
+ "name": "Mi-go camp",
+ "terrain": [ "mi-go_camp1" ]
diff --git a/npc-05_kindred-update.patch b/npc-05_kindred-update.patch
new file mode 100644
index 0000000..3ada0ec
--- /dev/null
+++ b/npc-05_kindred-update.patch
@@ -0,0 +1,1171 @@
+--- a/data/json/npcs/Kindred/NPC_Brigitte_LaCroix.json
++++ b/data/json/npcs/Kindred/NPC_Brigitte_LaCroix.json
+@@ -0,0 +1,552 @@
++[
++ {
++ "type": "npc_class",
++ "id": "NC_BONE_SEER",
++ "name": { "str": "Bone Seer" },
++ "job_description": "I wish to sing the song of the Bones",
++ "traits": [
++ { "trait": "OUTDOORSMAN" },
++ { "trait": "HEAVYSLEEPER" },
++ { "trait": "GOODCARDIO" },
++ { "trait": "LIGHTSTEP" },
++ { "trait": "ROBUST" },
++ { "trait": "SKIN_DARK" },
++ { "trait": "seer_mark" },
++ { "trait": "hair_black_mohawk" }
++ ],
++ "common": false,
++ "bonus_per": { "rng": [ 0, 2 ] },
++ "bonus_str": { "rng": [ 0, 2 ] },
++ "bonus_int": { "rng": [ 0, 2 ] },
++ "worn_override": "BONE_SEER_Brigitte_worn",
++ "weapon_override": "BONE_SEER_Brigitte_wield",
++ "shopkeeper_item_group": "NC_BONE_SEER_misc",
++ "skills": [
++ {
++ "skill": "ALL",
++ "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "constant": -2 }, { "one_in": 4 } ] } ] }
++ },
++ { "skill": "survival", "bonus": { "rng": [ 2, 4 ] } },
++ { "skill": "dodge", "bonus": { "rng": [ 4, 8 ] } },
++ { "skill": "melee", "bonus": { "rng": [ 6, 8 ] } },
++ { "skill": "bashing", "bonus": { "rng": [ 3, 6 ] } },
++ { "skill": "cutting", "bonus": { "rng": [ 3, 6 ] } }
++ ]
++ },
++ {
++ "type": "item_group",
++ "id": "BONE_SEER_Brigitte_worn",
++ "subtype": "collection",
++ "entries": [
++ { "item": "boxer_briefs" },
++ { "item": "socks" },
++ { "item": "tshirt_tour" },
++ { "item": "jacket_leather_bone" },
++ { "item": "gloves_liner" },
++ { "item": "helmet_skull" },
++ { "item": "gloves_leather" },
++ { "item": "pants_leather" },
++ { "item": "boots_bone" },
++ { "item": "backpack_leather" }
++ ]
++ },
++ {
++ "type": "item_group",
++ "id": "BONE_SEER_Brigitte_wield",
++ "subtype": "collection",
++ "entries": [ { "item": "2h_flail_steel" } ]
++ },
++ {
++ "type": "item_group",
++ "id": "NC_BONE_SEER_misc",
++ "subtype": "distribution",
++ "entries": [
++ { "item": "needle_bone", "prob": 40 },
++ { "item": "bone_glue", "prob": 20 },
++ { "item": "bone_flute", "prob": 10 },
++ { "item": "bone_human", "prob": 10 },
++ { "item": "broth_bone", "prob": 60 },
++ { "item": "water_clean", "prob": 90 }
++ ]
++ },
++ {
++ "type": "mutation",
++ "id": "seer_mark",
++ "name": { "str": "Mark of the Seer" },
++ "points": 1,
++ "description": "A strange occult symbol carved into your hand by Brigitte LaCroix.",
++ "starting_trait": false,
++ "valid": false,
++ "purifiable": false
++ },
++ {
++ "type": "npc",
++ "id": "SEER_Brigitte_LaCroix",
++ "//": "A mysterious member of a doomsday cult.",
++ "name_unique": "Brigitte LaCroix",
++ "gender": "female",
++ "name_suffix": "Bone Seer",
++ "class": "NC_BONE_SEER",
++ "attitude": 7,
++ "mission": 3,
++ "chat": "TALK_BONE_SEER",
++ "faction": "no_faction",
++ "mission_offered": "MISSION_SEER_GATHER_BONE"
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER",
++ "dynamic_line": {
++ "u_has_var": "talked_to_seer",
++ "type": "dialogue",
++ "context": "first_meeting",
++ "value": "yes",
++ "no": "You there. Quiet down. Can you hear it? The song?",
++ "yes": {
++ "u_has_var": "asked_about_song",
++ "type": "dialogue",
++ "context": "song",
++ "value": "yes",
++ "no": "You're back. Have you come to listen to the song?",
++ "yes": {
++ "u_has_trait": "seer_mark",
++ "no": "Traveller.",
++ "yes": { "u_female": true, "yes": "Greetings, sister.", "no": "Greetings, brother." }
++ }
++ }
++ },
++ "speaker_effect": { "effect": { "u_add_var": "talked_to_seer", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ "responses": [
++ {
++ "text": "What song?",
++ "topic": "TALK_BONE_SEER_SONG",
++ "condition": { "not": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" } }
++ },
++ {
++ "text": "So about the songs…",
++ "topic": "TALK_BONE_SEER_SONG2",
++ "condition": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" }
++ },
++ {
++ "text": "Do others follow this belief as well?",
++ "topic": "TALK_BONE_SEER_OTHERS",
++ "condition": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" }
++ },
++ {
++ "text": "Can you tell me more about yourself?",
++ "topic": "TALK_BONE_SEER_ABOUT",
++ "condition": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" }
++ },
++ {
++ "text": "You mentioned some cycle before. What does that mean?",
++ "topic": "TALK_BONE_SEER_CYCLE",
++ "condition": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" }
++ },
++ {
++ "text": "I've met Cooper.",
++ "topic": "TALK_BONE_SEER_METCOOPER",
++ "condition": {
++ "and": [
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "Would you like to join me on my travels?",
++ "topic": "TALK_SUGGEST_FOLLOW_SEER",
++ "condition": {
++ "and": [
++ { "not": "npc_following" },
++ { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "Is there a way I can help you with your song?",
++ "topic": "TALK_MISSION_LIST_SEER",
++ "condition": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" }
++ },
++ {
++ "text": "I have to go.",
++ "topic": "TALK_DONE",
++ "condition": { "not": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" } }
++ },
++ {
++ "text": "I have to get going. Take care, Seer.",
++ "topic": "TALK_DONE",
++ "condition": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_SONG",
++ "dynamic_line": "Listen carefully. The bones… they hum. Can you hear it? The song they weave? The stories they hold?",
++ "responses": [
++ { "text": "Bones? What are you talking about?", "topic": "TALK_BONE_SEER_SONG2" },
++ { "text": "Uh… yeah, sure. I think I'll just be on my way.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_SONG2",
++ "dynamic_line": "When it all happened, the Cataclysm, something… changed. You can see it in all creatures, most of all in their bones. They break, morph, rise again, over and over - a never-ending cycle. The dead walk again, horrors rip and tear each other apart. And within each one… the quiet hum of raw strength. Only by taking the bones does the cycle end - their story, their song, their strength; they become yours to use.",
++ "speaker_effect": { "effect": { "u_add_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" } },
++ "responses": [
++ { "text": "So what do you actually do with the bones?", "topic": "TALK_BONE_SEER_BONES" },
++ { "text": "I'm still not sure what you mean.", "topic": "TALK_BONE_SEER_SONG3" },
++ { "text": "Does anyone else, uh, believe this?", "topic": "TALK_BONE_SEER_OTHERS" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_SONG3",
++ "dynamic_line": "Only when you crush the bones of a body does it cease to rise. Only if you examine the bones can you see what was, the story of the bones. Whatever causes this change is alive, writhing within us all; an inevitable part of this new world. It holds the power of change. When we hold the bones, we hold the power. Thus the strength. Together… they form a beautiful song.",
++ "responses": [
++ { "text": "What do you actually do with the bones?", "topic": "TALK_BONE_SEER_BONES" },
++ { "text": "Does anyone else share this belief?", "topic": "TALK_BONE_SEER_OTHERS" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_OTHERS",
++ "dynamic_line": "There are others who know the power the bones hold, but not all of them are my kin. Not anymore, at least.",
++ "speaker_effect": { "effect": { "u_add_var": "knows_kindred", "type": "dialogue", "context": "kindred", "value": "yes" } },
++ "responses": [
++ { "text": "What do you mean 'not anymore'?", "topic": "TALK_BONE_SEER_COOPER" },
++ { "text": "Why do you gather these bones again?", "topic": "TALK_BONE_SEER_BONES" },
++ { "text": "Thank you for all the information, but I have to go now.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_COOPER",
++ "dynamic_line": "Some time ago, a man named Cooper joined me and my kin. He showed great promise and devotion to our cause, but in his effort to weave songs, he justified increasingly grim actions. We tried to stop him when we learned of this, but he managed to get away. If you ever come across him, be sure to thread carefully, and if you can, stop him.",
++ "speaker_effect": { "effect": { "u_add_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" } },
++ "responses": [
++ {
++ "text": "Wait, Cooper? Darren Cooper? I've already met him.",
++ "topic": "TALK_BONE_SEER_METCOOPER2",
++ "condition": { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ { "text": "What exactly did he do?", "topic": "TALK_BONE_SEER_COOPER2" },
++ {
++ "text": "Sounds like there is another side to this. Sometimes, what is necessary is not pretty.",
++ "topic": "TALK_BONE_SEER_COOPER3",
++ "effect": { "u_add_var": "admires_cooper", "type": "dialogue", "context": "kindred", "value": "yes" }
++ },
++ { "text": "What cause is that? What do you do with the bones?", "topic": "TALK_BONE_SEER_BONES" },
++ { "text": "I see. I wanted to ask about something else…", "topic": "TALK_BONE_SEER" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_COOPER2",
++ "dynamic_line": "He began killing others to get their bones as fresh as possible. Later, he… he started carving the bones of the living. Thought the anguish alone would empower the song. The goal of the Kindred is to banish the shadow of the cataclysm, not to cast it. Such heinous acts will likely twist the song of the world, but I don't think Cooper realises it. To him, the end justifies any means.",
++ "speaker_effect": { "effect": { "u_add_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" } },
++ "responses": [
++ { "text": "Well… shit. Maybe we should talk about something else.", "topic": "TALK_BONE_SEER" },
++ {
++ "text": "What if he is right? Maybe what you do isn't enough and he's the only one to do what it takes.",
++ "topic": "TALK_BONE_SEER_COOPER3",
++ "effect": { "u_add_var": "admires_cooper", "type": "dialogue", "context": "kindred", "value": "yes" }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_COOPER3",
++ "dynamic_line": "You do not realize the gravity of your claim. When you understand the Song better, you will understand the danger of his actions.",
++ "responses": [ { "text": "I see.", "topic": "TALK_BONE_SEER" }, { "text": "We'll see about that.", "topic": "TALK_BONE_SEER" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_BONES",
++ "dynamic_line": "The song can be woven in many forms. Carved bone charms, weapons and armor all hold immense power, and when the time comes, me and my Kindred shall amass enough Song to restore this world as it was before. Restore it, or end it. Makes no difference.",
++ "responses": [ { "text": "End the world? What?", "topic": "TALK_BONE_SEER_END" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_END",
++ "dynamic_line": "The Song holds immeasurable power. A grand symphony could revert the Cataclysm - or accelerate it to a time beyond all. But with the world looking as is, both options are preferable.",
++ "responses": [
++ { "text": "A strange belief, but maybe there is some truth to it.", "topic": "TALK_BONE_SEER_POSITIVE" },
++ { "text": "Well, at least you're trying to help.", "topic": "TALK_BONE_SEER_POSITIVE" },
++ { "text": "You're nuts.", "topic": "TALK_BONE_SEER_INSULT" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_POSITIVE",
++ "dynamic_line": "Your mind is open. More than most. Perhaps one day, you too will feel the power of the song and become Kindred. For now, traveller, listen, listen and feel the song.",
++ "responses": [ { "text": "I… thank you.", "topic": "TALK_BONE_SEER" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_INSULT",
++ "dynamic_line": "Your skepticism does not surprise me. Perhaps one day, you too will hear the inevitability of the song, feel its power. But until you do, you will remain just another survivor, path to the Kindred closed.",
++ "responses": [ { "text": "Alright.", "topic": "TALK_BONE_SEER" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_ABOUT",
++ "dynamic_line": "I grew up in Louisiana with my grandmother. Great cook. Made the best boudin I've ever had. Each night, she would tell me stories; mostly folklore and myths, like about the rougarou, or the Honey Island Swamp monster but… she sometimes told me about me about the Song, and the bones. The way she talked about it was… different, serious. Didn't give it much thought back then; I was just a child, after all. I moved here a few years back for work, before the Cataclysm, before everything changed. I do miss home sometimes, but at least the rats here are smaller. Never could stand the things. Anyway… thank you for asking. Been a while since I could simply talk to someone.",
++ "responses": [
++ { "text": "Why didn't your parents raise you?", "topic": "TALK_BONE_SEER_PARENTS" },
++ { "text": "What's boudin?", "topic": "TALK_BONE_SEER_BOUDIN" },
++ { "text": "What do you mean she talked about the Song 'differently'?", "topic": "TALK_BONE_SEER_GRANDMA" },
++ { "text": "What's wrong with rats?", "topic": "TALK_BONE_SEER_RATS" },
++ { "text": "Thank you for sharing. Let's talk about something else.", "topic": "TALK_BONE_SEER" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_PARENTS",
++ "dynamic_line": "They died when I was very young. Car accident. I… don't have any memories of them, but my grandmother raised me as her own.",
++ "responses": [ { "text": "She sounds nice.", "topic": "TALK_BONE_SEER_ABOUT" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_BOUDIN",
++ "dynamic_line": "Spicy sausage, green onions, rice. She'd batter and deep fry them, make boudin balls. A dish to die for.",
++ "responses": [
++ { "text": "Sounds delicious.", "topic": "TALK_BONE_SEER_ABOUT" },
++ { "text": "Not my kind of thing.", "topic": "TALK_BONE_SEER_ABOUT" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_GRANDMA",
++ "dynamic_line": "Unlike the other stories, she spoke with determination, reverence even. I didn't realize it back then but it wasn't just a story; she knew that this wasn't just another tale.",
++ "responses": [ { "text": "I see.", "topic": "TALK_BONE_SEER_ABOUT" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_RATS",
++ "dynamic_line": "Ever since a young age, I hated rats. Can't quite say why; they always struck me as something… foul. I even have nightmares about them sometimes. Not too long ago, I had one about a man-sized rat, shambling on it's hind legs. It chased me up a tall building and then pushed me off, snickering. Maybe the Song was trying to tell me something, but then again, maybe it was just a bad dream.",
++ "responses": [ { "text": "Strange dream, but we all have fears, sometimes irrational.", "topic": "TALK_BONE_SEER_ABOUT" } ]
++ },
++ {
++ "id": "MISSION_SEER_GATHER_BONE",
++ "type": "mission_definition",
++ "name": {
++ "str": "Brigitte LaCroix asked you to collect clean, untainted bones in order to better understand her beliefs. 8 bones should be sufficient."
++ },
++ "difficulty": 1,
++ "value": 10000,
++ "goal": "MGOAL_FIND_ITEM",
++ "item": "bone",
++ "count": 8,
++ "origins": [ "ORIGIN_SECONDARY" ],
++ "end": {
++ "effect": [
++ { "u_add_var": "NC_SEER_MISSION_1", "type": "general", "context": "mission", "value": "yes" },
++ { "u_add_trait": "seer_mark" }
++ ]
++ },
++ "dialogue": {
++ "describe": "There is always work to be done, song to be woven.",
++ "offer": "If you wish to be set on the path to enlightenment, first you must learn to listen and hear the song. Go out, butcher an untainted creature and feel the power between your fingertips. Then bring me the bones and I shall carve them for you.",
++ "accepted": "Excellent. Now be on your way.",
++ "rejected": "I understand your reluctancy. Feel free to return when you see the way.",
++ "advice": "The shambling corpses we see all around move in discord. Their song can be used, but for an Acolyte, this would be needlessly hard. Be sure to carve an unspoiled living creature.",
++ "inquire": "Have you felt the song in your hands yet?",
++ "success": "And so, another cycle ends. You have done well. I will now bestow my mark upon you, so that others may know the path you walk and aid you.",
++ "success_lie": "So you say, but the song sings otherwise.",
++ "failure": "Then you shall try again, until you hear."
++ }
++ },
++ {
++ "id": "TALK_MISSION_LIST_SEER",
++ "type": "talk_topic",
++ "dynamic_line": {
++ "has_no_available_mission": {
++ "has_no_assigned_mission": "The song is… quiet for now. Perhaps with time, more notes will be etched in the bones of this world.",
++ "no": { "has_many_assigned_missions": "An acolyte should not take on too many songs at once.", "no": "That is all for now." }
++ },
++ "no": {
++ "has_many_available_missions": {
++ "has_no_assigned_mission": "There are bones to etch, songs to sing. Wish to join me?",
++ "no": {
++ "has_many_assigned_missions": "Do you wish to take on more songs?",
++ "no": "Do you believe you can take on the burden of additional bones?"
++ }
++ },
++ "no": {
++ "has_no_assigned_mission": "A song may yet be sung by you, should you wish to.",
++ "no": {
++ "has_many_assigned_missions": "There is an additional song you could take on, if you'd like.",
++ "no": "I know of certain bones that could be of use, if you'd like to know more."
++ }
++ }
++ }
++ },
++ "responses": [
++ { "text": "I see.", "topic": "TALK_NONE", "condition": "has_no_available_mission" },
++ {
++ "text": "I'm listening.",
++ "topic": "TALK_MISSION_OFFER_SEER",
++ "condition": { "not": "has_no_available_mission" }
++ },
++ {
++ "text": "Perhaps another time, Seer.",
++ "topic": "TALK_NONE",
++ "condition": { "not": "has_no_available_mission" }
++ }
++ ]
++ },
++ {
++ "id": "TALK_MISSION_OFFER_SEER",
++ "type": "talk_topic",
++ "dynamic_line": "If you wish to be set on the path to enlightenment, first you must learn to listen and hear the song. Go out, butcher an untainted creature and feel the power between your fingertips. Then bring me the bones and I shall carve them for you.",
++ "responses": [
++ {
++ "text": "Well, I guess I oughta see where this goes. I'm in.",
++ "topic": "TALK_MISSION_ACCEPTED_SEER",
++ "effect": "assign_mission"
++ },
++ { "text": "Not interested.", "topic": "TALK_MISSION_REJECTED_SEER" }
++ ]
++ },
++ {
++ "id": "TALK_MISSION_ACCEPTED_SEER",
++ "type": "talk_topic",
++ "dynamic_line": "Excellent. Now be on your way.",
++ "responses": [
++ { "text": "Consider it done. But I also wanted to ask…", "topic": "TALK_BONE_SEER" },
++ { "text": "Where should I start?", "topic": "TALK_MISSION_ADVICE_SEER" },
++ { "text": "Can you share some equipment to aid me in this?", "topic": "TALK_SHARE_EQUIPMENT_SEER" },
++ { "text": "I'm off then.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "id": "TALK_MISSION_ADVICE_SEER",
++ "type": "talk_topic",
++ "dynamic_line": "The shambling corpses we see all around move in discord. Their song can be used, but for an Acolyte, this would be needlessly hard. Be sure to carve an unspoiled living creature.",
++ "responses": [ { "text": "So, a creature that isn't a zombie, or a monster. Got it.", "topic": "TALK_NONE" } ]
++ },
++ {
++ "id": "TALK_SHARE_EQUIPMENT_SEER",
++ "type": "talk_topic",
++ "dynamic_line": "The path to enlightenment is for you to walk. For me to aid you would ultimately impede your progress and muddle your song.",
++ "responses": [ { "text": "I see. Very well then.", "topic": "TALK_NONE" } ]
++ },
++ {
++ "id": "TALK_SUGGEST_FOLLOW_SEER",
++ "type": "talk_topic",
++ "dynamic_line": {
++ "u_has_trait": "seer_mark",
++ "no": "Only those who bear my mark will prove themselves worthy of my skills.",
++ "yes": "You bear my mark, meaning I believe you have potential to learn to truly listen to the Song. Yes, I will lend my skills to you, for now."
++ },
++ "responses": [
++ { "text": "I see. Very well then.", "topic": "TALK_NONE", "condition": { "not": { "u_has_trait": "seer_mark" } } },
++ {
++ "text": "I am glad to hear it. Let's go then.",
++ "effect": "follow",
++ "condition": { "u_has_trait": "seer_mark" },
++ "topic": "TALK_DONE"
++ },
++ {
++ "text": "That's good, but I need to go at it alone right now. Maybe later.",
++ "condition": { "u_has_trait": "seer_mark" },
++ "topic": "TALK_NONE"
++ }
++ ]
++ },
++ {
++ "id": "TALK_MISSION_REJECTED_SEER",
++ "type": "talk_topic",
++ "dynamic_line": "I understand your reluctancy. Feel free to return when you see the way.",
++ "responses": [
++ { "text": "Maybe some other time. Changing the topic…", "topic": "TALK_NONE" },
++ { "text": "Alright, but I have to go now.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_CYCLE",
++ "dynamic_line": "It's not just walking horrors and monsters that have changed with the Cataclysm. It started a… cycle, of sorts. Everything repeats. We can only see it in others, but it happens to us, even you and I. How many times have you fallen? Your flesh rent from your body, devoured. Or perhaps it was the quiet whimper of succumbing to the elements. But your bones rose again. Different flesh, different name, sometimes even different knowledge, but the bones, the same. We are all trapped in the same cycle. We just keep forgetting. That's why we need to amass the Song. That's why it has to end, even if it means the destruction, not restoration.",
++ "responses": [
++ { "text": "That's… certainly something.", "topic": "TALK_NONE" },
++ { "text": "That's insane.", "topic": "TALK_BONE_SEER_INSULT" },
++ { "text": "Right… I think I'll go now.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_METCOOPER",
++ "dynamic_line": "I see. And you live still. Does that mean you managed to stop him?",
++ "responses": [
++ {
++ "text": "I've confronted him. He ended up attacking me.",
++ "topic": "TALK_BONE_SEER_COOPERFIGHT",
++ "condition": { "u_has_var": "fought_cooper", "type": "dialogue", "context": "cooper", "value": "yes" }
++ },
++ {
++ "text": "He was reasonable. We talked, then parted ways peacefully.",
++ "topic": "TALK_BONE_SEER_COOPERPEACE",
++ "condition": { "not": { "u_has_var": "fought_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } }
++ },
++ {
++ "text": "I agree with him. What he does is necessary.",
++ "topic": "TALK_BONE_SEER_COOPERAGREE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "fought_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } },
++ { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" }
++ ]
++ }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_COOPERFIGHT",
++ "dynamic_line": "It saddens me to see a talented Kindred lose his way so greatly, but I take solace in the fact that you are unscathed.",
++ "responses": [ { "text": "Best not to dwell on it. Let's move on.", "topic": "TALK_BONE_SEER" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_COOPERPEACE",
++ "dynamic_line": "I am glad your meeting ended without conflict. Perhaps he's understanding the Song more and the harm his actions caused. If so… there may be hope yet. Never the less, his action can not go unpunished.",
++ "responses": [ { "text": "A topic for another time. Let's move on.", "topic": "TALK_BONE_SEER" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_METCOOPER2",
++ "dynamic_line": "You have? A most peculiar coincidence. How did he act towards you?",
++ "responses": [
++ {
++ "text": "I've confronted him. He ended up attacking me.",
++ "topic": "TALK_BONE_SEER_COOPERFIGHT",
++ "condition": { "u_has_var": "fought_cooper", "type": "dialogue", "context": "cooper", "value": "yes" }
++ },
++ {
++ "text": "He was reasonable. We talked, then parted ways peacefully.",
++ "topic": "TALK_BONE_SEER_COOPERPEACE",
++ "condition": { "not": { "u_has_var": "fought_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } }
++ },
++ {
++ "text": "I agree with him. What he does is necessary.",
++ "topic": "TALK_BONE_SEER_COOPERAGREE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "fought_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } },
++ { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" }
++ ]
++ }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_BONE_SEER_COOPERAGREE",
++ "dynamic_line": "Tread carefully. I can't allow anyone else to go down such a path. I can't fail again.",
++ "responses": [
++ { "text": "I'm sorry. I'll think about it some more.", "topic": "TALK_BONE_SEER" },
++ { "text": "Just saying he has a point, that's all.", "topic": "TALK_BONE_SEER" }
++ ]
++ }
++]
+--- a/data/json/npcs/Kindred/NPC_Darren_Cooper.json
++++ b/data/json/npcs/Kindred/NPC_Darren_Cooper.json
+@@ -0,0 +1,613 @@
++[
++ {
++ "type": "npc_class",
++ "id": "NC_KINDRED_COOPER",
++ "name": { "str": "Rogue Kindred" },
++ "job_description": "I have to gather more bones",
++ "traits": [
++ { "trait": "OUTDOORSMAN" },
++ { "trait": "INSOMNIA" },
++ { "trait": "GOODCARDIO2" },
++ { "trait": "STRONGSTOMACH" },
++ { "trait": "SPIRITUAL" },
++ { "trait": "TERRIFYING" },
++ { "trait": "KILLER" },
++ { "trait": "seer_mark" },
++ { "group": "Appearance_Caucasian" },
++ { "trait": "hair_brown_short" },
++ { "trait": "FACIAL_HAIR_3DAYSTUBBLE" }
++ ],
++ "common": false,
++ "bonus_per": { "rng": [ 0, 2 ] },
++ "bonus_str": { "rng": [ 0, 2 ] },
++ "worn_override": "KINDRED_COOPER_worn",
++ "weapon_override": "KINDRED_COOPER_wield",
++ "shopkeeper_item_group": "NC_KINDRED_COOPER_misc",
++ "skills": [
++ {
++ "skill": "ALL",
++ "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "constant": -2 }, { "one_in": 4 } ] } ] }
++ },
++ { "skill": "dodge", "bonus": { "rng": [ 2, 4 ] } },
++ { "skill": "melee", "bonus": { "rng": [ 5, 7 ] } },
++ { "skill": "cutting", "bonus": { "rng": [ 4, 6 ] } }
++ ]
++ },
++ {
++ "type": "item_group",
++ "id": "KINDRED_COOPER_worn",
++ "subtype": "collection",
++ "entries": [
++ { "item": "loincloth_leather" },
++ { "item": "socks" },
++ { "item": "kevlar" },
++ { "item": "helmet_liner" },
++ { "item": "gloves_liner" },
++ { "item": "boots_larmor" },
++ { "item": "swat_armor" },
++ { "item": "gauntlets_larmor" },
++ { "item": "leather_belt" },
++ { "item": "canteen" },
++ { "item": "armguard_larmor" },
++ { "item": "backpack_leather" },
++ { "item": "knee_pads" },
++ { "item": "knit_scarf" }
++ ]
++ },
++ {
++ "type": "item_group",
++ "id": "KINDRED_COOPER_wield",
++ "subtype": "collection",
++ "entries": [ { "item": "survivor_machete" } ]
++ },
++ {
++ "type": "item_group",
++ "id": "NC_KINDRED_COOPER_misc",
++ "subtype": "distribution",
++ "entries": [
++ { "item": "needle_bone", "prob": 40 },
++ { "item": "bone_glue", "prob": 20 },
++ { "item": "bone_flute", "prob": 10 },
++ { "item": "bone_human", "prob": 10 },
++ { "item": "broth_bone", "prob": 60 },
++ { "item": "water_clean", "prob": 90 }
++ ]
++ },
++ {
++ "type": "npc",
++ "id": "KINDRED_Darren_Cooper",
++ "//": "A once member of a doomsday cult.",
++ "name_unique": "Darren Cooper",
++ "gender": "male",
++ "name_suffix": "Rogue Kindred",
++ "class": "NC_KINDRED_COOPER",
++ "attitude": 0,
++ "mission": 7,
++ "chat": "TALK_KINDRED_COOPER",
++ "faction": "no_faction"
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_KINDRED_COOPER",
++ "dynamic_line": {
++ "u_has_var": "talked_to_cooper",
++ "type": "dialogue",
++ "context": "first_meeting",
++ "value": "yes",
++ "no": {
++ "u_has_trait": "seer_mark",
++ "yes": "How do you do. Name's Cooper. What's your- wait… that's the Mark of the Seer on your hand. You're Kindred. So I guess you know who I am then.",
++ "no": "How do you do. Name's Cooper. And you are?"
++ },
++ "yes": {
++ "u_has_trait": "seer_mark",
++ "no": {
++ "u_has_var": "cooper_friendly",
++ "type": "dialogue",
++ "context": "cooper",
++ "value": "yes",
++ "yes": "Hello again, traveller.",
++ "no": "Yes?"
++ },
++ "yes": {
++ "u_has_var": "cooper_friendly",
++ "type": "dialogue",
++ "context": "cooper",
++ "value": "yes",
++ "no": "What do you want, Kindred?",
++ "yes": "Kindred. What can I do for you?"
++ }
++ }
++ },
++ "speaker_effect": { "effect": { "u_add_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ "responses": [
++ {
++ "text": "I do. Brigitte told me about you, and that you're dangerous.",
++ "topic": "TALK_KNOWS_COOPER1",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "confronted_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } },
++ { "u_has_trait": "seer_mark" },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ {
++ "not": { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Brigitte told me everything. What could drive a man to carve the bones of living people?",
++ "topic": "TALK_KNOWS_COOPER_CARVE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "confronted_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } },
++ { "u_has_trait": "seer_mark" },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "Brigitte told me about you. I think what you do might be what's necessary, even if Brigitte doesn't agree.",
++ "topic": "TALK_COOPER_AGREE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "confronted_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } },
++ { "u_has_trait": "seer_mark" },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ { "u_has_var": "admires_cooper", "type": "dialogue", "context": "kindred", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "I can't say that I do. Should I?",
++ "topic": "TALK_COOPER_NOTFMLR",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ { "u_has_trait": "seer_mark" },
++ {
++ "not": { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Just a traveller, trying to survive. What about you? Scavenging?",
++ "topic": "TALK_COOPER_INTRODUCTION",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ {
++ "not": { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ },
++ {
++ "not": { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Wait, Cooper? Brigitte LaCroix mentioned someone by that name. You're the man who carved the bones of living people.",
++ "topic": "TALK_KNOWS_COOPER_CARVE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ {
++ "not": { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "Cooper? I met a woman who mentioned you, Brigitte. She said you're dangerous.",
++ "topic": "TALK_COOPER_INTRODUCTION_QUERY",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ {
++ "not": { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ {
++ "not": { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Wait, Cooper? I heard about you. A woman, Brigitte LaCroix, said that you're dangerous, but seems to me like you're just doing what it takes.",
++ "topic": "TALK_COOPER_AGREE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ {
++ "not": { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ { "u_has_var": "admires_cooper", "type": "dialogue", "context": "kindred", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "Why did Brigitte say you're dangerous?",
++ "topic": "TALK_COOPERS_SIDE",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ {
++ "not": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ {
++ "not": { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ }
++ ]
++ }
++ },
++ {
++ "text": "Why do you kill people?",
++ "topic": "TALK_COOPER_GOAL",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ {
++ "not": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "Could you tell me about yourself?",
++ "topic": "TALK_COOPER_ABOUT",
++ "condition": { "and": [ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" } ] }
++ },
++ {
++ "text": "I'll be going now.",
++ "topic": "TALK_DONE",
++ "condition": {
++ "and": [
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "not": { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" } }
++ ]
++ }
++ },
++ {
++ "text": "Remind me what happened between you and Brigitte.",
++ "topic": "TALK_COOPERS_SIDE",
++ "condition": {
++ "and": [
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_trait": "seer_mark" }
++ ]
++ }
++ },
++ {
++ "text": "I've been thinking about what you do. I can't let you keep hurting people. You have to be stopped.",
++ "topic": "TALK_COOPER_FIGHT",
++ "condition": {
++ "and": [
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "Could you remind me of your goal again?",
++ "topic": "TALK_COOPER_GOAL",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "You mentioned that you have a goal. What is that exactly?",
++ "topic": "TALK_COOPER_GOAL",
++ "condition": {
++ "and": [
++ { "not": { "u_has_trait": "seer_mark" } },
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "cooper_goal_dk", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "The woman you mentioned - Brigitte - why isn't she with you?",
++ "topic": "TALK_COOPERS_SIDE",
++ "condition": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ {
++ "text": "I was just checking in. Take care.",
++ "topic": "TALK_DONE",
++ "condition": {
++ "and": [
++ { "u_has_var": "talked_to_cooper", "type": "dialogue", "context": "first_meeting", "value": "yes" },
++ { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" }
++ ]
++ }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_KNOWS_COOPER1",
++ "dynamic_line": "I suppose she probably said I'm some sort of a maniac and that you should kill me on the spot, correct?",
++ "speaker_effect": { "effect": { "u_add_var": "confronted_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } },
++ "responses": [
++ {
++ "text": "I want to hear your side of the story. You make it sound like it's not so cut and dry.",
++ "topic": "TALK_COOPERS_SIDE"
++ },
++ {
++ "text": "You kill innocent people and butcher them like animals. I don't care what you say. You have to be stopped.",
++ "topic": "TALK_COOPER_FIGHT"
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_INTRODUCTION_QUERY",
++ "dynamic_line": "I see. Would you like to hear my side, or is your mind made up already?",
++ "responses": [
++ { "text": "I'm curious. Go on.", "topic": "TALK_COOPERS_SIDE" },
++ { "text": "She told me to stop you, and that's what I'll do.", "topic": "TALK_COOPER_FIGHT" },
++ { "text": "I don't care about any of this. Bye.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_KNOWS_COOPER_CARVE",
++ "dynamic_line": "What? I'd never do anything like that! Dammit… if she thinks I did that, that would explain why she's not willing to work with me. Maybe there's still some hope she'll understand what's necessary.",
++ "responses": [
++ { "text": "So what happened then?", "topic": "TALK_COOPERS_SIDE" },
++ { "text": "You're still a killer, and I can't let you keep going.", "topic": "TALK_COOPER_FIGHT" },
++ { "text": "I don't really care. I'm leaving.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPERS_SIDE",
++ "dynamic_line": "I met Brigitte shortly after everything collapsed. Seeing so much death and insanity around me… it almost crushed me, but when she explained everything about the bones to me, it gave me a sliver of hope, that one time, things might turn around. For that, I am grateful to her. But we'll never change anything if we keep using scraps of bones found on corpses on the side of the road. By the time the animals are done with those, there is barely any Song left to be used. It's not enough. I had to leave, to work on my own. To do what's necessary.",
++ "responses": [
++ {
++ "text": "What do you mean by 'necessary'?",
++ "topic": "TALK_COOPER_NECESSARY",
++ "condition": { "not": { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" } }
++ },
++ {
++ "text": "What are you actually trying to accomplish?",
++ "topic": "TALK_COOPER_GOAL",
++ "condition": { "not": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" } }
++ },
++ { "text": "Can't have been easy to split off, but I understand why you did it.", "topic": "TALK_COOPER_AGREE" },
++ {
++ "text": "Necessary? You kill innocent people!",
++ "topic": "TALK_COOPER_NECESSARY",
++ "condition": { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_NECESSARY",
++ "dynamic_line": "People will die in this world overrun with monsters. There is no avoiding it. But I can give those deaths meaning, allow them to help the world after death, more than they could in life. It brings me no pleasure, but… yes, some must give their life for the greater good. It's the only way. Wish there was an alternative, but it must be done. I only take people from this world to save it. Make no mistake though, the only people that I… kill are those who would not survive anyway.",
++ "speaker_effect": { "effect": { "u_add_var": "knows_cooper_kill", "type": "dialogue", "context": "kindred_cooper", "value": "yes" } },
++ "responses": [
++ {
++ "text": "Why do you kill people?",
++ "topic": "TALK_COOPER_GOAL",
++ "condition": { "not": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" } }
++ },
++ { "text": "Are you going to kill me?", "topic": "TALK_COOPER_KILL_PLAYER" },
++ { "text": "You're a monster.", "topic": "TALK_COOPER_MONSTER" },
++ {
++ "text": "You're just a murderer with a shoddy excuse. I can't let you keep doing this.",
++ "topic": "TALK_COOPER_FIGHT"
++ },
++ { "text": "You have a point. The ends justify the means.", "topic": "TALK_COOPER_AGREE" },
++ {
++ "text": "Do you have any proof that this will work?",
++ "topic": "TALK_COOPER_WORK",
++ "condition": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_MONSTER",
++ "dynamic_line": "And how many people have you killed? Maybe it was in self defense, maybe because you wanted their gear. It's all the same. I give their death meaning. I hate that I have to do it, I truly do, but you really must understand, there is no other way. The sooner I finish my mission, the sooner all this madness can end.",
++ "responses": [
++ { "text": "I suppose you're right.", "topic": "TALK_COOPER_AGREE" },
++ { "text": "You're mad. You have to be stopped.", "topic": "TALK_COOPER_FIGHT" },
++ { "text": "Whatever. I'm leaving.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_FIGHT",
++ "dynamic_line": {
++ "u_has_trait": "seer_mark",
++ "no": "I can't allow you to stop me. If you try, I'll have no option but to fight you. Maybe I'll die, or maybe you will. But know that should you win, you'll be ridding the world of the only hope it has.",
++ "yes": "I knew a Kindred would not understand. But I can't allow you to stop me. If you try, I'll have no option but to fight you. But know that should you win, you'll be ridding the world of the only hope it has."
++ },
++ "responses": [
++ {
++ "text": "All I'm ridding the world of is a dangerous madman. Now die.",
++ "topic": "TALK_DONE",
++ "effect": [ "hostile", { "u_add_var": "fought_cooper", "type": "dialogue", "context": "cooper", "value": "yes" } ]
++ },
++ { "text": "This is a waste of time not worth the risk. I'm out of here.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_AGREE",
++ "dynamic_line": {
++ "u_has_trait": "seer_mark",
++ "yes": "You're like me then, Kindred. I'm glad I'm not the only one who realizes what's necessary. Perhaps one day, we'll be able to work together, but what I do now, I must do alone.",
++ "no": "I'm glad you realize the necessity of the burden I bear. Maybe someday we'll even join our forces, but for now, I have to do this alone."
++ },
++ "speaker_effect": { "effect": { "u_add_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" } },
++ "responses": [
++ { "text": "I won't delay you then. Good luck.", "topic": "TALK_DONE" },
++ {
++ "text": "That being said, I need to know why you do it - what purpose it fills.",
++ "topic": "TALK_COOPER_GOAL",
++ "condition": { "not": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" } }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_WORK",
++ "dynamic_line": {
++ "u_has_trait": "seer_mark",
++ "yes": "You're Kindred, and yet you question the power the bones hold, the Song itself? This hypocrisy is why I set off on my own. Stop wasting my time and get out of my way.",
++ "no": "I know it's hard to comprehend when you can't hear the song. The bones hold power, you just don't hear it yet. But you will, eventually."
++ },
++ "responses": [
++ { "text": "I meant no offense. I'm sure you have your reasons.", "topic": "TALK_COOPER_AGREE" },
++ {
++ "text": "What about the woman you mentioned - Brigitte - what happened to her?",
++ "topic": "TALK_COOPERS_SIDE",
++ "condition": { "u_has_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ },
++ {
++ "text": "Brigitte was right. I can't reason with you. You have to be stopped.",
++ "topic": "TALK_COOPER_FIGHT",
++ "condition": {
++ "and": [
++ { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" },
++ { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "cooper", "value": "yes" }
++ ]
++ }
++ },
++ {
++ "text": "You're rambling. I can't let you keep hurting people. This ends now.",
++ "topic": "TALK_COOPER_FIGHT",
++ "condition": {
++ "and": [
++ { "not": { "u_has_var": "knows_cooper", "type": "dialogue", "context": "kindred_cooper", "value": "yes" } },
++ { "u_has_var": "knows_cooper_kill", "type": "dialogue", "context": "cooper", "value": "yes" }
++ ]
++ }
++ },
++ { "text": "This is a waste of time. I'm leaving.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_NOTFMLR",
++ "dynamic_line": "Brigitte did not mention me? I'm surprised. Perhaps she's starting to understand I was right. I was with her for a time, learned from her. I'm still on her side, but she doesn't realize it yet.",
++ "responses": [ { "text": "You know Brigitte? What happened with you two?", "topic": "TALK_COOPERS_SIDE" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_INTRODUCTION",
++ "dynamic_line": "I scavenge only so I can survive, but I have a much greater goal than just to live.",
++ "speaker_effect": { "effect": { "u_add_var": "cooper_goal_dk", "type": "dialogue", "context": "first_meeting", "value": "yes" } },
++ "responses": [
++ { "text": "A… goal? What do you mean? What is there to do other than survive?", "topic": "TALK_COOPER_GOAL" },
++ { "text": "Uh, okay then. I have to go now; have a nice day.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_GOAL",
++ "dynamic_line": "Something changed during the Collapse - the apocalypse, if you prefer that. The way the dead rise again and again, it's tied to their bones - notice that only when you pulp and crush them properly do they actually die. A woman I met - Brigitte was her name - taught me how to use the power. We call it the Song, since if you know how, you can hear it, a quiet hum in the bones. If I collect enough Song, the concentrated power can reverse the Cataclysm. Undo all of this.",
++ "speaker_effect": {
++ "effect": [
++ { "u_lose_var": "cooper_goal_dk", "type": "dialogue", "context": "first_meeting" },
++ { "u_add_var": "cooper_goal_k", "type": "dialogue", "context": "first_meeting", "value": "yes" }
++ ]
++ },
++ "responses": [
++ { "text": "Do you have any proof that this will work?", "topic": "TALK_COOPER_WORK" },
++ {
++ "text": "You mentioned a woman, Brigitte. Why isn't she with you? What happened?",
++ "topic": "TALK_COOPERS_SIDE",
++ "condition": { "not": { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" } }
++ },
++ {
++ "text": "Wait, Brigitte LaCroix? I've met her.",
++ "topic": "TALK_COOPER_KNOWBRIG",
++ "condition": {
++ "and": [
++ { "u_has_var": "asked_about_song", "type": "dialogue", "context": "song", "value": "yes" },
++ { "not": { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" } }
++ ]
++ }
++ },
++ { "text": "That's insane. I'm going.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_KNOWBRIG",
++ "dynamic_line": "Small world, huh? I hope she's doing fine. Despite our differences, I owe everything to her. I hope one day we'll be able to reconcile.",
++ "responses": [
++ { "text": "So, how do you know that any of this works?", "topic": "TALK_COOPER_WORK" },
++ { "text": "What differences? Why did you part ways?", "topic": "TALK_COOPERS_SIDE" }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_ABOUT",
++ "dynamic_line": {
++ "u_has_var": "cooper_friendly",
++ "type": "dialogue",
++ "context": "cooper",
++ "value": "yes",
++ "no": "Sorry, but I don't know you that well and I'd rather not go into that.",
++ "yes": "I was born here in New England, lived here all my life. Was an accountant before the Collapse, if you can believe that. There wasn't really anything special about my life before I learned about the Song, so there isn't much to say."
++ },
++ "responses": [
++ {
++ "text": "I understand.",
++ "topic": "TALK_KINDRED_COOPER",
++ "condition": { "not": { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" } }
++ },
++ {
++ "text": "Do you have a favorite food?",
++ "topic": "TALK_COOPER_FOOD",
++ "condition": { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" }
++ },
++ {
++ "text": "I see. Thanks for sharing.",
++ "topic": "TALK_KINDRED_COOPER",
++ "condition": { "u_has_var": "cooper_friendly", "type": "dialogue", "context": "cooper", "value": "yes" }
++ }
++ ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_FOOD",
++ "dynamic_line": "I've always loved crêpes.",
++ "responses": [ { "text": "Fair enough.", "topic": "TALK_KINDRED_COOPER" } ]
++ },
++ {
++ "type": "talk_topic",
++ "id": "TALK_COOPER_KILL_PLAYER",
++ "dynamic_line": "No. You seem like you have a chance of surviving in this world. Plus, you took the time to actually hear me out, so there is a chance one day you'll hear the Song the same way I do.",
++ "responses": [
++ { "text": "Nevertheless, I can't allow you to keep killing people.", "topic": "TALK_COOPER_FIGHT" },
++ {
++ "text": "I'm glad you see it that way.",
++ "topic": "TALK_COOPER_AGREE",
++ "condition": { "not": { "u_has_trait": "seer_mark" } }
++ },
++ { "text": "Maybe one day I will.", "topic": "TALK_COOPER_AGREE", "condition": { "u_has_trait": "seer_mark" } },
++ { "text": "This is a waste of time. I'm leaving", "topic": "TALK_DONE" }
++ ]
++ }
++]
diff --git a/npc-06_lapin-update.patch b/npc-06_lapin-update.patch
new file mode 100644
index 0000000..132968a
--- /dev/null
+++ b/npc-06_lapin-update.patch
@@ -0,0 +1,126 @@
+--- a/data/json/npcs/holdouts/Mr_Lapin.json
++++ b/data/json/npcs/holdouts/Mr_Lapin.json
+@@ -11,7 +11,7 @@
+ "mission": 7,
+ "mission_offered": "MISSION_Warrener_LOG_1",
+ "chat": "TALK_WARRENER",
+- "faction": "no_faction"
++ "faction": "lapin"
+ },
+ {
+ "type": "npc_class",
+@@ -47,6 +47,7 @@
+ { "text": "Heard anything about the outside world?", "topic": "TALK_WARRENER_WORLD" },
+ { "text": "You look different?", "topic": "TALK_WARRENER_MUTATION" },
+ { "text": "Anything I can help with?", "topic": "TALK_MISSION_LIST" },
++ { "text": "Do you need any resources?", "topic": "TALK_LAPIN_RESOURCES" },
+ { "text": "Well, bye.", "topic": "TALK_DONE" }
+ ]
+ },
+@@ -68,10 +69,33 @@
+ "dynamic_line": "People come to me to learn how to keep rabbits. They learn and they go. I like to think I'm making the world better.",
+ "responses": [
+ { "text": "…", "topic": "TALK_WARRENER" },
++ { "text": "Anyone nearby I should meet?", "topic": "TALK_WARRENER_ISHERWOOD" },
+ { "text": "That sounds optimistic?", "topic": "TALK_WARRENER_WORLD_OPTIMISTIC" }
+ ]
+ },
+ {
++ "id": "TALK_WARRENER_ISHERWOOD",
++ "type": "talk_topic",
++ "dynamic_line": "There is a family of nearby farmers that I trade with. I'd appreciate it if you could go check on them.",
++ "responses": [
++ {
++ "text": "Seems like a deal to me.",
++ "topic": "TALK_WARRENER_ISHERWOOD_MISSION_ACCEPTED",
++ "effect": { "add_mission": "MISSION_Warrener_ISHERWOOD" }
++ },
++ { "text": "That seems rather dangerous, I think I'll pass.", "topic": "TALK_EVAC_MERCHANT" }
++ ]
++ },
++ {
++ "id": "TALK_WARRENER_ISHERWOOD_MISSION_ACCEPTED",
++ "type": "talk_topic",
++ "dynamic_line": "It can be quite a hike depending on your transportation. Lot of bad news between here and there.",
++ "responses": [
++ { "text": "Don't worry, I'll be careful.", "topic": "TALK_DONE" },
++ { "text": "Just a walk in the woods.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
+ "type": "talk_topic",
+ "id": "TALK_WARRENER_WORLD_OPTIMISTIC",
+ "dynamic_line": "If I teach one hundred people how to raise rabbits, that's potentially a hundred communities given food and fur before those people teach anyone else.",
+@@ -106,6 +130,41 @@
+ ]
+ },
+ {
++ "type": "talk_topic",
++ "id": "TALK_LAPIN_RESOURCES",
++ "dynamic_line": "The bunnies and I love adding some diversity to the menu and I always need materials for patching fences.",
++ "repeat_responses": {
++ "for_item": [
++ "log",
++ "2x4",
++ "wood_panel",
++ "wood_sheet",
++ "material_sand",
++ "clay_lump",
++ "nail",
++ "wire",
++ "apple",
++ "banana",
++ "orange",
++ "blueberries",
++ "strawberries",
++ "raspberries",
++ "huckleberries",
++ "mulberries",
++ "plums",
++ "carrot",
++ "cabbage",
++ "lettuce",
++ "onion"
++ ],
++ "response": { "text": "Delivering <topic_item>.", "topic": "TALK_DELIVER_ASK" }
++ },
++ "responses": [
++ { "text": "That's all for now. Can we discuss something else?", "topic": "TALK_WARRENER" },
++ { "text": "That's all for now. I'd best get going.", "topic": "TALK_DONE" }
++ ]
++ },
++ {
+ "id": "MISSION_Warrener_LOG_1",
+ "type": "mission_definition",
+ "name": { "str": "Timber!" },
+@@ -153,5 +212,30 @@
+ "failure": "It's not a big deal, it isn't that urgent."
+ },
+ "end": { "effect": [ { "u_buy_item": "petpack", "count": 1 } ] }
++ },
++ {
++ "id": "MISSION_Warrener_ISHERWOOD",
++ "type": "mission_definition",
++ "name": { "str": "Visit the Isherwoods" },
++ "description": "There is a family that nearby that I'd like you to check in on. After you talk to all of them come back to me and tell me how they are doing.",
++ "goal": "MGOAL_CONDITION",
++ "difficulty": 3,
++ "start": {
++ "assign_mission_target": { "om_terrain": "farm_isherwood_2", "om_special": "Isherwood Farms", "reveal_radius": 3, "search_range": 360 }
++ },
++ "goal_condition": { "u_has_var": "u_met_carlos_isherwood", "type": "general", "context": "meeting", "value": "yes" },
++ "value": 5000,
++ "origins": [ "ORIGIN_SECONDARY" ],
++ "dialogue": {
++ "describe": "…",
++ "offer": "…",
++ "accepted": "…",
++ "rejected": "…",
++ "advice": "…",
++ "inquire": "Have you checked on them?",
++ "success": "Good, that's one less thing to worry about.",
++ "success_lie": "I'm glad to hear they are fine. Why haven't they been by then?",
++ "failure": "At least you came back with your life…"
++ }
+ }
+ ]
diff --git a/npc-04_dialogue-fixes.patch b/npc-10_dialogue-fixes.patch
index 577fc60..577fc60 100644
--- a/npc-04_dialogue-fixes.patch
+++ b/npc-10_dialogue-fixes.patch