From 35d7c1c77d2b67cac581a683cc7701d65446a26d Mon Sep 17 00:00:00 2001 From: Zlorthishen <79779913+Zlorthishen@users.noreply.github.com> Date: Wed, 10 Jan 2024 19:33:48 -0600 Subject: [PATCH] feat(content,port): `More NPCs` (#3917) * Update fluff.json * Update misc.json * Update misc.json * Update overmap_terrain_evac_center.json * Update specials.json * Update campsite.json * Update ws_survivor_camp.json * Update moonshine_camp.json * Update homeless_camp.json * Update homeless_camp.json * Update apartment_con_new.json * Add files via upload * Update epilogue_factions.json * Update NPC_free_merchant_shopkeep.json * Add files via upload * style(autofix.ci): automated formatting * Update TALK_NPC_moonshiner.json * Update scrap_trader.json * Update scrap_trader_missions.json * Update apartment_con_new.json * Update scrap_trader.json * Update apartment_con_new.json * Delete data/json/npcs/Mr_Lapin/cabin.json * Delete data/json/npcs/Mr_Lapin/Mr_Lapin.json * refactor: move overmap terrains into relevant files * fix: remove unimplemented `TALK_LUMBERMILL_FABRICATE` * fix: change item requirement from `magnetron` to `microwave` - mission id was mismatching (5 vs 25) - due to magnetron being obsolete, it's impossible to complete this mission * fix: rename to solder the name for `solder_wire` is `solder`, but the description uses item id, which may be confusing. * fix: use SI unit * Update specials.json * Update fluff.json split the writs of trade into separate items * style(autofix.ci): automated formatting * Update chemist_missions.json * Update lumbermill_missions.json * Update NPC_free_merchant_shopkeep.json * Update lumbermill_missions.json * Update occupied_lumber_mill.json added missing nested_mapgen_id's * style(autofix.ci): automated formatting * Update occupied_lumber_mill.json * Update fluff.json * style(autofix.ci): automated formatting * Update scrap_trader_missions.json * Update NPC_free_merchant_shopkeep.json * style(autofix.ci): automated formatting * Update data/json/overmap/overmap_special/specials.json Co-authored-by: Chaosvolt * Update data/json/overmap/overmap_special/specials.json Co-authored-by: Chaosvolt * Update data/json/overmap/overmap_terrain/overmap_terrain.json Co-authored-by: Chaosvolt * Update data/json/overmap/overmap_special/specials.json Co-authored-by: Chaosvolt * Update epilogue_factions.json * Update apartment_con_new.json * Update factions.json added Mr. Lapin's faction * Update Mr_Lapin.json added Mr. Lapin's faction * style(autofix.ci): automated formatting --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: scarf Co-authored-by: Chaosvolt --- data/json/itemgroups/misc.json | 17 + data/json/items/fluff.json | 51 ++ data/json/mapgen/apartment_con_new.json | 66 +++ data/json/mapgen/campsite.json | 390 +++++++++++++++ data/json/mapgen/chemical_lab.json | 76 +++ data/json/mapgen/fortified_scrap_yard.json | 116 +++++ data/json/mapgen/homeless_camp.json | 451 ++++++++++++++++++ data/json/mapgen/house_prepper.json | 75 +++ data/json/mapgen/moonshine_camp.json | 88 ++++ data/json/mapgen/occupied_lumber_mill.json | 312 ++++++++++++ data/json/mapgen/ws_survivor_camp.json | 50 ++ data/json/monstergroups/misc.json | 13 + .../TALK_NPC_apartment_survivor.json | 71 +++ .../npcs/cabin_chemist/cabin_chemist.json | 258 ++++++++++ .../npcs/cabin_chemist/chemist_effects.json | 37 ++ .../npcs/cabin_chemist/chemist_missions.json | 105 ++++ data/json/npcs/camper/TALK_NPC_camper.json | 53 ++ data/json/npcs/factions.json | 83 ++++ data/json/npcs/holdouts/Mr_Lapin.json | 2 +- .../npcs/homeless/TALK_homeless_broker.json | 125 +++++ .../TALK_homeless_group_survivors.json | 83 ++++ .../npcs/homeless/TALK_homeless_survivor.json | 61 +++ .../npcs/homeless/group_camp_missions.json | 234 +++++++++ .../npcs/homeless/homeless_broker_sell.json | 46 ++ .../homeless/nested_homeless_missions.json | 230 +++++++++ .../json/npcs/homeless/shelter_survivors.json | 102 ++++ .../lumberyard/TALK_lumbermill_logger.json | 72 +++ .../lumberyard/TALK_lumbermill_merchant.json | 55 +++ .../npcs/lumberyard/lumbermill_effects.json | 22 + .../npcs/lumberyard/lumbermill_employees.json | 60 +++ .../npcs/lumberyard/lumbermill_missions.json | 161 +++++++ .../npcs/moonshiner/TALK_NPC_moonshiner.json | 56 +++ data/json/npcs/prepper/TALK_NPC_prepper.json | 85 ++++ .../NPC_free_merchant_shopkeep.json | 57 +++ data/json/npcs/scrap_trader/scrap_trader.json | 214 +++++++++ .../scrap_trader/scrap_trader_missions.json | 103 ++++ .../overmap/overmap_special/specials.json | 56 +++ .../overmap_terrain_industrial.json | 8 + .../overmap_terrain/overmap_terrain_lab.json | 8 + .../overmap_terrain_waste_junk.json | 8 + data/json/snippets/epilogue_factions.json | 8 + 41 files changed, 4167 insertions(+), 1 deletion(-) create mode 100644 data/json/mapgen/chemical_lab.json create mode 100644 data/json/mapgen/fortified_scrap_yard.json create mode 100644 data/json/mapgen/house_prepper.json create mode 100644 data/json/mapgen/occupied_lumber_mill.json create mode 100644 data/json/npcs/apartment_survivor/TALK_NPC_apartment_survivor.json create mode 100644 data/json/npcs/cabin_chemist/cabin_chemist.json create mode 100644 data/json/npcs/cabin_chemist/chemist_effects.json create mode 100644 data/json/npcs/cabin_chemist/chemist_missions.json create mode 100644 data/json/npcs/camper/TALK_NPC_camper.json create mode 100644 data/json/npcs/homeless/TALK_homeless_broker.json create mode 100644 data/json/npcs/homeless/TALK_homeless_group_survivors.json create mode 100644 data/json/npcs/homeless/TALK_homeless_survivor.json create mode 100644 data/json/npcs/homeless/group_camp_missions.json create mode 100644 data/json/npcs/homeless/homeless_broker_sell.json create mode 100644 data/json/npcs/homeless/nested_homeless_missions.json create mode 100644 data/json/npcs/homeless/shelter_survivors.json create mode 100644 data/json/npcs/lumberyard/TALK_lumbermill_logger.json create mode 100644 data/json/npcs/lumberyard/TALK_lumbermill_merchant.json create mode 100644 data/json/npcs/lumberyard/lumbermill_effects.json create mode 100644 data/json/npcs/lumberyard/lumbermill_employees.json create mode 100644 data/json/npcs/lumberyard/lumbermill_missions.json create mode 100644 data/json/npcs/moonshiner/TALK_NPC_moonshiner.json create mode 100644 data/json/npcs/prepper/TALK_NPC_prepper.json create mode 100644 data/json/npcs/scrap_trader/scrap_trader.json create mode 100644 data/json/npcs/scrap_trader/scrap_trader_missions.json diff --git a/data/json/itemgroups/misc.json b/data/json/itemgroups/misc.json index 77afd11bac23..589b1593ba37 100644 --- a/data/json/itemgroups/misc.json +++ b/data/json/itemgroups/misc.json @@ -211,5 +211,22 @@ { "item": "holybook_bible1", "prob": 3 }, { "item": "candlestick", "prob": 2 } ] + }, + { + "type": "item_group", + "id": "cabin_chemist_sell", + "items": [ { "group": "chem_lab", "prob": 100 }, { "group": "harddrugs", "prob": 70 }, { "group": "tools_medical", "prob": 80 } ] + }, + { + "type": "item_group", + "id": "still_alcohol", + "//": "Alcohol you'd find in at a still or moonshine camp", + "subtype": "distribution", + "entries": [ + { "item": "moonshine", "prob": 86 }, + { "item": "beer", "prob": 80 }, + { "item": "fruit_wine", "prob": 40 }, + { "item": "brandy", "prob": 20 } + ] } ] diff --git a/data/json/items/fluff.json b/data/json/items/fluff.json index db8caf67ec50..6dce868e256f 100644 --- a/data/json/items/fluff.json +++ b/data/json/items/fluff.json @@ -1,4 +1,55 @@ [ + { + "id": "trade_writ_chemist", + "type": "BOOK", + "name": { "str": "writ of trade (chemist)", "str_pl": "writs of trade (chemist)" }, + "description": "A few sheets of paper from the chemist living out in the wilderness listing some of the chemical they're capable of making.", + "weight": "1 g", + "volume": "5 ml", + "price": 3000, + "price_postapoc": 50, + "bashing": 1, + "material": [ "paper" ], + "symbol": "?", + "looks_like": "mag_glam", + "color": "light_cyan", + "intelligence": 5, + "time": "10 m" + }, + { + "id": "trade_writ_scrap", + "type": "BOOK", + "name": { "str": "writ of trade (scrap)", "str_pl": "writs of trade (scrap)" }, + "description": "A handwritten listing of the inventory at the scrapyard.", + "weight": "1 g", + "volume": "5 ml", + "price": 3000, + "price_postapoc": 50, + "bashing": 1, + "material": [ "paper" ], + "symbol": "?", + "looks_like": "mag_glam", + "color": "light_cyan", + "intelligence": 5, + "time": "10 m" + }, + { + "id": "trade_writ_lumberyard", + "type": "BOOK", + "name": { "str": "writ of trade (lumberyard)", "str_pl": "writs of trade (lumberyard)" }, + "description": "A printout of the local lumberyard's latest inventory.", + "weight": "1 g", + "volume": "5 ml", + "price": 3000, + "price_postapoc": 50, + "bashing": 1, + "material": [ "paper" ], + "symbol": "?", + "looks_like": "mag_glam", + "color": "light_cyan", + "intelligence": 5, + "time": "10 m" + }, { "id": "magic_8_ball", "type": "GENERIC", diff --git a/data/json/mapgen/apartment_con_new.json b/data/json/mapgen/apartment_con_new.json index db819b8328b5..6d36734b9aea 100644 --- a/data/json/mapgen/apartment_con_new.json +++ b/data/json/mapgen/apartment_con_new.json @@ -345,6 +345,72 @@ "type": "mapgen", "weight": 250 }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "apartments_con_tower_113", "apartments_con_tower_013" ], + [ "apartments_con_tower_102", "apartments_con_tower_002" ] + ], + "weight": 250, + "object": { + "fill_ter": "t_floor", + "rows": [ + "************************************************", + "***|------|-|-|ww---|******|---ww|-|-|------|***", + "***|.dBBd.+r|u+..e3u|******|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|******|2ii..|-|-|..BB..w***", + "***w.h....|STb|..iiO|******|Oii..|bTS|......w***", + "***|CxC...+iib|j.uu1|******|uu1.j|bii+....X.|***", + "***|--|-+-|-+-|..lll|-WWWW-|lll..|-+-|-+-|--|***", + "***R,,+......nt.....|^.....|........nt...+,,R***", + "***R,,w..F..........D......D.............w,,R***", + "***R,,w..F.......|+-|p....p|-+|..........w,,R***", + "***R,Q|..F.I.FFF^|.Y|......|Y.|oo.FFFFI.^|Q,R***", + "***|------|-|-|--|--|......|--|--|-|-|------|***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", + "***w......|STb|..iiO|......|Oii..|bTS|......w***", + "***|oX....+iib|j.uu1|......|uu1.j|bii+....X.|***", + "***|--|-+-|-+-|..lll|.....^|lll..|-+-|-+-|--|***", + "***R,,+...tn........|p....p|.........nt..+,,R***", + "***R,,w.............D......D......A......w,,R***", + "***R,,w..A.....FI|+-|......|-+|..........w,,R***", + "***R,Q|.....FFFF^|.Y|......|Y.|^...IFFF.o|Q,R***", + "***|------------||--|......|--||------------|***", + "***|%%%%%%%%%%%%|<,,G......=EE`|%%%%%%%%%%%%|***", + "***|%%%%%%%%%%%%|>,,G......=EEE|%%%%%%%%%%%%|***", + "***|------|-|-|-|---|......|---|-|-|-|------|***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|......|2ii..|-|-|..BB..w***", + "***w......|STb|..iiO|......|Oii..|bTS|......w***", + "***|oo....+iib|..uu1|^.....|uu1.j|bii+....X.|***", + "***|--|-+-|-+-|..lll|......|lll..|-+-|-+-|--|***", + "***R,,+...tn........|......|........nt...+,,R***", + "***R,,w.............D......D.............w,,R***", + "***R,,w..A....A..|+-|p....p|-+|I..htth...w,,R***", + "***R,Q|...FFFI..^|.Y|......|Y.|^..htth.oo|Q,R***", + "***|------|-|-|--|--|......|--|--|-|-|------|***", + "***|.dBBd.+r|u+..e3u|......|u3e..+u|r+.dBBd.|***", + "***w..BB..|-|-|..ii2|.....^|2ii..|-|-|..BB..w***", + "***w......|STb|..iiO|......|Oii..|bTS|......w***", + "***|.X....+iib|j.uu1|......|uu1.j|bii+....X.|***", + "***|--|-+-|-+-|^.lll|......|lll..|-+-|-+-|--|***", + "***R,,+...A..nt.....|p....p|........tn...+,,R***", + "***R,,w.............D......D...........A.w,,R***", + "***R,,w.........o|+-|-WWWW-|-+|..A...h...w,,R***", + "***R,Q|..A.FFFI.o|.Y|******|Y.|o...ICxC.^|Q,R***", + "***|RR|--ww---ww-|--|******|--|-ww---ww--|RR|***", + "************************************************", + "************************************************", + "************************************************" + ], + "palettes": [ "apartment_palette" ], + "faction_owner": [ { "id": "no_faction", "x": [ 0, 23 ], "y": [ 30, 39 ] } ], + "place_zones": [ { "type": "NPC_NO_INVESTIGATE", "faction": "wasteland_scavengers", "x": [ 0, 13 ], "y": [ 30, 39 ] } ], + "place_npcs": [ { "class": "apartment_survivor", "x": 8, "y": 37 } ] + } + }, { "method": "json", "object": { diff --git a/data/json/mapgen/campsite.json b/data/json/mapgen/campsite.json index 6a7029a359bd..6fad503ffe41 100644 --- a/data/json/mapgen/campsite.json +++ b/data/json/mapgen/campsite.json @@ -339,5 +339,395 @@ "place_item": [ { "item": "log", "x": 17, "y": 3, "amount": [ 3, 8 ] } ], "place_monsters": [ { "monster": "CAMPERS", "x": [ 0, 23 ], "y": [ 0, 23 ], "chance": 40, "repeat": [ 1, 3 ] } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "campsite" ], + "weight": 200, + "object": { + "predecessor_mapgen": "forest", + "rows": [ + " ", + " ", + " S.... ", + " ..... ", + " ..... ", + " ..... ", + " ..... ", + " ... ", + " E.... W.... ", + " ...... ...... ", + " ...... .-. ...... ", + " ...... -ddd- ...... ", + " ..... .dbd. ..... ", + " -ddd- ", + " E.... .-. W.... ", + " ...... ...... ", + " ...... ...... ", + " ...... ... ...... ", + " ..... N.... ..... ", + " ..... ", + " ..... ", + " ..... ", + " ..... ", + " " + ], + "nested": { + "N": { "chunks": [ [ "tent_3x3_N", 20 ], [ "tent_5x5_N", 10 ], [ "null", 5 ] ] }, + "S": { "chunks": [ [ "tent_3x3_S", 20 ], [ "tent_5x5_S", 10 ], [ "null", 5 ] ] }, + "E": { "chunks": [ [ "tent_3x3_E", 20 ], [ "tent_5x5_E", 10 ], [ "null", 5 ] ] }, + "W": { "chunks": [ [ "tent_3x3_W", 20 ], [ "tent_5x5_W", 10 ], [ "null", 5 ] ] } + }, + "place_npcs": [ { "class": "survivor_camper", "x": 10, "y": 10 } ], + "terrain": { + "-": "t_region_groundcover", + "b": "t_pit_shallow", + "d": "t_region_soil", + "r": "t_region_groundcover", + ".": [ [ "t_region_groundcover", 2 ], "t_region_groundcover_forest" ], + "S": "t_region_groundcover", + "E": "t_region_groundcover", + "W": "t_region_groundcover", + "N": "t_region_groundcover" + }, + "furniture": { "-": "f_camp_chair", "b": "f_firering", "r": "f_tourist_table" }, + "place_items": [ + { "item": "cannedfood", "x": [ 5, 16 ], "y": [ 7, 17 ], "chance": 75 }, + { "item": "cannedfood", "x": [ 5, 16 ], "y": [ 7, 17 ], "chance": 75 }, + { "item": "pasta", "x": [ 5, 16 ], "y": [ 7, 17 ], "chance": 75 }, + { "item": "camping", "x": [ 5, 16 ], "y": [ 7, 17 ], "chance": 75 } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_3x3_S", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "###", + "#x#", + "#+#" + ], + "terrain": { "#": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_canvas_wall", "x": "f_groundsheet", "+": "f_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_3x3_E", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "###", + "#x+", + "###" + ], + "terrain": { "#": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_canvas_wall", "x": "f_groundsheet", "+": "f_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_3x3_N", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "#+#", + "#x#", + "###" + ], + "terrain": { "#": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_canvas_wall", "x": "f_groundsheet", "+": "f_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_3x3_W", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "###", + "+x#", + "###" + ], + "terrain": { "#": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_canvas_wall", "x": "f_groundsheet", "+": "f_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_5x5_S", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "#####", + "#xxx#", + "#xXx#", + "#xxx#", + "##+##" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_large_canvas_wall", "X": "f_center_groundsheet", "x": "f_large_groundsheet", "+": "f_large_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_5x5_E", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "#####", + "#xxx#", + "#xXx+", + "#xxx#", + "#####" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_large_canvas_wall", "X": "f_center_groundsheet", "x": "f_large_groundsheet", "+": "f_large_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "leather_tent_5x5_S", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "#####", + "#xxx#", + "#xXx#", + "#xxx#", + "##+##" + ], + "furniture": { "#": "f_skin_wall", "X": "f_skin_groundsheet", "x": "f_skin_groundsheet", "+": "f_skin_door" }, + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_5x5_N", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "##+##", + "#xxx#", + "#xXx#", + "#xxx#", + "#####" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_large_canvas_wall", "X": "f_center_groundsheet", "x": "f_large_groundsheet", "+": "f_large_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_5x5_W", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "#####", + "#xxx#", + "+xXx#", + "#xxx#", + "#####" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { "#": "f_large_canvas_wall", "X": "f_center_groundsheet", "x": "f_large_groundsheet", "+": "f_large_canvas_door" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_3x3_S", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "###", + "#x#", + "#+#" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_3x3_E", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "###", + "#x+", + "###" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_3x3_N", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "#+#", + "#x#", + "###" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_3x3_W", + "object": { + "mapgensize": [ 3, 3 ], + "rotation": [ 0, 3 ], + "rows": [ + "###", + "+x#", + "###" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_5x5_S", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "#####", + "#xxx#", + "#xXx#", + "#xxx#", + "##+##" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_5x5_E", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "#####", + "#xxx#", + "#xXx+", + "#xxx#", + "#####" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_5x5_N", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "##+##", + "#xxx#", + "#xXx#", + "#xxx#", + "#####" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "tent_b_5x5_W", + "object": { + "mapgensize": [ 5, 5 ], + "rotation": [ 0, 3 ], + "rows": [ + "#####", + "#xxx#", + "+xXx#", + "#xxx#", + "#####" + ], + "terrain": { "#": "t_null", "X": "t_null", "x": "t_null", "+": "t_null" }, + "furniture": { + "#": [ [ "f_large_canvas_wall", 5 ], "f_null" ], + "X": [ [ "f_center_groundsheet", 5 ], "f_null" ], + "x": [ [ "f_large_groundsheet", 5 ], "f_null" ], + "+": [ [ "f_large_canvas_door", 5 ], "f_null" ] + } + } } ] diff --git a/data/json/mapgen/chemical_lab.json b/data/json/mapgen/chemical_lab.json new file mode 100644 index 000000000000..791ac88a691c --- /dev/null +++ b/data/json/mapgen/chemical_lab.json @@ -0,0 +1,76 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "chemical_lab_ocu" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "........................", + "........................", + "........................", + "........................", + "......---------------...", + "......-~~~~~~~~~~~~~-...", + "......-~~~~~00~~~~~~-...", + "......-~~##W##W##W#~-...", + "......-~~#A @ #~-...", + "......G~~= CCC#~-...", + "......-~~# RR W~-...", + "......-~~##### c#~-...", + "......-~~#B = tW~-...", + "......-~~#B #& c#~-...", + "......-~~###W##W###~-...", + "......-~~~~~~~~~~~~~-...", + "......---------------...", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................", + "........................" + ], + "palettes": [ "cabin_palette" ], + "faction_owner": [ { "id": "wasteland_scavengers", "x": [ 1, 23 ], "y": [ 1, 23 ] } ], + "items": { "C": [ { "item": "cabin_chemist_sell", "chance": 100, "repeat": [ 4, 5 ] } ] }, + "npcs": { "@": { "class": "NPC_cabin_chemist" } } + } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "chemical_lab_roof_ocu" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " .......... ", + " .......... ", + " .......... ", + " .......... ", + " .......... ", + " .......... ", + " .......... ", + " .......... ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "roof_palette" ], + "terrain": { ".": "t_tar_flat_roof" } + } + } +] diff --git a/data/json/mapgen/fortified_scrap_yard.json b/data/json/mapgen/fortified_scrap_yard.json new file mode 100644 index 000000000000..9b0c711902d4 --- /dev/null +++ b/data/json/mapgen/fortified_scrap_yard.json @@ -0,0 +1,116 @@ +[ + { + "method": "json", + "object": { + "furniture": { + "#": "f_wreckage", + "&": "f_sink", + "9": "f_aut_gas_console_o", + "B": "f_bathtub", + "D": "f_dumpster", + "V": "f_vending_o", + "a": "f_counter", + "d": "f_chair", + "e": "f_bigmirror_b", + "f": "f_washer", + "g": "f_bigmirror_b", + "h": "f_washer", + "i": "f_desk", + "l": "f_locker", + "o": "f_oven", + "r": "f_rack", + "v": "f_vending_c", + "w": "f_wreckage", + "{": "f_vending_o", + "%": "f_makeshift_bed" + }, + "place_items": [ + { "chance": 25, "item": "vending_food", "x": 4, "y": 9 }, + { "chance": 25, "item": "trash", "x": 11, "y": 20 }, + { "chance": 25, "item": "trash", "x": 2, "y": 19 }, + { "chance": 25, "item": "trash", "x": 19, "y": 17 }, + { "chance": 25, "item": "trash", "x": 15, "y": 13 }, + { "chance": 10, "item": "supplies_spares_vehicle", "x": 8, "y": 19 }, + { "chance": 10, "item": "supplies_spares_vehicle", "x": 3, "y": 16 }, + { "chance": 10, "item": "supplies_spares_vehicle", "x": 16, "y": 15 }, + { "chance": 25, "item": "vending_drink", "x": 5, "y": 9 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 18, "y": 20 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 16, "y": 20 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 4, "y": 19 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 16, "y": 18 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 22, "y": 16 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 14, "y": 16 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 9, "y": 15 }, + { "chance": 15, "item": "vehicle_scrapped", "x": 3, "y": 14 }, + { "chance": 10, "item": "tools_mechanic", "x": 5, "y": 5 } + ], + "rows": [ + "$$$$$$$$C.......C$$$$$$$", + "$||||||||.......|||||||$", + "$|..................u.|$", + "$|.------..........usu|$", + "$|.-_a_%-S........uuu7|$", + "$|.-~a__+S..........uu|$", + "$|.-_a__-S.........usu|$", + "$|.-____-..........uu.|$", + "$|.-____b...........u.|$", + "$|.-vv_%-..........uuu|$", + "$|.---b--..........us7|$", + "$|..................uu|$", + "$|.................u.u|$", + "$|.....o....#.........|$", + "$|....#.....#......#..|$", + "$|..9gw....##..#.wW..#|$", + "$|..#wh##{#wW&..DWV#l.|$", + "$|.#Bww9..#Ww#.#oww#..|$", + "$|...dwe##iwW.B##wd#f.|$", + "$|..#Ww....wwf.{.Vw#.#|$", + "$|.{..ro#.#ww#.....e#.|$", + "$|..##.#.#.wW#..#.##.#|$", + "$||||||||||||||||||||||$", + "$$$$$$$$$$$$$$$$$$$$$$$$" + ], + "terrain": { + "#": "t_dirt", + "$": "t_fence_barbed", + "&": "t_dirt", + "+": "t_door_c", + "-": "t_wall", + ".": "t_dirt", + "7": "t_tree_dead", + "9": "t_dirt", + "B": "t_dirt", + "C": "t_chainfence_posts", + "D": "t_dirt", + "S": "t_sidewalk", + "V": "t_wall_metal", + "W": "t_wall_metal", + "_": "t_floor", + "a": "t_floor", + "b": "t_window_domestic", + "c": "t_chainfence_h", + "d": "t_wall_metal", + "e": "t_dirt", + "f": "t_dirt", + "g": "t_wall_metal", + "h": "t_wall_metal", + "i": "t_dirt", + "l": "t_dirt", + "o": "t_dirt", + "r": "t_dirt", + "s": "t_shrub", + "u": "t_underbrush", + "v": "t_floor", + "w": "t_wall_metal", + "{": "t_dirt", + "|": "t_junk_palisade", + "%": "t_floor", + "~": "t_floor" + }, + "faction_owner": [ { "id": "wasteland_scavengers", "x": [ 1, 23 ], "y": [ 1, 23 ] } ], + "npcs": { "~": { "class": "NPC_scrap_trader" } } + }, + "om_terrain": "smallscrapyard_ocu", + "type": "mapgen" + } +] diff --git a/data/json/mapgen/homeless_camp.json b/data/json/mapgen/homeless_camp.json index 3eecceef7885..434ae918d588 100644 --- a/data/json/mapgen/homeless_camp.json +++ b/data/json/mapgen/homeless_camp.json @@ -408,5 +408,456 @@ "om_terrain": "homelesscamp", "type": "mapgen", "weight": 100 + }, + { + "method": "json", + "om_terrain": "homelesscamp", + "type": "mapgen", + "weight": 300, + "object": { + "furniture": { + "#": "f_null", + "+": "f_canvas_door", + ".": "f_null", + "4": "f_null", + "7": "f_null", + "C": "f_chair", + "S": "f_straw_bed", + "W": "f_null", + "_": "f_null", + "a": "f_woodstove", + "b": "f_canvas_door_o", + "c": "f_canvas_wall", + "d": "f_null", + "i": "f_cattails", + "m": "f_makeshift_bed", + "s": "f_null", + "w": "f_null" + }, + "place_items": [ + { "chance": 10, "item": "harddrugs", "x": 5, "y": 17 }, + { "chance": 20, "item": "male_underwear_bottom", "x": 17, "y": 10 }, + { "chance": 20, "item": "male_underwear_bottom", "x": 16, "y": 8 }, + { "chance": 25, "item": "trash", "x": 19, "y": 21 }, + { "chance": 25, "item": "trash", "x": 7, "y": 21 }, + { "chance": 25, "item": "trash", "x": 2, "y": 17 }, + { "chance": 25, "item": "trash", "x": 15, "y": 15 }, + { "chance": 25, "item": "trash", "x": 6, "y": 14 }, + { "chance": 25, "item": "trash", "x": 7, "y": 10 }, + { "chance": 10, "item": "shoes", "x": 10, "y": 10 }, + { "chance": 5, "item": "female_underwear_bottom", "x": 16, "y": 9 }, + { "chance": 30, "item": "alcohol", "x": 11, "y": 8 }, + { "chance": 10, "item": "forest", "x": 21, "y": 12 }, + { "chance": 10, "item": "forest", "x": 3, "y": 2 } + ], + "rows": [ + "........................", + "................._......", + ".....#._...#.._......_..", + "..##7s...s4###._......_.", + ".####..#s###.......w....", + "..#..............iwww#..", + "....!!!!!!!!!!!!iwwwww..", + ".._!4#...ccccc.!#.wWww#.", + "...!#_...cmdmc.!!wwWWWw.", + "...!#.#..cdddc..!wwWWww.", + ".s4!!#...cdddc..!.wwwww.", + "..s#!!.@.ccc+c._!ss.wi..", + "...#_!....____..!.sss...", + ".....!!!!!!!.!!!!..ss#..", + "........C_____S..._.4#..", + "._..cccc.__a____.._..##.", + "....cmdc______S.....##s.", + "....cddb_______##..s##..", + ".#..cddc__C_C.s#4..##_..", + ".#..cccc..__..s...._....", + ".###......__............", + ".4##..._...s###_.._.....", + "..s.#_....s##7......_...", + ".........._............." + ], + "terrain": { + "#": "t_underbrush", + "+": "t_dirtfloor", + ".": "t_grass", + "4": "t_tree_pine", + "7": "t_tree", + "C": "t_dirt", + "S": "t_dirt", + "W": "t_water_dp", + "_": "t_dirt", + "a": "t_dirt", + "b": "t_dirtfloor", + "c": "t_grass", + "d": "t_dirtfloor", + "i": "t_grass", + "m": "t_dirtfloor", + "s": "t_shrub", + "w": "t_water_sh", + "!": "t_trunk", + "@": "t_dirt" + }, + "npcs": { "@": { "class": "NPC_homeless_survivor" } } + } + }, + { + "method": "json", + "om_terrain": "homelesscamp", + "type": "mapgen", + "weight": 300, + "object": { + "furniture": { + "#": "f_null", + "+": "f_canvas_door", + ".": "f_null", + "4": "f_null", + "7": "f_null", + "C": "f_chair", + "S": "f_straw_bed", + "W": "f_null", + "_": "f_null", + "a": "f_woodstove", + "b": "f_canvas_door_o", + "c": "f_canvas_wall", + "d": "f_null", + "i": "f_cattails", + "m": "f_makeshift_bed", + "s": "f_null", + "w": "f_null" + }, + "place_items": [ + { "chance": 10, "item": "harddrugs", "x": 5, "y": 17 }, + { "chance": 20, "item": "male_underwear_bottom", "x": 17, "y": 10 }, + { "chance": 20, "item": "male_underwear_bottom", "x": 16, "y": 8 }, + { "chance": 25, "item": "trash", "x": 19, "y": 21 }, + { "chance": 25, "item": "trash", "x": 7, "y": 21 }, + { "chance": 25, "item": "trash", "x": 2, "y": 17 }, + { "chance": 25, "item": "trash", "x": 15, "y": 15 }, + { "chance": 25, "item": "trash", "x": 6, "y": 14 }, + { "chance": 25, "item": "trash", "x": 7, "y": 10 }, + { "chance": 10, "item": "shoes", "x": 10, "y": 10 }, + { "chance": 5, "item": "female_underwear_bottom", "x": 16, "y": 9 }, + { "chance": 30, "item": "alcohol", "x": 11, "y": 8 }, + { "chance": 10, "item": "forest", "x": 21, "y": 12 }, + { "chance": 10, "item": "forest", "x": 3, "y": 2 } + ], + "rows": [ + "........................", + "................._......", + ".....#._...#.._......_..", + "..##7s...s4###._......_.", + ".####..#s###.......w....", + "..#..............iwww#..", + ".!!!!!!!!!!!!!!!iwwwww..", + ".!_.4#...ccccc.!#.wWww#.", + ".!..#_...c~~~c.!!wwWWWw.", + ".!..#.#..c~@~c..!wwWWww.", + ".!4..#...cmddc..!.wwwww.", + ".!s#.....ccc+c._!ss.wi..", + ".!.#_.....____..!.sss...", + ".!`.............!..ss#..", + "........C_____S`!._.4#..", + ".!`.cccc.__a____!._..##.", + ".!..cmmc______S.!!..##s.", + ".!!.cmdb_______##!.s##..", + ".#!.cmmc__C_C.s#4!.##_..", + ".#!!cccc..__..s..!._....", + ".##!!!!!!!!!!!!!!!......", + ".4##..._...s###_.._.....", + "..s.#_....s##7......_...", + ".........._............." + ], + "terrain": { + "#": "t_underbrush", + "+": "t_dirtfloor", + ".": "t_grass", + "4": "t_tree_pine", + "7": "t_tree", + "C": "t_dirt", + "S": "t_dirt", + "W": "t_water_dp", + "_": "t_dirt", + "a": "t_dirt", + "b": "t_dirtfloor", + "c": "t_grass", + "d": "t_dirtfloor", + "i": "t_grass", + "m": "t_dirtfloor", + "s": "t_shrub", + "w": "t_water_sh", + "!": "t_trunk", + "@": "t_dirtfloor", + "`": "t_dirtfloor", + "~": "t_dirtfloor" + }, + "npcs": { "@": { "class": "NPC_homeless_broker" }, "`": { "class": "NPC_homeless_group_survivor" } }, + "faction_owner": [ { "id": "wasteland_scavengers", "x": [ 0, 23 ], "y": [ 0, 23 ] } ], + "items": { "~": [ { "item": "homeless_broker_sell", "chance": 100, "repeat": [ 30, 45 ] } ] } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_blank_temp", + "//": "Just showcases the position of stuff. Not to be used.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!!!!!!!!! ", + " ! ccccc ! ", + " ! c~~~c !! ", + " ! c~@~c ! ", + " ! cmddc ! ", + " ! ccc+c ! ", + " ! ! ", + " !` ! ", + " `! ", + " !` cccc ! ", + " ! cmmc !! ", + " !! cmdb ! ", + " ! cmmc ! ", + " !!cccc ! ", + " !!!!!!!!!!!!!!! ", + " ", + " ", + " " + ], + "terrain": { + "!": "t_grass", + "`": "t_grass", + "d": "t_grass", + "~": "t_grass", + "c": "t_grass", + "b": "t_grass", + "m": "t_grass", + "+": "t_grass", + "@": "t_grass" + }, + "furniture": { "m": "f_straw_bed" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_1", + "//": "Phase 1 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!!!!!!!!! ", + " ! ! ", + " ! !! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! !! ", + " !! ! ", + " ! ! ", + " !! ! ", + " !!!!!!!!!!!!!!! ", + " ", + " ", + " " + ], + "terrain": { "!": "t_wall_wood" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_2", + "//": "Phase 2 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ccccc ", + " c c ", + " c c ", + " c c ", + " ccc c ", + " ", + " ", + " ", + " cccc ", + " c c ", + " c ", + " c c ", + " cccc ", + " ", + " ", + " ", + " " + ], + "terrain": { "c": "t_wall_wood" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_3", + "//": "Phase 3 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "~1~ ", + " ! ", + " ! ", + " ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { "!": "t_palisade_gate", "~": "t_palisade_pulley", "1": "t_palisade" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_4", + "//": "Phase 4 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " 01 ", + " !! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { "0": "t_pit_shallow", "!": "t_wall_wood", "1": "t_door_c" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_5", + "//": "Phase 5 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " @! ", + " ", + " ", + " ", + " " + ], + "terrain": { "!": "t_dirt", "@": "t_dirt" }, + "furniture": { "!": "f_smoking_rack", "@": "f_kiln_empty" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_expand_1", + "//": "Phase 1 of homeless expansions.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " qqqq ", + " ////////++//////// ", + " /qqqqqqqqqqqqqqqq/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /q..q..q..q..q..q/ ", + " /qqqqqqqqqqqqqqqq/ ", + " ////////////////// ", + " ", + " ", + " " + ], + "terrain": { ".": "t_dirtmound", "q": "t_grass", "/": "t_splitrail_fence", "+": "t_splitrail_fencegate_c" }, + "sealed_item": { ".": { "item": { "item": "seed_zucchini" }, "furniture": "f_plant_seedling", "chance": 100 } } + } } ] diff --git a/data/json/mapgen/house_prepper.json b/data/json/mapgen/house_prepper.json new file mode 100644 index 000000000000..080590c5dbae --- /dev/null +++ b/data/json/mapgen/house_prepper.json @@ -0,0 +1,75 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house_prepper" ], + "weight": 10, + "//": "extremely low weight due to the awesomeness within", + "//2": "I'd handwave the utility light as being powered by a generator in the basement. Besides, it's too easy to steal from the prepper in the dark.", + "object": { + "fill_ter": "t_floor", + "faction_owner": [ { "id": "no_faction", "x": [ 0, 23 ], "y": [ 12, 23 ] } ], + "rows": [ + "...%%%...!```!p.%%%.....", + ".###$$#####==##########.", + ".#HHHs sL|t-8S88#.", + ".$Hl ER +------$.", + ".#H sR y|QQb-BB#.", + ".$T ER ||||||||#.", + ".#y xxx | hh J 1#^", + ".#||||||||| ff J 2#.", + ".#I@@ IIy + hh J 3$.", + ".$ @@ |||+| J 5$.", + ".#D ETdy|vU>|6 4#.", + ".##########/###6JJYO7F#.", + ".#6 R#########.", + ".#6 @@ @@ RTHHHHs#.", + ".#6 E l H#.", + ".#6 @@ @@ E l H#.", + ".#NA & H#.", + ".#N @@ @@ hhhh #.", + ".#k ffff R#.", + ".#J @@ @@ f hhhh R#.", + ".# h #.", + ".# UUUUU qqqqq qqqq#.", + ".######################.", + "............^..........." + ], + "palettes": [ "standard_domestic_palette" ], + "place_npcs": [ { "class": "prepper_survivor", "x": 13, "y": 20 } ], + "place_zones": [ { "type": "LOOT_UNSORTED", "faction": "no_faction", "x": [ 11, 15 ], "y": 21 } ], + "terrain": { + "%": [ "t_region_shrub", "t_region_shrub_fruit", "t_region_shrub_decorative" ], + "!": "t_region_groundcover_urban", + "`": "t_concrete", + "#": "t_adobe_brick_wall", + "t": "t_linoleum_gray", + "S": "t_linoleum_gray", + "Q": "t_linoleum_gray", + "8": "t_linoleum_gray", + "B": "t_linoleum_gray", + "b": "t_linoleum_gray", + "-": "t_linoleum_gray", + "$": "t_window_boarded", + "&": "t_utility_light", + "=": "t_door_locked", + "/": "t_door_metal_pickable" + }, + "furniture": { "!": "f_region_flower" }, + "place_loot": [ { "item": "television", "x": 5, "y": 6 }, { "item": "stereo", "x": 6, "y": 6 } ], + "place_items": [ + { "item": "oven", "x": 2, "y": 19, "chance": 80 }, + { "item": "homeguns", "x": [ 4, 8 ], "y": 21, "chance": 60, "repeat": [ 1, 3 ] }, + { "item": "lmoe_guns", "x": [ 4, 8 ], "y": 21, "chance": 40, "repeat": [ 1, 2 ] }, + { "item": "ammo_reloaded", "x": [ 4, 8 ], "y": 21, "chance": 30, "repeat": [ 1, 6 ] }, + { "item": "magazines", "x": [ 8, 8 ], "y": [ 3, 5 ], "chance": 50 }, + { "item": "homeguns", "x": [ 11, 15 ], "y": 21, "chance": 60, "repeat": [ 3, 4 ] }, + { "item": "lmoe_guns", "x": [ 11, 15 ], "y": 21, "chance": 40, "repeat": [ 2, 3 ] }, + { "item": "ammo_reloaded", "x": [ 11, 15 ], "y": 21, "chance": 30, "repeat": [ 1, 6 ] }, + { "item": "novels", "x": [ 13, 13 ], "y": [ 10, 12 ], "chance": 70, "repeat": [ 1, 4 ] }, + { "item": "gear_survival", "x": [ 11, 15 ], "y": 21, "chance": 80, "repeat": [ 6, 8 ] }, + { "item": "gear_survival", "x": [ 18, 21 ], "y": 21, "chance": 50, "repeat": [ 6, 8 ] } + ] + } + } +] diff --git a/data/json/mapgen/moonshine_camp.json b/data/json/mapgen/moonshine_camp.json index 654909613315..4a1d3c1941b0 100644 --- a/data/json/mapgen/moonshine_camp.json +++ b/data/json/mapgen/moonshine_camp.json @@ -82,6 +82,94 @@ ] } }, + { + "method": "json", + "om_terrain": "moonshine_still", + "type": "mapgen", + "weight": 10000, + "object": { + "fill_ter": "t_region_groundcover", + "faction_owner": [ { "id": "no_faction", "x": [ 0, 23 ], "y": [ 0, 23 ] } ], + "rows": [ + " ", + " ", + " ", + " ", + " ___ ", + " _c___ ", + " ___c_ ", + " _a___ ", + " _____ ", + " ________ ", + " ||||++|++|____ ", + " |Od+ddddd|w____ ", + " |Od|bdddd|w____ ", + " |^^|tttd~| _ ", + " |||||||||| ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { + "#": "t_underbrush", + "+": "t_dirtfloor", + ".": "t_grass", + "4": "t_tree_pine", + "7": "t_tree", + "B": "t_grass", + "C": "t_dirtfloor", + "D": "t_dirtmound", + "O": "t_dirtfloor", + "T": "t_tree_maple", + "^": "t_dirtfloor", + "b": "t_dirtfloor", + "d": "t_dirtfloor", + "e": "t_tree_hickory", + "s": "t_shrub", + "t": "t_dirtfloor", + "_": "t_grass", + "w": "t_grass", + "|": "t_wall_wood" + }, + "furniture": { + "+": "f_canvas_door", + "B": "f_boulder_small", + "C": "f_canvas_door_o", + "H": "f_wood_keg", + "O": "f_fvat_empty", + "^": "f_still", + "a": "f_ash", + "b": "f_chair", + "c": "f_chair", + "o": "f_boulder_small", + "t": "f_table", + "~": "f_makeshift_bed", + "w": "f_wood_keg" + }, + "place_npcs": [ { "class": "survivor_moonshiner", "x": 13, "y": 12 } ], + "place_zones": [ + { "type": "LOOT_UNSORTED", "faction": "no_faction", "x": [ 14, 14 ], "y": [ 13, 13 ] }, + { "type": "LOOT_DRINK", "faction": "no_faction", "x": [ 12, 13 ], "y": [ 13, 13 ] } + ], + "place_items": [ + { "item": "still_alcohol", "x": [ 12, 13 ], "y": [ 13, 13 ], "chance": 100, "repeat": [ 20, 43 ] }, + { "item": "keg_wine_intact", "x": [ 12, 13 ], "y": [ 13, 13 ], "chance": 70, "repeat": [ 2, 5 ] } + ], + "place_loot": [ + { "item": "cig_butt", "x": 12, "y": 6 }, + { "item": "cig_butt", "x": 18, "y": 7 }, + { "item": "shovel", "x": 21, "y": 12 }, + { "item": "stepladder", "x": 21, "y": 13 }, + { "item": "blanket", "x": 16, "y": 13 } + ] + } + }, { "type": "mapgen", "method": "json", diff --git a/data/json/mapgen/occupied_lumber_mill.json b/data/json/mapgen/occupied_lumber_mill.json new file mode 100644 index 000000000000..89d349f1871c --- /dev/null +++ b/data/json/mapgen/occupied_lumber_mill.json @@ -0,0 +1,312 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ + [ "lumbermill_0_0_ocu", "lumbermill_1_0_ocu" ], + [ "lumbermill_0_1_ocu", "lumbermill_1_1_ocu" ], + [ "lumbermill_0_0_roof", "lumbermill_1_0_roof" ], + [ "lumbermill_0_1_roof", "lumbermill_1_1_roof" ] + ], + "weight": 20, + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "vvvvvvvvvvvvvvvvvv#;;;;;;;;;;#vvvvvvvvvvvvvvvvvv", + "v * * 0 *______ *60 2 * v", + "v * 2 ______ 7 2v", + "v ______ * 2 v", + "v*2 7 * * ______ * * v", + "v *###ww####ww### * ________ * ##ww#ww## v", + "v #xxxx..x.xxxx# __________ w.c...c.w *v", + "v #xx,,,,,,..xx# _______________#ddX.Xdd#* v", + "v* wx,=======@.xw _______________+......i# * v", + "v w.,=,,,T,...xw* _______________#.....0&# v", + "v #x,=,,......x#0 _________ 2 * #ddX.Xdd#7 v", + "v 2#x,=M,.C...0x# * _________ w.c....cw *v", + "v *#.,=,,.Cr..xx# __________* ######### v", + "v #.,=P,.Rr..xx# 2 __________ * * * V", + "v #x,=,,.Cr..x6#6 *__________ 2############# v", + "v *#x,=J,.C.....;________________#&.bb.bb.C.f# v", + "v #.,=,,.......;________________+..nn.nn.C.f#*v", + "v* wx,=,,,B,....;________________#..bb.bb.C.D# v", + "v wx,=======O..;_____________ #..........F#7v", + "v #xx,,,,,,....;_____________ *#.0..nc###### v", + "v 7#xx....0x..xx# __________ * wbnb.nc#S.+t#*v", + "#######+#########7 __________ 2wbnb...+..### v", + "#$.$#ll.ll#b.w *___________ 0#......#S.+t#*v", + "#$.$#.....#b0#__________________*###ww######## v", + "#$..+.bbb.+..+___________________________ * v", + "#$.$#.....#b.#______________________________ 0*v", + "#$.$#lllll#b.w _____________________________ v", + "##############0 _____________________________ v", + "v 2 ______________________________v", + "v 1111 11111 ______________________________v", + "v * * ______________________________v", + "v 1111 11111 ______________________________v", + "v ______________________________0v", + "v 111111 11111 ______________________________6#", + "v * _______________________________;", + "v 111111 111 ________________________________;", + "v 2 _________________________________;", + "v vvvvv *___________________________1 1 ___;", + "v vooov______________________ ____ 121 1 _#", + "v voGoV_____________ #.......#0 ____ 1 1*1 1 1 v", + "v vooov_________ #L.....L#* ____* 1 1 1 2 v", + "v vvvvv ______ * *wL.....Lw ____1 1 1 1 *v", + "v 1____ 2 #L.....L# * ____1 1* 1 v", + "v 1111111 1____ 7 wx..8..xw ____ * v", + "v1 ____* #xx.x.xx# ____ *111111 v", + "v1 1111111____ 2 #########* ____ 2 7 v", + "v1 2 0____6 * 2 0____6 * *v", + "vvvvvvvvv#;;;;#vvvvvvvvvvvvvvvvvv#;;;;#vvvvvvvvv", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%5-------------%%%%%%%%%%%%%%%%%--------5%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%zzzzzzzz|%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%zzzzzzzz|%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%zzzzzzzz|%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%zzzzzzzz|%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%zzzzzzzz|%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%zzzzzzzz|%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%333333335%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%------------5%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "%%%4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "5--4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%%%zzzzzzzzzzzz|%%", + "4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%%%3333333333335%%", + "4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "4zzzzzzzzzzzzz%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "53333333333333%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%4zzzzzzz|%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%4zzzzzzz|%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%4zzzzzzz|%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%4zzzzzzz|%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%4zzzzzzz|%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%4zzzzzzz|%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%533333335%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%", + "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" + ], + "palettes": [ "lumberyard" ], + "faction_owner": [ + { "id": "wasteland_scavengers", "x": [ 1, 23 ], "y": [ 1, 23 ] }, + { "id": "wasteland_scavengers", "x": [ 24, 47 ], "y": [ 24, 47 ] }, + { "id": "wasteland_scavengers", "x": [ 48, 71 ], "y": [ 48, 71 ] } + ], + "terrain": { "o": "t_concrete" }, + "gaspumps": { "G": { "fuel": "gasoline", "amount": [ 50000, 268750 ] } }, + "place_vehicles": [ + { "vehicle": "flatbed_truck", "x": [ 43, 45 ], "y": 33, "chance": 30, "fuel": 25, "status": 0, "rotation": 90 }, + { + "vehicle": "pickup", + "x": [ 35, 37 ], + "y": [ 28, 31 ], + "chance": 30, + "fuel": 25, + "status": 0, + "rotation": 90 + }, + { "vehicle": "car", "x": [ 29, 31 ], "y": [ 27, 30 ], "chance": 30, "fuel": 15, "status": 0, "rotation": 90 } + ], + "npcs": { "0": { "class": "NPC_lumbermill_logger" }, "8": { "class": "NPC_lumbermill_merchant" } } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "occupied_lum_wall_0_0", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + "vvvvvvvvvvvvvvvvvv ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v " + ], + "terrain": { "v": "t_wall_wood", "!": "t_rdoor_c" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "occupied_lum_wall_0_1", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "v ", + "vvvvvvvvv vvvvvvvvv" + ], + "terrain": { "v": "t_wall_wood", "!": "t_rdoor_c" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "occupied_lum_wall_1_0", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " vvvvv!vvvvvvvvvvvv", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v" + ], + "terrain": { "v": "t_wall_wood", "!": "t_rdoor_c" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "occupied_lum_wall_1_1", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " ", + " ", + " ", + " ", + " ", + " ", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + " v", + "vvvvvvvvv vvvvvvvvv" + ], + "terrain": { "v": "t_wall_wood", "!": "t_rdoor_c" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "occupied_lum_hotel_1_1", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " vvvv!0vvv ", + " vb!...!bv ", + " vvv...vvv ", + " vb!...!bv ", + " vvv...vvv ", + " vb!...!bv ", + " vvvv0vvvv ", + " ", + " " + ], + "terrain": { "v": "t_wall_wood", "!": "t_door_c", ".": "t_floor", "b": "t_floor", "0": "t_window" }, + "furniture": { "b": "f_makeshift_bed" } + } + } +] diff --git a/data/json/mapgen/ws_survivor_camp.json b/data/json/mapgen/ws_survivor_camp.json index a7f4adea12e9..e025933e14e9 100644 --- a/data/json/mapgen/ws_survivor_camp.json +++ b/data/json/mapgen/ws_survivor_camp.json @@ -120,5 +120,55 @@ { "monster": "GROUP_ZOMBIE_SURVIVOR_CAMP", "x": 12, "y": 8 } ] } + }, + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "ws_survivor_camp" ], + "weight": 10, + "object": { + "predecessor_mapgen": "field", + "faction_owner": [ { "id": "no_faction", "x": [ 0, 23 ], "y": [ 0, 23 ] } ], + "rows": [ + " pp pp ", + " pppppppp pppppppp ", + "pppppppp pppppppp", + "pppssr ssr ppp", + "ppsE sW pp", + "ppr c r c pp", + "pp pp", + "pp pp", + "pp ww pp", + "pp ssr ww ssr pp", + "ppsE sW pp", + "ppr c r c pp", + "pp O pp", + "pp pp", + "pp pp", + "pp ssr ssr pp", + "ppsE sW pp", + "ppr c r c pp", + "pp pp", + "pp pp", + "pp pp", + "ppp ppp", + "pppppppppppppppppppppppp", + " pppppppppppppppppppppp " + ], + "place_npcs": [ { "class": "survivor_camper", "x": 10, "y": 11 } ], + "nested": { + "E": { "chunks": [ [ "tent_3x3_E", 10 ], [ "tent_5x5_E", 20 ], [ "null", 5 ] ] }, + "W": { "chunks": [ [ "tent_3x3_W", 10 ], [ "tent_5x5_W", 20 ], [ "null", 5 ] ] } + }, + "terrain": { "O": "t_pit_shallow", "p": [ "t_pit_spiked" ] }, + "furniture": { "O": "f_firering" }, + "items": { + "c": { "item": "sc_loot_rare", "chance": 50, "repeat": [ 2, 3 ] }, + "r": { "item": "sc_loot_general", "chance": 70, "repeat": [ 2, 3 ] }, + "s": { "item": "sc_loot_equipment", "chance": 85, "repeat": [ 2, 3 ] }, + "w": { "item": "stash_wood", "chance": 100, "repeat": [ 2, 3 ] } + }, + "place_vehicles": [ { "vehicle": "surv_car", "x": 11, "y": 4, "chance": 70, "rotation": 270 } ] + } } ] diff --git a/data/json/monstergroups/misc.json b/data/json/monstergroups/misc.json index 513ec40ef710..4f923da40d39 100644 --- a/data/json/monstergroups/misc.json +++ b/data/json/monstergroups/misc.json @@ -220,5 +220,18 @@ { "monster": "mon_zombie_technician", "freq": 300, "cost_multiplier": 1 }, { "monster": "mon_secubot", "freq": 50, "cost_multiplier": 3 } ] + }, + { + "type": "monstergroup", + "name": "GROUP_INFESTED_SPAWN", + "//": "For Compromised Shelter scenario.", + "default": "mon_zombie_tough", + "monsters": [ + { "monster": "mon_zombie", "freq": 250, "pack_size": [ 2, 3 ], "cost_multiplier": 2 }, + { "monster": "mon_zombie_runner", "freq": 150, "cost_multiplier": 3 }, + { "monster": "mon_zombie_fat", "freq": 200, "cost_multiplier": 3 }, + { "monster": "mon_zombie_child", "freq": 200, "cost_multiplier": 3, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_survivor", "freq": 200, "cost_multiplier": 2, "starts": 800 } + ] } ] diff --git a/data/json/npcs/apartment_survivor/TALK_NPC_apartment_survivor.json b/data/json/npcs/apartment_survivor/TALK_NPC_apartment_survivor.json new file mode 100644 index 000000000000..0ed0b2d61e99 --- /dev/null +++ b/data/json/npcs/apartment_survivor/TALK_NPC_apartment_survivor.json @@ -0,0 +1,71 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_APARTMENT_SURVIVOR", + "dynamic_line": { + "npc_has_var": "knows_u", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "", + "no": "Freeze you !" + }, + "speaker_effect": { "effect": { "npc_add_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "&Hold up your hands. \"Don't worry, I'm not going to hurt you\"", + "topic": "TALK_NPC_APARTMENT_SURVIVOR_CALM", + "condition": { "not": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Hand over your stuff! Don't make any sudden moves, or you die!", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "", + "topic": "TALK_NPC_APARTMENT_SURVIVOR_INTRO", + "condition": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "Bye.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_APARTMENT_SURVIVOR_CALM", + "dynamic_line": "Oh, you're not one of the . Come on in, just don't cause any trouble.", + "responses": [ + { "text": "Alright, let's chat.", "topic": "TALK_NPC_APARTMENT_SURVIVOR_INTRO" }, + { "text": "I'll be back later.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_APARTMENT_SURVIVOR_INTRO", + "dynamic_line": "So, what's up?", + "responses": [ + { "text": "What are you doing in this deathtrap?", "topic": "TALK_NPC_APARTMENT_SURVIVOR_STORY" }, + { "text": "Care to trade?", "topic": "TALK_NPC_APARTMENT_SURVIVOR_INTRO", "effect": "start_trade" }, + { + "text": "Why don't you come with me?", + "trial": { "type": "PERSUADE", "difficulty": -15, "mod": [ [ "value", 2 ] ] }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "trust": 1, "value": 1 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "trust": 0, "fear": 0 } } + }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_APARTMENT_SURVIVOR_STORY", + "dynamic_line": "I used to live here before . I was asleep when a horde of busted through the front, and in the chaos I wound up here. When the screaming stopped, I peaked out the door to find my neighbor stumbling about with his face half-eaten, and I haven't left since.", + "responses": [ { "text": "Wow.", "topic": "TALK_NONE" } ] + } +] diff --git a/data/json/npcs/cabin_chemist/cabin_chemist.json b/data/json/npcs/cabin_chemist/cabin_chemist.json new file mode 100644 index 000000000000..973614b4678d --- /dev/null +++ b/data/json/npcs/cabin_chemist/cabin_chemist.json @@ -0,0 +1,258 @@ +[ + { + "type": "npc", + "id": "NPC_cabin_chemist", + "class": "NC_CHEM_MERCHANT", + "name_suffix": "chemist", + "attitude": 0, + "mission": 7, + "chat": "TALK_NPC_CABIN_CHEMIST", + "faction": "wasteland_scavengers", + "mission_offered": "MISSION_CABIN_CHEMIST_GET_analytical_set_basic" + }, + { + "type": "npc_class", + "id": "NC_CHEM_MERCHANT", + "name": { "str": "Chemist" }, + "job_description": "I make and sell chemicals", + "traits": [ { "group": "BG_survival_story_RURAL" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], + "bonus_int": { "rng": [ 1, 2 ] }, + "shopkeeper_item_group": "cabin_chemist_sell", + "skills": [ + { "skill": "ALL", "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "rng": [ 0, -4 ] } ] } ] } }, + { "skill": "speech", "bonus": { "rng": [ 0, 2 ] } }, + { "skill": "firstaid", "bonus": { "rng": [ 1, 2 ] } }, + { "skill": "cooking", "bonus": { "rng": [ 3, 5 ] } } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_CABIN_CHEMIST", + "dynamic_line": "Hello, .", + "responses": [ + { "text": "Hello.", "topic": "TALK_NPC_CABIN_CHEMIST_INTRO" }, + { + "text": "Hands up!", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "talked_to_merchant", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { "text": "Bye.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_CABIN_CHEMIST_INTRO", + "dynamic_line": "So, what's up?", + "responses": [ + { "text": "Who are you?", "topic": "TALK_NPC_CABIN_CHEMIST_STORY" }, + { "text": "What is this place?", "topic": "TALK_NPC_CABIN_CHEMIST_HOME" }, + { "text": "Care to trade?", "topic": "TALK_NPC_CABIN_CHEMIST_INTRO", "effect": "start_trade" }, + { + "text": "I'd like to buy in bulk.", + "topic": "TALK_CABIN_CHEMIST_BULK_SELL", + "condition": { "npc_has_var": "mass_chem_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } + }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_CABIN_CHEMIST_STORY", + "dynamic_line": "I used to be a chemist. Well, I am a chemist. I've been living out here in the wilderness for a little while now since . Even brought some of my equipment, though unfortunately missing some of the more sensitive and expensive stuff. I found a couple useful things here in the cupboards, but other than that, entirely empty. So, I moved in.", + "responses": [ { "text": "Hmm.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_CABIN_CHEMIST_HOME", + "dynamic_line": "Not my place, just somewhere I ended up. Some old shack, maybe a hunting cabin or something more… criminal, at least judging by some of what I found on the shelves. You certainly wouldn't attract much attention synthesizing illegal substances all the way out here, that's all I'm saying. I found it while I was trying to escape all the in the city, and I decided to stay.", + "responses": [ { "text": "Hmm.", "topic": "TALK_NONE" } ] + }, + { + "id": "TALK_CABIN_CHEMIST_BULK_SELL", + "//": "This is all the dialogue related to buying bulk chemicals. It should remain somewhat prohibitively expensive and time-consuming so the chemist doesn't become a one-stop shop for survival needs. TO-DO - Use variables to refine shop system. See SCRIPT_EFFECTS.md and isolated road fabriation system.", + "type": "talk_topic", + "dynamic_line": { + "npc_has_effect": "currently_busy", + "yes": "I'm out of some things, . It takes a while to source the good stuff - days usually - but I'm working hard to replace it. What can I get you in the meantime?", + "no": "I'll see what I've got around here for you. I've gotta warn you: it's gonna be expensive. Hard to stay supplied in the apocalypse, you know. What do you need?" + }, + "responses": [ + { "text": "Nevermind.", "topic": "TALK_NONE" }, + { + "text": "[10$] I'll buy some bandages.", + "effect": [ { "u_buy_item": "bandages", "cost": 1000, "container": "bag_plastic", "count": 20 } ], + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[40$] I'll buy some aspirin.", + "effect": [ { "u_buy_item": "aspirin", "container": "bottle_plastic_pill_prescription", "cost": 4000, "count": 20 } ], + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some sprayable fungicide.", + "effect": [ + { "u_buy_item": "gas_fungicidal", "container": "jug_plastic", "cost": 5000, "count": 1500 }, + { "u_add_effect": "chemist_waiting_for_gas_fungicidal", "duration": "8 h" }, + { "npc_add_effect": "currently_busy", "duration": "8 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_gas_fungicidal" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some powder fungicide.", + "effect": [ + { "u_buy_item": "fungicide", "container": "bottle_twoliter", "cost": 5000, "count": 1500 }, + { "u_add_effect": "chemist_waiting_for_fungicide", "duration": "8 h" }, + { "npc_add_effect": "currently_busy", "duration": "8 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_fungicide" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some disinfectant.", + "effect": [ + { "u_buy_item": "disinfectant", "container": "bottle_plastic", "cost": 5000, "count": 20 }, + { "u_add_effect": "chemist_waiting_for_disinfectant", "duration": "12 h" }, + { "npc_add_effect": "currently_busy", "duration": "12 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_disinfectant" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[120$] I'll buy some antibiotics.", + "effect": [ + { "u_buy_item": "antibiotics", "container": "bottle_plastic_pill_prescription", "cost": 12000, "count": 20 }, + { "u_add_effect": "chemist_waiting_for_antibiotics", "duration": "96 h" }, + { "npc_add_effect": "currently_busy", "duration": "96 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_antibiotics" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[140$] I'll buy some antifungal drugs.", + "effect": [ + { "u_buy_item": "antifungal", "container": "bottle_plastic_pill_prescription", "cost": 14000, "count": 20 }, + { "u_add_effect": "chemist_waiting_for_antifungal", "duration": "96 h" }, + { "npc_add_effect": "currently_busy", "duration": "96 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_antifungal" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[200$] I'll buy some black gunpowder.", + "effect": [ + { "u_buy_item": "chem_black_powder", "container": "jar_3l_glass_sealed", "cost": 20000, "count": 10000 }, + { "u_add_effect": "chemist_waiting_for_chem_black_powder", "duration": "72 h" }, + { "npc_add_effect": "currently_busy", "duration": "72 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_chem_black_powder" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[300$] I'll buy some napalm.", + "effect": [ + { "u_buy_item": "napalm", "container": "jerrycan", "cost": 30000, "count": 10000 }, + { "u_add_effect": "chemist_waiting_for_napalm", "duration": "72 h" }, + { "npc_add_effect": "currently_busy", "duration": "72 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_napalm" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + } + ] + }, + { + "id": "TALK_CABIN_CHEMIST_BULK_SELL_END", + "type": "talk_topic", + "dynamic_line": [ "Is there anything else you need?" ], + "responses": [ + { "text": "No, that's all.", "topic": "TALK_DONE" }, + { + "text": "[10$] I'll buy some bandages.", + "effect": [ { "u_buy_item": "bandages", "cost": 1000, "container": "bag_plastic", "count": 20 } ], + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[40$] I'll buy some aspirin.", + "effect": [ { "u_buy_item": "aspirin", "container": "bottle_plastic_pill_prescription", "cost": 4000, "count": 20 } ], + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some sprayable fungicide.", + "effect": [ + { "u_buy_item": "gas_fungicidal", "container": "jug_plastic", "cost": 5000, "count": 1500 }, + { "u_add_effect": "chemist_waiting_for_gas_fungicidal", "duration": "8 h" }, + { "npc_add_effect": "currently_busy", "duration": "8 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_gas_fungicidal" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some powder fungicide.", + "effect": [ + { "u_buy_item": "fungicide", "container": "bottle_twoliter", "cost": 5000, "count": 1500 }, + { "u_add_effect": "chemist_waiting_for_fungicide", "duration": "8 h" }, + { "npc_add_effect": "currently_busy", "duration": "8 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_fungicide" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some disinfectant.", + "effect": [ + { "u_buy_item": "disinfectant", "container": "bottle_plastic", "cost": 5000, "count": 20 }, + { "u_add_effect": "chemist_waiting_for_disinfectant", "duration": "12 h" }, + { "npc_add_effect": "currently_busy", "duration": "12 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_disinfectant" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[120$] I'll buy some antibiotics.", + "effect": [ + { "u_buy_item": "antibiotics", "container": "bottle_plastic_pill_prescription", "cost": 12000, "count": 20 }, + { "u_add_effect": "chemist_waiting_for_antibiotics", "duration": "96 h" }, + { "npc_add_effect": "currently_busy", "duration": "96 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_antibiotics" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[140$] I'll buy some antifungal drugs.", + "effect": [ + { "u_buy_item": "antifungal", "container": "bottle_plastic_pill_prescription", "cost": 14000, "count": 20 }, + { "u_add_effect": "chemist_waiting_for_antifungal", "duration": "96 h" }, + { "npc_add_effect": "currently_busy", "duration": "96 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_antifungal" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[200$] I'll buy some black gunpowder.", + "effect": [ + { "u_buy_item": "chem_black_powder", "container": "jar_3l_glass_sealed", "cost": 20000, "count": 10000 }, + { "u_add_effect": "chemist_waiting_for_chem_black_powder", "duration": "72 h" }, + { "npc_add_effect": "currently_busy", "duration": "72 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_chem_black_powder" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + }, + { + "text": "[300$] I'll buy some napalm.", + "effect": [ + { "u_buy_item": "napalm", "container": "jerrycan", "cost": 30000, "count": 10000 }, + { "u_add_effect": "chemist_waiting_for_napalm", "duration": "72 h" }, + { "npc_add_effect": "currently_busy", "duration": "72 h" } + ], + "condition": { "not": { "u_has_effect": "chemist_waiting_for_napalm" } }, + "topic": "TALK_CABIN_CHEMIST_BULK_SELL_END" + } + ] + } +] diff --git a/data/json/npcs/cabin_chemist/chemist_effects.json b/data/json/npcs/cabin_chemist/chemist_effects.json new file mode 100644 index 000000000000..9fb6acda9f51 --- /dev/null +++ b/data/json/npcs/cabin_chemist/chemist_effects.json @@ -0,0 +1,37 @@ +[ + { + "type": "effect_type", + "id": "chemist_waiting_for_gas_fungicidal", + "//": "Applied as a timer while waiting for sprayable fungicide to refresh from the chemist's shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "chemist_waiting_for_fungicide", + "//": "Applied as a timer while waiting for powder fungicide to refresh from the chemist's shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "chemist_waiting_for_disinfectant", + "//": "Applied as a timer while waiting for disinfectant to refresh from the chemist's shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "chemist_waiting_for_antibiotics", + "//": "Applied as a timer while waiting for antibiotics to refresh from the chemist's shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "chemist_waiting_for_antifungal", + "//": "Applied as a timer while waiting for antifungal drugs to refresh from the chemist's shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "chemist_waiting_for_chem_black_powder", + "//": "Applied as a timer while waiting for black gunpowder to refresh from the chemist's shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "chemist_waiting_for_napalm", + "//": "Applied as a timer while waiting for napalm to refresh from the chemist's shop. If you're seeing this, it's a bug." + } +] diff --git a/data/json/npcs/cabin_chemist/chemist_missions.json b/data/json/npcs/cabin_chemist/chemist_missions.json new file mode 100644 index 000000000000..9104fd6f293b --- /dev/null +++ b/data/json/npcs/cabin_chemist/chemist_missions.json @@ -0,0 +1,105 @@ +[ + { + "id": "MISSION_CABIN_CHEMIST_GET_analytical_set_basic", + "type": "mission_definition", + "name": "Find A Basic Analysis Kit", + "description": "Obtain a basic laboratory analysis kit for the chemist.", + "goal": "MGOAL_FIND_ITEM", + "item": "analytical_set_basic", + "count": 1, + "difficulty": 2, + "value": 3000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_CABIN_CHEMIST_GET_60_chem_muriatic_acid", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need a basic laboratory analysis kit.", + "offer": "I've checked the stock here at this house, and it turns out there's a few pieces of equipment I need. Firstly, I need a reliable way to take measurements and verify results. If you could get me a basic laboratory analysis kit just to get started, I'd be grateful. That's the first step towards making everything I brought with me useful.", + "advice": "One of those old labs might have one.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Well, someone's got to do it.", + "inquire": "Do you have it?", + "success": "Thank you! I can't wait to get started!", + "success_lie": "Thanks for trying… I guess.", + "failure": "That's unfortunate. I guess I'll have to find it myself." + } + }, + { + "id": "MISSION_CABIN_CHEMIST_GET_60_chem_muriatic_acid", + "type": "mission_definition", + "name": "Find Some Hydrochloric Acid", + "description": "Obtain 15 liters of hydrochloric acid for the chemist.", + "//": "Hydrochloric acid is used for basically everything the chemist sells, so trading with them is gated behind this quest.", + "goal": "MGOAL_FIND_ITEM", + "item": "chem_muriatic_acid", + "count": 60, + "difficulty": 7, + "value": 10000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "end": { "effect": [ { "npc_add_var": "mass_chem_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } ] }, + "followup": "MISSION_CABIN_CHEMIST_GET_500_GAS", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need 15 liters of hydrochloric acid.", + "offer": "The last thing I really need to get going is hydrochloric acid. It's one of those chemicals that's just perfect for so many things. An acidifying reagent, and one of the best. With a large supply of hydrochloric acid, you and I are only a few steps removed from a stable source of antiseptic, fungicide, and even some light explosives! As the only apparent health authority left, I do have to warn you not to get it on your skin, though. Find this for me and I'll sell you whatever I can make.", + "advice": "You might find large quantities in a warehouse somewhere, but it often got sold as a household cleaner, did you know that?", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Well, someone's got to do it.", + "inquire": "Do you have the hydrochloric acid?", + "success": "Wonderful! I'm sure this will be quite helpful.", + "success_lie": "Thanks for trying… I guess.", + "failure": "That's unfortunate. I guess I'll have to find it myself." + } + }, + { + "id": "MISSION_CABIN_CHEMIST_GET_500_GAS", + "type": "mission_definition", + "name": "Find Some Gasoline", + "description": "Obtain 100 liters of gasoline for the chemist.", + "//": "Gasoline is absurdly valuable post-apocalypse and they're asking for a lot of gasoline.", + "goal": "MGOAL_FIND_ITEM", + "item": "gasoline", + "count": 500, + "difficulty": 10, + "value": 1600000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_CABIN_CHEMIST_SET_TRADE_ROUTE", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need 100 liters of gas.", + "offer": "I'm in a bit of a spot. I keep a generator around here to power all my scientific equipment. It has a bit of gas in it, but I've burned through that and I can't use most of my tools without power. This may seem like a lot, but if you could get me 100 liters of gas, I'll pay you back any way I can.", + "advice": "I bet the best place to find that much gas is still a gas station. Bringing it all here is another problem. You might want one of those big steel drums we used to use to haul off hazardous waste before .", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Well, someone's got to do it.", + "inquire": "Do you have it?", + "success": "Wonderful! Thank you so much! This will keep me running for a long, long time.", + "success_lie": "Thanks for trying… I guess.", + "failure": "That's unfortunate. I guess I'll have to find it myself." + } + }, + { + "id": "MISSION_CABIN_CHEMIST_SET_TRADE_ROUTE", + "type": "mission_definition", + "name": "Establish A Trade Route", + "description": "Establish trade relations between the chemist and a refugee center, and bring back a writ of the agreement.", + "goal": "MGOAL_FIND_ITEM", + "item": "trade_writ_chemist", + "count": 1, + "difficulty": 30, + "value": 20000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "start": { "assign_mission_target": { "om_terrain": "evac_center_18", "om_special": "evac_center", "reveal_radius": 0 } }, + "has_generic_rewards": true, + "dialogue": { + "describe": "Go negotiate a trade agreement.", + "offer": "I was out scavenging recently, and I found one of those old evac shelters. Turns out the computer was still on and it had an address for a refugee center. I think my skills might be useful to them, for helping maintain medical supplies and whatnot, so I want you to head over there and see if they're interested. I'd do it myself, but I need to look after this place.", + "advice": "It should be pretty simple making the deal, but I'd recommend taking a car over there myself.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Please? This is really important to me.", + "inquire": "What did they say about it?", + "success": "Thank you!", + "success_lie": "How does this help me?", + "failure": "That's unfortunate. I guess I'll have to find other customers." + } + } +] diff --git a/data/json/npcs/camper/TALK_NPC_camper.json b/data/json/npcs/camper/TALK_NPC_camper.json new file mode 100644 index 000000000000..b1b08bd0ee5e --- /dev/null +++ b/data/json/npcs/camper/TALK_NPC_camper.json @@ -0,0 +1,53 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_CAMPER_SURVIVOR", + "dynamic_line": { + "npc_has_var": "knows_u", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": ".", + "no": "Hey, stranger. Glad to see a new face around here." + }, + "speaker_effect": { "effect": { "npc_add_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { "text": "", "topic": "TALK_NPC_CAMPER_SURVIVOR_INTRO" }, + { + "text": "Glad to see you too. Now, hand over your things.", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { "text": "Bye.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_CAMPER_SURVIVOR_INTRO", + "dynamic_line": "So, what's up?", + "responses": [ + { "text": "What are you doing here?", "topic": "TALK_NPC_CAMPER_SURVIVOR_STORY" }, + { "text": "Care to trade?", "topic": "TALK_NPC_CAMPER_SURVIVOR_INTRO", "effect": "start_trade" }, + { + "text": "Why don't you come with me?", + "trial": { "type": "PERSUADE", "difficulty": -15, "mod": [ [ "value", 2 ] ] }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "trust": 1, "value": 1 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "trust": 0, "fear": 0 } } + }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_CAMPER_SURVIVOR_STORY", + "dynamic_line": "I was out here camping when disturbed me. I didn't know anything was wrong until two stumbled up here, and tried to kill me. I figured staying here would be my best bet, away from the cities.", + "responses": [ { "text": "Wow.", "topic": "TALK_NONE" } ] + } +] diff --git a/data/json/npcs/factions.json b/data/json/npcs/factions.json index 29079b2f9162..1a8684ddd17a 100644 --- a/data/json/npcs/factions.json +++ b/data/json/npcs/factions.json @@ -145,6 +145,89 @@ ], "description": "The remains of the federal government. The extent of their strength is unknown but squads of patrolling soldiers have been seen under their banner." }, + { + "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 } + }, + "epilogues": [ + { "power_min": 0, "power_max": 149, "id": "epilogue_faction_lapin_0" }, + { "power_min": 150, "id": "epilogue_faction_lapin_150" } + ], + "description": "Mr. Lapin and any acolytes he may have gathered in the apocalypse." + }, { "type": "faction", "id": "free_merchants", diff --git a/data/json/npcs/holdouts/Mr_Lapin.json b/data/json/npcs/holdouts/Mr_Lapin.json index 370c85fbb73a..836c68d74e48 100644 --- 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", diff --git a/data/json/npcs/homeless/TALK_homeless_broker.json b/data/json/npcs/homeless/TALK_homeless_broker.json new file mode 100644 index 000000000000..c975d9a47427 --- /dev/null +++ b/data/json/npcs/homeless/TALK_homeless_broker.json @@ -0,0 +1,125 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_BROKER", + "dynamic_line": { + "npc_has_var": "talked_to_homeless", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "Hello there. Nice to see you again.", + "no": "Who are you? Would you like to trade?" + }, + "speaker_effect": { "effect": { "npc_add_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "Nice to meet you.", + "topic": "TALK_NPC_HOMELESS_BROKER_INTRO", + "condition": { "not": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Hands up!", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": 4, "fear": -3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Pleasure to see you again.", + "topic": "TALK_NPC_HOMELESS_BROKER_INTRO", + "condition": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "See ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_BROKER_INTRO", + "dynamic_line": "So, what's up?", + "responses": [ + { "text": "What are you doing here?", "topic": "TALK_NPC_HOMELESS_BROKER_STORY" }, + { + "text": "Where might your friends be?", + "topic": "TALK_NPC_HOMELESS_BROKER_FRIENDS", + "condition": { "npc_has_var": "told_about_buddies", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { + "text": "Can I stay here?", + "topic": "TALK_NPC_HOMELESS_BROKER_STAY", + "condition": { "npc_has_var": "told_about_buddies", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { + "text": "Can I purchase some of your wares?", + "topic": "TALK_NPC_HOMELESS_BROKER_INTRO", + "effect": "start_trade" + }, + { + "text": "How's that smoker coming along?", + "topic": "TALK_NPC_HOMELESS_BROKER_SMOKERACK", + "condition": { "npc_has_var": "smoked_meat_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } + }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_BROKER_STORY", + "dynamic_line": [ + "I was homeless for a while before . I met some buddies out on the road and we were camping out here. Now we're just scraping by on what we can find, mostly. We're willing to trade, though. Who knows, you might find yourself a good deal.", + "Making ends meet, even in the worst circumstances. We've been camping out here now, trading with whoever passes by. If something catches your eye, let me know.", + "We got tired of being out on the road and decided to stay here for a bit. We've found a lot of useful stuff out and about, so if you see anything you need I'll make you a deal." + ], + "speaker_effect": { "effect": { "npc_add_var": "told_about_buddies", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ { "text": "Hm.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_BROKER_FRIENDS", + "dynamic_line": "They should be around here somewhere. We usually go out in teams to scavenge, and they haven't told me about anything yet. They might have something for you to do.", + "responses": [ { "text": "Alright.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_BROKER_STAY", + "dynamic_line": "Well, I don't see anything wrong with it. We should have a spare bed in that tent you could sleep on. Just don't cause any trouble.", + "responses": [ { "text": "Thank you.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_BROKER_MASSTRADE", + "dynamic_line": "Sure! It turned out well enough for us, and it's one of the few fresh meats we can find. I'll pay fairly for it.", + "repeat_responses": { "for_item": [ "mutant_meat" ], "response": { "text": "I have .", "topic": "TALK_DELIVER_ASK" } }, + "responses": [ + { "text": "I have nothing.", "topic": "TALK_NPC_HOMELESS_BROKER_INTRO" }, + { "text": "I have nothing. I'd best get going.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_BROKER_SMOKERACK", + "dynamic_line": "It's wonderful! We've been preserving a lot more of what we manage to scavenge so we won't have to worry about our food going bad for a while. We'd be willing to sell some of the excess, if you want.", + "responses": [ + { + "text": "I think I'll buy 10 slices. [$20]", + "topic": "TALK_NONE", + "effect": [ { "u_buy_item": "meat_smoked", "cost": 2000, "count": 10 } ] + }, + { + "text": "You think 20 slices would be alright? [$40]", + "topic": "TALK_NONE", + "effect": [ { "u_buy_item": "meat_smoked", "cost": 4000, "count": 20 } ] + }, + { + "text": "I'll take 50 slices of the stuff. [$100]", + "topic": "TALK_NONE", + "effect": [ { "u_buy_item": "meat_smoked", "cost": 10000, "count": 50 } ] + }, + { "text": "I'll keep that in mind.", "topic": "TALK_NONE" } + ] + } +] diff --git a/data/json/npcs/homeless/TALK_homeless_group_survivors.json b/data/json/npcs/homeless/TALK_homeless_group_survivors.json new file mode 100644 index 000000000000..270aa2ee1081 --- /dev/null +++ b/data/json/npcs/homeless/TALK_homeless_group_survivors.json @@ -0,0 +1,83 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_GROUP_SURVIVOR", + "dynamic_line": { + "npc_has_var": "talked_to_homeless", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "Hello there. Nice to see you again.", + "no": "Who are you, and what are you doing here?" + }, + "speaker_effect": { "effect": { "npc_add_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "Nice to meet you. I mean no harm.", + "topic": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_INTRO", + "condition": { "not": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Hand over your stuff! Don't make any sudden moves, or you die!", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": 4, "fear": -3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Pleasure to see you again.", + "topic": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_INTRO", + "condition": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "See ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_INTRO", + "dynamic_line": "So, what's up?", + "responses": [ + { "text": "What are you doing here?", "topic": "TALK_NPC_HOMELESS_BROKER_STORY" }, + { + "text": "Where might your friends be?", + "topic": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_FRIENDS", + "condition": { "npc_has_var": "told_about_buddies", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { + "text": "Can I stay here?", + "topic": "TALK_NPC_HOMELESS_BROKER_STAY", + "condition": { "npc_has_var": "told_about_buddies", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { + "text": "What's with that guy in the tent?", + "topic": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_BROKER", + "condition": { "npc_has_var": "told_about_buddies", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "Want to trade?", "topic": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_NOTRADE" }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_FRIENDS", + "dynamic_line": "Oh, they're right over there, and one of us is in that tent over there. They handle any stuff we manage to scavenge, so feel free to trade for what you want.", + "responses": [ { "text": "Alright.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_NOTRADE", + "dynamic_line": "Thanks for the offer, but I don't have anything to spare right now. One of my buddies over in that tent handles stuff like this, though. You might find something.", + "responses": [ { "text": "Alright.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_GROUP_SURVIVOR_BROKER", + "dynamic_line": "Well, they were the brightest of us when all hell broke loose. They managed to get us some food and weapons early on. I guess that just kinda made them the leader.", + "responses": [ { "text": "Hmm.", "topic": "TALK_NONE" } ] + } +] diff --git a/data/json/npcs/homeless/TALK_homeless_survivor.json b/data/json/npcs/homeless/TALK_homeless_survivor.json new file mode 100644 index 000000000000..9b1ffe036c20 --- /dev/null +++ b/data/json/npcs/homeless/TALK_homeless_survivor.json @@ -0,0 +1,61 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_SURVIVOR", + "dynamic_line": { + "u_has_var": "talked_to_homeless", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "Hello there. Nice to see you again.", + "no": "Who are you?" + }, + "speaker_effect": { "effect": { "npc_add_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "Nice to meet you.", + "topic": "TALK_NPC_HOMELESS_SURVIVOR_INTRO", + "condition": { "not": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Pleasure to see you again.", + "topic": "TALK_NPC_HOMELESS_SURVIVOR_INTRO", + "condition": { "npc_has_var": "talked_to_homeless", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "See ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_SURVIVOR_INTRO", + "dynamic_line": "So, what's up?", + "responses": [ + { "text": "What are you doing here?", "topic": "TALK_NPC_HOMELESS_SURVIVOR_STORY" }, + { "text": "Care to trade?", "topic": "TALK_NPC_HOMELESS_SURVIVOR_INTRO", "effect": "start_trade" }, + { + "text": "Why don't you come with me?", + "trial": { "type": "PERSUADE", "difficulty": -15, "mod": [ [ "value", 2 ] ] }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "trust": 1, "value": 1 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "trust": 0, "fear": 0 } } + }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_HOMELESS_SURVIVOR_STORY", + "dynamic_line": [ + "I was homeless before everything went down, just camping out here for a while. Stuck up s shunned me for my condition, but they're all dead now. I guess I'm better off than they are.", + "I guess you probably wouldn't have noticed this place before shit hit the fan, but I've been down here for quite a while.", + "Nothing to it. Before , it didn't take much to find yourself here. And I guess it just made sense to stay. We seem to be doing better than most, anyway.", + "Surviving, as I always have. Is that what you mean?", + "It's hard to say exactly what I'm doing out here, but I guess one thing just leads to another and… well, you're just being nice when you ask, aren't you? It doesn't matter now anyway. I'm here and I'm still alive." + ], + "responses": [ { "text": "Hm.", "topic": "TALK_NONE" } ] + } +] diff --git a/data/json/npcs/homeless/group_camp_missions.json b/data/json/npcs/homeless/group_camp_missions.json new file mode 100644 index 000000000000..c4bd6311b958 --- /dev/null +++ b/data/json/npcs/homeless/group_camp_missions.json @@ -0,0 +1,234 @@ +[ + { + "id": "MISSION_KILL_SLIMES", + "type": "mission_definition", + "name": "Sticky Situation", + "description": "Kill some slimes in exchange for credit with some of the traders and bring back six of their slime scraps.", + "goal": "MGOAL_FIND_ITEM", + "item": "slime_scrap", + "count": 6, + "difficulty": 1, + "value": 4000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_HUNT_ANTS", + "start": { + "assign_mission_target": { "om_terrain": "field", "reveal_radius": 1, "random": true, "search_range": 15, "min_distance": 10 }, + "update_mapgen": { "place_monster": [ { "monster": "mon_blob", "pack_size": [ 6, 6 ], "x": 8, "y": 8, "target": true } ] } + }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "We've had some trouble with slimes not far from us. It's been hard going through there with all them around, so I want you to go take care of it.", + "advice": "Sure, they can be cut, but I'd say it's better to splatter them with something large and heavy.", + "accepted": "I'll be here when you get back.", + "rejected": "No problem. I'm sure one of us will get to it anyway.", + "inquire": "Are those slimes dead yet?", + "success": "Nice. I'll just take those off your hands. Might be good for greasing the bike chains and door hinges around here even though it is a bit… abnormal.", + "success_lie": "You don't look nearly as sticky as you're supposed to. Get back to it.", + "failure": "Did they give you the slip? It's worse than I thought, then." + } + }, + { + "id": "MISSION_HUNT_ANTS", + "type": "mission_definition", + "name": "Arthropod Hunting", + "description": "Kill some ants and bring back ten slices of their meat in exchange for credit with some of the traders.", + "goal": "MGOAL_FIND_ITEM", + "item": "mutant_meat", + "count": 10, + "difficulty": 1, + "value": 4000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_BUILD_CAMP_1", + "start": { + "assign_mission_target": { "om_terrain": "field", "reveal_radius": 1, "random": true, "search_range": 15 }, + "update_mapgen": { "place_monster": [ { "monster": "mon_ant", "pack_size": [ 2, 2 ], "x": 8, "y": 8, "target": true } ] } + }, + "end": { "effect": [ { "npc_add_var": "ant_meat_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } ] }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "The last time we went out scouting we found some gargantuan ants crawling around. We thought we might see how they taste, if they could be cooked and whatnot. I want you to go kill one and bring back some of its meat.", + "advice": "A shotgun of some sort might work well.", + "accepted": "I'll be here when you get back.", + "rejected": "Alright, I can understand that.", + "inquire": "Do you have the meat?", + "success": "Nice. I'll get these cooked up. Who knows, we might want some more in the future.", + "success_lie": "You sure? I don't see my meat anywhere.", + "failure": "Ah, well. It's no big deal." + } + }, + { + "id": "MISSION_BUILD_CAMP_1", + "type": "mission_definition", + "name": "Refurbishments", + "description": "Obtain 100 planks.", + "goal": "MGOAL_FIND_ITEM", + "item": "2x4", + "count": 100, + "difficulty": 1, + "value": 10000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_BUILD_CAMP_2", + "end": { + "update_mapgen": { "om_terrain": "homelesscamp", "place_nested": [ { "chunks": [ "homeless_camp_refurb_1" ], "x": 0, "y": 0 } ] } + }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "My buddies and I have decided to stay here for a while. This is about the only safe place out here, and it's kinda become our home. Anyway, we're going to build a wall. Our old logs have provided a bunch of the wood, but we still need quite a few planks. About 100 of them. If you could get it for us, I'd be grateful.", + "advice": "Any nearby forest should have all you need. Otherwise, you might try breaking down some furniture in town.", + "accepted": "Thank you. We'll be sure to compensate your efforts.", + "rejected": "Alright, I can understand that. I guess I'll have to get it myself.", + "inquire": "Do you have my lumber?", + "success": "Thank you. We'll start right away.", + "success_lie": "I can tell you're lying. I don't see shit.", + "failure": "Ah, well. It's no big deal." + } + }, + { + "id": "MISSION_BUILD_CAMP_2", + "type": "mission_definition", + "name": "Refurbishments Pt. II", + "description": "Obtain 150 planks.", + "goal": "MGOAL_FIND_ITEM", + "item": "2x4", + "count": 150, + "difficulty": 1, + "value": 15000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_BUILD_CAMP_3", + "end": { + "update_mapgen": { "om_terrain": "homelesscamp", "place_nested": [ { "chunks": [ "homeless_camp_refurb_2" ], "x": 0, "y": 0 } ] } + }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "Now that we've got the wall done, we decided to move out of these old tents. We still have some leftover nails but we need more wood. So, if you could get us 150 planks, we'd be grateful.", + "advice": "Any nearby forest should have all you need. Otherwise, you might try breaking down some furniture in town.", + "accepted": "Thank you. We'll be sure to compensate your efforts.", + "rejected": "Alright, I can understand that. I guess I'll have to get it myself.", + "inquire": "Do you have my lumber?", + "success": "Thank you. We'll start right away.", + "success_lie": "I can tell you're lying. I don't see shit.", + "failure": "Ah, well. It's no big deal." + } + }, + { + "id": "MISSION_BUILD_CAMP_3", + "type": "mission_definition", + "name": "Refurbishments Pt. III", + "description": "Obtain 6 ropes.", + "//": "TO-DO - Dynamic response dialogs would be more natural to accept so many alternate items here and everywhere else these conditional item accept conditions appear.", + "goal": "MGOAL_CONDITION", + "goal_condition": { + "or": [ + { "u_has_items": { "item": "rope_6", "count": 6 } }, + { "u_has_items": { "item": "rope_30", "count": 6 } }, + { "u_has_items": { "item": "rope_makeshift_6", "count": 6 } }, + { "u_has_items": { "item": "rope_makeshift_30", "count": 6 } } + ] + }, + "difficulty": 1, + "value": 2500, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_BUILD_CAMP_4", + "end": { + "update_mapgen": { "om_terrain": "homelesscamp", "place_nested": [ { "chunks": [ "homeless_camp_refurb_3" ], "x": 0, "y": 0 } ] } + }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "Our entrance is wide open so we're building a gate over it. Problem is we don't have any ropes. If you could find some for us, we'll pay you.", + "advice": "If you can't find any rope around, one of our books should have something on rope-making. Most plants can be woven into a halfway decent rope.", + "accepted": "Thank you. We'll be sure to compensate your efforts.", + "rejected": "Alright, I can understand that. I guess I'll have to get it myself.", + "inquire": "Do you have my ropes?", + "success": "Thank you. We'll start right away.", + "success_lie": "I can tell you're lying. I don't see shit.", + "failure": "Ah, well. It's no big deal." + } + }, + { + "id": "MISSION_BUILD_CAMP_4", + "type": "mission_definition", + "name": "Refurbishments Pt. IV", + "description": "Obtain a wood saw.", + "//": "TO-DO - Dynamic response dialogs would be more natural to accept so many alternate items here and everywhere else these conditional item accept conditions appear.", + "goal": "MGOAL_CONDITION", + "goal_condition": { "or": [ { "u_has_item": "saw" }, { "u_has_item": "bow_saw" }, { "u_has_item": "misc_repairkit" } ] }, + "difficulty": 1, + "value": 2500, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_BUILD_CAMP_5", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "We appreciate all of your help but we can't rely on everyone else to do things for us. I'd be willing to buy a wood saw of some kind from you so we can cut our own wood as needed.", + "advice": "A hardware store or lumbermill should have one", + "accepted": "Thank you. We'll be sure to compensate your efforts.", + "rejected": "Alright, I can understand that. I guess I'll have to get it myself.", + "inquire": "Do you have my saw?", + "success": "Thank you. Pick what you want from our stash.", + "success_lie": "I can tell you're lying. I don't see shit.", + "failure": "Ah, well. It's no big deal." + } + }, + { + "id": "MISSION_BUILD_CAMP_5", + "type": "mission_definition", + "name": "Refurbishments Pt. V", + "description": "Obtain a shovel.", + "goal": "MGOAL_FIND_ITEM", + "item": "shovel", + "count": 1, + "difficulty": 1, + "value": 2500, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_BUILD_CAMP_6", + "end": { + "update_mapgen": { "om_terrain": "homelesscamp", "place_nested": [ { "chunks": [ "homeless_camp_refurb_4" ], "x": 0, "y": 0 } ] } + }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "Our sanitation here has become… problematic. We've mostly just been going outside the walls to piss. Not only is it kinda unhealthy, but the last time I wandered out I almost got eaten! So, if you'd get us a shovel, we could make a latrine for ourselves. We'll pay you fairly, as usual.", + "advice": "A hardware store should have one lying around.", + "accepted": "Thank you. We'll be sure to compensate your efforts.", + "rejected": "Alright, I can understand that. I guess I'll have to get it myself.", + "inquire": "Do you have the shovel?", + "success": "Thank you. We're eternally grateful to you.", + "success_lie": "I can tell you're lying. I don't see shit.", + "failure": "I'll do it myself, then." + } + }, + { + "id": "MISSION_BUILD_CAMP_6", + "type": "mission_definition", + "name": "Refurbishments Pt. VI", + "//": "TO-DO - Maybe add a physical charcoal smoker 'fake_char_smoker' to the camp mapgen?", + "description": "Obtain a charcoal smoker.", + "goal": "MGOAL_FIND_ITEM", + "item": "char_smoker", + "count": 1, + "difficulty": 1, + "value": 5000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "end": { + "update_mapgen": { "om_terrain": "homelesscamp", "place_nested": [ { "chunks": [ "homeless_camp_refurb_5" ], "x": 0, "y": 0 } ] }, + "effect": [ { "npc_add_var": "smoked_meat_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } ] + }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need some help.", + "offer": "Turns out that ant meat you got us wasn't actually too bad. A little tough, sure, but perfectly edible. The problem now is we need a way of preserving it. One of those portable charcoal smokers would be really great. Heck, you might even wanna buy some.", + "advice": "Maybe try a farm? I bet those rural folks were pretty invested in preserving their food.", + "accepted": "Thank you. We'll be sure to compensate your efforts.", + "rejected": "Alright, I can understand that. I guess I'll have to get it myself.", + "inquire": "Do you have the charcoal smoker?", + "success": "Thank you. We'll get started right away.", + "success_lie": "I can tell you're lying. I don't see shit.", + "failure": "Ah, well. It's no big deal." + } + } +] diff --git a/data/json/npcs/homeless/homeless_broker_sell.json b/data/json/npcs/homeless/homeless_broker_sell.json new file mode 100644 index 000000000000..62490522d05c --- /dev/null +++ b/data/json/npcs/homeless/homeless_broker_sell.json @@ -0,0 +1,46 @@ +[ + { + "type": "item_group", + "id": "homeless_broker_sell", + "items": [ + { "group": "shoes", "prob": 80 }, + { "group": "harddrugs", "prob": 70 }, + { "group": "preserved_food", "prob": 90 }, + { "group": "dry_goods", "prob": 90 }, + { "group": "pet_food", "prob": 90 }, + { "group": "pantry", "prob": 90 }, + { "group": "foodintincan", "prob": 90 }, + { "group": "cannedfood", "prob": 90 }, + { "group": "big_canned_food", "prob": 90 }, + { "group": "produce", "prob": 80 }, + { "group": "snacks", "prob": 80 }, + { "group": "fast_food", "prob": 80 }, + { "group": "hardware_books", "prob": 80 }, + { "group": "homebooks", "prob": 80 }, + { "group": "manuals", "prob": 80 }, + { "group": "textbooks", "prob": 80 }, + { "group": "newspaper", "prob": 80 }, + { "group": "tools_common", "prob": 80 }, + { "group": "tools_mechanic", "prob": 80 }, + { "group": "tools_general", "prob": 80 }, + { "group": "tools_medical", "prob": 80 } + ] + }, + { + "type": "item_group", + "id": "NPC_homeless_worn", + "subtype": "collection", + "entries": [ + { "item": "loincloth" }, + { "item": "footrags" }, + { "item": "gloves_wraps" }, + { "item": "tunic" }, + { "item": "bigback" }, + { "item": "duffelbag" }, + { "item": "leather_belt" }, + { "item": "jacket_leather" }, + { "item": "pants_leather" }, + { "item": "boots" } + ] + } +] diff --git a/data/json/npcs/homeless/nested_homeless_missions.json b/data/json/npcs/homeless/nested_homeless_missions.json new file mode 100644 index 000000000000..d60a19e50ec6 --- /dev/null +++ b/data/json/npcs/homeless/nested_homeless_missions.json @@ -0,0 +1,230 @@ +[ + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_blank_temp", + "//": "Just showcases the position of stuff. Not to be used.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!!!!!!!!! ", + " ! ccccc ! ", + " ! c~~~c !! ", + " ! c~@~c ! ", + " ! cmddc ! ", + " ! ccc+c ! ", + " ! ! ", + " !` ! ", + " `! ", + " !` cccc ! ", + " ! cmmc !! ", + " !! cmdb ! ", + " ! cmmc ! ", + " !!cccc ! ", + " !!!!!!!!!!!!!!! ", + " ", + " ", + " " + ], + "terrain": { + "!": "t_grass", + "`": "t_grass", + "d": "t_grass", + "~": "t_grass", + "c": "t_grass", + "b": "t_grass", + "m": "t_grass", + "+": "t_grass", + "@": "t_grass" + }, + "furniture": { "m": "f_straw_bed" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_1", + "//": "Phase 1 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " !!!!!!!!!!!!!!! ", + " ! ! ", + " ! !! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ! ", + " ! ", + " ! ! ", + " ! !! ", + " !! ! ", + " ! ! ", + " !! ! ", + " !!!!!!!!!!!!!!! ", + " ", + " ", + " " + ], + "terrain": { "!": "t_wall_wood" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_2", + "//": "Phase 2 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ccccc ", + " c c ", + " c c ", + " c c ", + " ccc c ", + " ", + " ", + " ", + " cccc ", + " c c ", + " c ", + " c c ", + " cccc ", + " ", + " ", + " ", + " " + ], + "terrain": { "c": "t_wall_wood" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_3", + "//": "Phase 3 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "~1~ ", + " ! ", + " ! ", + " ! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { "!": "t_palisade_gate", "~": "t_palisade_pulley", "1": "t_palisade" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_4", + "//": "Phase 4 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " 01 ", + " !! ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { "0": "t_pit_shallow", "!": "t_wall_wood", "1": "t_door_c" } + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "homeless_camp_refurb_5", + "//": "Phase 5 of homeless refurbirations.", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " @! ", + " ", + " ", + " ", + " " + ], + "terrain": { "!": "t_dirt", "@": "t_dirt" }, + "furniture": { "!": "f_smoking_rack", "@": "f_kiln_empty" } + } + } +] diff --git a/data/json/npcs/homeless/shelter_survivors.json b/data/json/npcs/homeless/shelter_survivors.json new file mode 100644 index 000000000000..4d13ce804d42 --- /dev/null +++ b/data/json/npcs/homeless/shelter_survivors.json @@ -0,0 +1,102 @@ +[ + { + "type": "npc", + "id": "survivor_camper", + "name_suffix": "camper", + "class": "NC_SCAVENGER", + "attitude": 1, + "mission": 7, + "chat": "TALK_NPC_CAMPER_SURVIVOR", + "faction": "no_faction" + }, + { + "type": "npc", + "id": "apartment_survivor", + "name_suffix": "scavenger", + "class": "NC_SCAVENGER", + "attitude": 1, + "mission": 7, + "chat": "TALK_NPC_APARTMENT_SURVIVOR", + "faction": "no_faction" + }, + { + "type": "npc", + "id": "prepper_survivor", + "name_suffix": "prepper", + "class": "NC_SCAVENGER", + "attitude": 1, + "mission": 7, + "chat": "TALK_NPC_PREPPER_SURVIVOR", + "faction": "no_faction" + }, + { + "type": "npc", + "id": "survivor_moonshiner", + "name_suffix": "moonshiner", + "class": "NC_SCAVENGER", + "attitude": 0, + "mission": 7, + "chat": "TALK_NPC_MOONSHINER", + "faction": "no_faction" + }, + { + "type": "npc", + "id": "NPC_evac_shelter_survivor", + "class": "NC_SCAVENGER", + "name_suffix": "scavenger", + "attitude": 1, + "mission": 8, + "chat": "TALK_NPC_EVAC_SURVIVOR", + "faction": "no_faction", + "mission_offered": "MISSION_LEARN_ABOUT_CATTAIL_JELLY" + }, + { + "type": "npc", + "id": "NPC_homeless_survivor", + "class": "NC_SCAVENGER", + "name_suffix": "scavenger", + "attitude": 1, + "mission": 8, + "chat": "TALK_NPC_HOMELESS_SURVIVOR", + "faction": "no_faction", + "mission_offered": "MISSION_LEARN_ABOUT_CATTAIL_JELLY" + }, + { + "type": "npc", + "id": "NPC_homeless_broker", + "class": "NC_HOMELESS_BROKER", + "name_suffix": "scavenger", + "attitude": 0, + "mission": 3, + "chat": "TALK_NPC_HOMELESS_BROKER", + "faction": "wasteland_scavengers", + "mission_offered": "MISSION_KILL_SLIMES" + }, + { + "type": "npc", + "id": "NPC_homeless_group_survivor", + "class": "NC_SCAVENGER", + "name_suffix": "scavenger", + "attitude": 0, + "mission": 7, + "chat": "TALK_NPC_HOMELESS_GROUP_SURVIVOR", + "faction": "wasteland_scavengers" + }, + { + "type": "npc_class", + "id": "NC_HOMELESS_BROKER", + "name": { "str": "Scavenger" }, + "job_description": "I'm just trying to survive.", + "common": false, + "shopkeeper_item_group": "homeless_broker_sell", + "worn_override": "NPC_homeless_worn", + "traits": [ { "group": "BG_survival_story_EVACUEE" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], + "skills": [ + { "skill": "ALL", "level": { "sum": [ { "dice": [ 3, 2 ] }, { "constant": -3 } ] } }, + { "skill": "gun", "bonus": { "rng": [ 2, 4 ] } }, + { "skill": "pistol", "bonus": { "rng": [ 2, 5 ] } }, + { "skill": "rifle", "bonus": { "rng": [ 0, 3 ] } }, + { "skill": "archery", "bonus": { "rng": [ 0, 3 ] } } + ] + } +] diff --git a/data/json/npcs/lumberyard/TALK_lumbermill_logger.json b/data/json/npcs/lumberyard/TALK_lumbermill_logger.json new file mode 100644 index 000000000000..0ff66034bc95 --- /dev/null +++ b/data/json/npcs/lumberyard/TALK_lumbermill_logger.json @@ -0,0 +1,72 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_LUMBERMILL_LOGGER", + "dynamic_line": { + "npc_has_var": "talked_to_logger", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "Hello there. Nice to see you, .", + "no": "A stranger out here? Who are you?" + }, + "speaker_effect": { "effect": { "npc_add_var": "talked_to_logger", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "Nice to meet you.", + "topic": "TALK_NPC_LUMBERMILL_LOGGER_INTRO", + "condition": { "not": { "npc_has_var": "talked_to_logger", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Hands up, !", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "talked_to_logger", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Pleasure to see you again.", + "topic": "TALK_NPC_LUMBERMILL_LOGGER_INTRO", + "condition": { "npc_has_var": "talked_to_logger", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "See ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_LUMBERMILL_LOGGER_INTRO", + "dynamic_line": "Do you need something?", + "responses": [ + { "text": "What's your story?", "topic": "TALK_NPC_LUMBERMILL_LOGGER_STORY" }, + { "text": "How do things work around here now?", "topic": "TALK_NPC_LUMBERMILL_LOGGER_TALK_TO_MANAGER" }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "Nah, see ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_LUMBERMILL_LOGGER_TALK_TO_MANAGER", + "dynamic_line": [ + "You mean you're still looking for wood? Crazy… but we had a suspicion folks might show up in an emergency. Talk to the manager if you want to make an order.", + "Well, the machinery works just fine. We were always self-sufficient and only really made that more apparent. So if you want to place an order and help keep the operation running, talk to the manager. We'll trade you for our wood." + ], + "responses": [ { "text": "Sounds good, thanks.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_LUMBERMILL_LOGGER_STORY", + "dynamic_line": [ + "Not much to it. I worked here as a logger before began. When all went to hell, I was on the job and had to hole up here with my coworkers. Good news is we all came out fine, and the boss decided to keep the mill running. I don't know how much longer we can last, though; not unless we make some contact with other people. Customers, I guess you might call 'em.", + "Well, I'm a logger here. Seasonal work but good pay… or it was, at least. Before that first showed up and made it clear how bad things were really getting.", + "I'm a lumberjack out here. Things were quiet for a long time. We're pretty far out in the woods so it was kind of a shock to find out just how bad it'd gotten in civilization. We had a couple close run-ins ourselves. My friend over there almost got eaten! But we still have resources that I'm sure people can use.", + "My comrades and I were lucky to be in the right place at the right time, I suppose. We keep really busy out here, so we didn't expect to land right in our lap like that. Luckily these axes can chop more than wood. They'll take a good chunk out of anything nasty that threatens our mill.", + "Well, I work here. Welcome to the mill. Used to be trucks in and out of here all the time but you're the first face we've seen in a while.", + "New to the job… or, well, whatever's happening now. I still cut trees and run logs through the saw from time to time, so I guess you'd call me a logger. Things have only gotten weirder after those fucking nearly killed us. I'm not sure how much longer we'll last…" + ], + "responses": [ { "text": "Hope it goes well.", "topic": "TALK_NONE" } ] + } +] diff --git a/data/json/npcs/lumberyard/TALK_lumbermill_merchant.json b/data/json/npcs/lumberyard/TALK_lumbermill_merchant.json new file mode 100644 index 000000000000..00d10f2ff732 --- /dev/null +++ b/data/json/npcs/lumberyard/TALK_lumbermill_merchant.json @@ -0,0 +1,55 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_LUMBERMILL_MERCHANT", + "dynamic_line": { + "npc_has_var": "talked_to_merchant", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "Hello there. Nice to see you again.", + "no": "A new face at the mill? Who might you be?" + }, + "speaker_effect": { "effect": { "npc_add_var": "talked_to_merchant", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "Nice to meet you.", + "topic": "TALK_NPC_LUMBERMILL_MERCHANT_INTRO", + "condition": { "not": { "npc_has_var": "talked_to_merchant", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Hands up!", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "talked_to_merchant", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Pleasure to see you again.", + "topic": "TALK_NPC_LUMBERMILL_MERCHANT_INTRO", + "condition": { "npc_has_var": "talked_to_merchant", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "See ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_LUMBERMILL_MERCHANT_INTRO", + "dynamic_line": "So, what's up?", + "responses": [ + { "text": "What are you doing here?", "topic": "TALK_NPC_LUMBERMILL_MERCHANT_STORY" }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_LUMBERMILL_MERCHANT_STORY", + "dynamic_line": "I'm the manager here at the mill. It's a tight-knit crew, unionized operation. When broke out, we didn't even know about it till some wandered onto the yard. Now, we've just held up here. I imagine any folks left out there might be needing our machinery and skills to keep civilization alive. Might make new customers yet.", + "responses": [ { "text": "Hm.", "topic": "TALK_NONE" } ] + } +] diff --git a/data/json/npcs/lumberyard/lumbermill_effects.json b/data/json/npcs/lumberyard/lumbermill_effects.json new file mode 100644 index 000000000000..5fa86ad0755d --- /dev/null +++ b/data/json/npcs/lumberyard/lumbermill_effects.json @@ -0,0 +1,22 @@ +[ + { + "type": "effect_type", + "id": "lumbermill_waiting_for_log", + "//": "Applied as a timer while waiting for logs to refresh from the lumbermill shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "lumbermill_waiting_for_wood_panel", + "//": "Applied as a timer while waiting for wood panels to refresh from the lumbermill shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "lumbermill_waiting_for_wood_sheet", + "//": "Applied as a timer while waiting for wood sheets to refresh from the lumbermill shop. If you're seeing this, it's a bug." + }, + { + "type": "effect_type", + "id": "lumbermill_waiting_for_wood_beam", + "//": "Applied as a timer while waiting for wood beams to refresh from the lumbermill shop. If you're seeing this, it's a bug." + } +] diff --git a/data/json/npcs/lumberyard/lumbermill_employees.json b/data/json/npcs/lumberyard/lumbermill_employees.json new file mode 100644 index 000000000000..6bab775424f4 --- /dev/null +++ b/data/json/npcs/lumberyard/lumbermill_employees.json @@ -0,0 +1,60 @@ +[ + { + "type": "npc", + "id": "NPC_lumbermill_logger", + "class": "NC_LUMBERJACK", + "name_suffix": "logger", + "attitude": 0, + "mission": 7, + "chat": "TALK_NPC_LUMBERMILL_LOGGER", + "faction": "wasteland_scavengers" + }, + { + "type": "npc", + "id": "NPC_lumbermill_merchant", + "class": "NC_LUMBERJACK", + "name_suffix": "manager", + "attitude": 0, + "mission": 7, + "chat": "TALK_NPC_LUMBERMILL_MERCHANT", + "faction": "wasteland_scavengers", + "mission_offered": "MISSION_GET_DRIVEBELTS" + }, + { + "type": "npc", + "id": "NPC_lumbermill_broker", + "class": "NC_LUMBERJACK", + "name_suffix": "broker", + "attitude": 0, + "mission": 7, + "chat": "TALK_NPC_LUMBERMILL_LOGGER", + "faction": "wasteland_scavengers" + }, + { + "type": "npc_class", + "id": "NC_LUMBERJACK", + "name": { "str": "Lumberjack" }, + "job_description": "I felled trees before the apocalypse. Zombies shouldn't be as tough.", + "traits": [ { "group": "BG_survival_story_RURAL" }, { "group": "NPC_starting_traits" }, { "group": "Appearance_demographics" } ], + "weapon_override": "NC_LUMBERJACK_tools", + "bonus_str": { "rng": [ 1, 2 ] }, + "skills": [ + { "skill": "ALL", "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "rng": [ 0, -4 ] } ] } ] } }, + { "skill": "survival", "bonus": { "rng": [ 0, 2 ] } }, + { "skill": "melee", "bonus": { "rng": [ 1, 2 ] } }, + { "skill": "cutting", "bonus": { "rng": [ 1, 2 ] } }, + { "skill": "dodge", "bonus": { "rng": [ 1, 2 ] } } + ] + }, + { + "type": "item_group", + "id": "NC_LUMBERJACK_tools", + "subtype": "distribution", + "entries": [ + { "item": "ax", "prob": 70 }, + { "item": "saw", "prob": 10 }, + { "item": "can_beans", "prob": 10 }, + { "item": "chainsaw_off", "prob": 10 } + ] + } +] diff --git a/data/json/npcs/lumberyard/lumbermill_missions.json b/data/json/npcs/lumberyard/lumbermill_missions.json new file mode 100644 index 000000000000..40c123752a7d --- /dev/null +++ b/data/json/npcs/lumberyard/lumbermill_missions.json @@ -0,0 +1,161 @@ +[ + { + "id": "MISSION_GET_DRIVEBELTS", + "type": "mission_definition", + "name": "Find Drive Belts", + "description": "Obtain 3 drive belts in exchange for credit with the loggers.", + "goal": "MGOAL_CONDITION", + "difficulty": 2, + "value": 4000, + "goal_condition": { + "or": [ + { "u_has_items": { "item": "drivebelt", "count": 3 } }, + { "u_has_items": { "item": "drivebelt_makeshift", "count": 3 } } + ] + }, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_LUMBERMILL_GET_1000_NAILS", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need three drive belts.", + "offer": "Some of our machinery received some damage before and we were waiting on replacement parts. Now everything's changed and those parts are more important than ever. Get us three drive belts and I'll give you some credit with us.", + "advice": "If you can't find actual drive belts on engines, a good replacement can be made from a belt and some duct tape. Nothing difficult.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Someone's got to do it.", + "inquire": "Do you have the belts?", + "success": "Wonderful! Thanks, , we'll be fine for a long while from now.", + "success_lie": "Where are they? I don't believe you.", + "failure": "That's unfortunate. I guess we'll have to find someone else to do it." + } + }, + { + "id": "MISSION_LUMBERMILL_GET_1000_NAILS", + "type": "mission_definition", + "name": "Get 1,000 Nails", + "description": "Obtain 1,000 nails in exchange for credit with the loggers.", + "goal": "MGOAL_FIND_ITEM", + "item": "nail", + "count": 1000, + "difficulty": 5, + "value": 300000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_LUMBERMILL_GET_6800_NAILS", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need 1,000 nails.", + "offer": "Along with those drive belts, we were waiting for some nails for structural repairs. Due to , we obviously never received them. So, I need you to get us 1,000 nails. We'll pay you fairly.", + "advice": "Taking apart some furniture in town should get what you need.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Someone's got to do it.", + "inquire": "Do you have the nails?", + "success": "Our warehouse was about to fall apart. These will be extremely helpful to us.", + "success_lie": "Where are they? I don't believe you.", + "failure": "That's unfortunate. I guess we'll have to find someone else to do it." + } + }, + { + "id": "MISSION_LUMBERMILL_GET_6800_NAILS", + "type": "mission_definition", + "name": "Get 6,800 Nails", + "description": "Obtain 6,800 nails in exchange for credit with the loggers.", + "//": "170 wood walls * 40 nails per wall", + "followup": "MISSION_LUMBERMILL_GET_6_BLANKETS", + "goal": "MGOAL_FIND_ITEM", + "item": "nail", + "count": 6800, + "difficulty": 32, + "value": 2000000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "end": { + "update_mapgen": [ + { "om_terrain": "lumbermill_0_0_ocu", "place_nested": [ { "chunks": [ "occupied_lum_wall_0_0" ], "x": 0, "y": 0 } ] }, + { + "om_terrain": "lumbermill_0_1_ocu", + "place_nested": [ { "chunks": [ "occupied_lum_wall_0_1" ], "x": 0, "y": 0 } ] + }, + { + "om_terrain": "lumbermill_1_0_ocu", + "place_nested": [ { "chunks": [ "occupied_lum_wall_1_0" ], "x": 0, "y": 0 } ] + }, + { + "om_terrain": "lumbermill_1_1_ocu", + "place_nested": [ { "chunks": [ "occupied_lum_wall_1_1" ], "x": 0, "y": 0 } ] + } + ] + }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need 6,800 nails.", + "offer": "While fairly sturdy, the metal fence around this place won't hold out for long. So, we've decided to replace it with a wall. However, the nails we had were used to repair our existing structures, and they weren't nearly enough. After some calculations, we need 6,800 nails to do it. That may seem like a lot, but we're willing to give you a TON of credit for it.", + "advice": "You might have to do more than just scrapping a bunch of furniture. Dismantling a building somewhere in town could get you what you need.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Well, I suppose that's reasonable.", + "inquire": "Do you have the nails?", + "success": "That's absolutely amazing! I can't thank you enough for this!", + "success_lie": "You're a fucking scammer, !", + "failure": "That's unfortunate. I guess we'll have to find someone else to do it." + } + }, + { + "id": "MISSION_LUMBERMILL_GET_6_BLANKETS", + "type": "mission_definition", + "name": "Find 6 Blankets", + "description": "Obtain 6 blankets or quilts in exchange for credit with the loggers.", + "goal": "MGOAL_CONDITION", + "difficulty": 5, + "value": 4000, + "//": "Dynamic response dialogs would be more natural to accept so many alternate items here.", + "goal_condition": { + "or": [ + { "u_has_items": { "item": "blanket", "count": 6 } }, + { "u_has_items": { "item": "fur_blanket", "count": 6 } }, + { "u_has_items": { "item": "electric_blanket", "count": 6 } }, + { "u_has_items": { "item": "fur_blanket", "count": 6 } }, + { "u_has_items": { "item": "quilt", "count": 6 } }, + { "u_has_items": { "item": "quilt_patchwork", "count": 6 } } + ] + }, + "origins": [ "ORIGIN_OPENER_NPC" ], + "end": { + "update_mapgen": { "om_terrain": "lumbermill_1_1_ocu", "place_nested": [ { "chunks": [ "occupied_lum_hotel_1_1" ], "x": 0, "y": 0 } ] } + }, + "followup": "MISSION_LUMBERMILL_SET_TRADE_ROUTE", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need 6 blankets.", + "offer": "Now that we should be safe from harm, I decided to start adding a few things to this place. Right now, we don't have anywhere to comfortably sleep, so we're building a small sleeping quarter. We just need 6 big, warm blankets or quilts to finish our project.", + "advice": "I figure any hotel or motel in town should have lots of blankets.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Well, someone's got to do it.", + "inquire": "Did you find us some bedding yet?", + "success": "Thanks! Feel free to sleep here if you want. It's the least we can do for the help.", + "success_lie": "How is this supposed to help us?", + "failure": "That's unfortunate. I guess we'll have to find someone else to do it." + } + }, + { + "id": "MISSION_LUMBERMILL_SET_TRADE_ROUTE", + "type": "mission_definition", + "name": "Establish A Trade Route", + "description": "Establish trade relations between the loggers and a refugee center, and bring back a writ of the agreement.", + "goal": "MGOAL_FIND_ITEM", + "item": "trade_writ_lumberyard", + "count": 1, + "difficulty": 35, + "value": 4000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "start": { "assign_mission_target": { "om_terrain": "evac_center_18", "om_special": "evac_center", "reveal_radius": 0 } }, + "has_generic_rewards": true, + "dialogue": { + "describe": "Go negotiate a trade agreement.", + "offer": "While some of us were out scavenging, we spotted an old evac shelter that looks like it might have some people inside. I want you to go over there, find whoever runs the joint, and see if we can make a deal with them for some processed lumber. This will be invaluable to our survival.", + "advice": "It should be pretty simple making the deal, but I'd recommend taking a car over there myself.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Please give it a try? This is really important to us.", + "inquire": "What did they say about the deal?", + "success": "Thank you! We're set for life on this one!", + "success_lie": "How does this help us?", + "failure": "That's unfortunate. I guess we'll have to find someone else to trade with." + } + } +] diff --git a/data/json/npcs/moonshiner/TALK_NPC_moonshiner.json b/data/json/npcs/moonshiner/TALK_NPC_moonshiner.json new file mode 100644 index 000000000000..ebdd22dd7dbe --- /dev/null +++ b/data/json/npcs/moonshiner/TALK_NPC_moonshiner.json @@ -0,0 +1,56 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_MOONSHINER", + "dynamic_line": { + "npc_has_var": "knows_u", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "Hey .", + "no": "Haven't seen someone new in a while. What brings you around here?" + }, + "speaker_effect": { "effect": { "npc_add_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "Just wandering, .", + "topic": "TALK_NPC_MOONSHINER_INTRO", + "condition": { "not": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "I'll make this real simple for you. Hand over your stuff, and no one gets hurt, capiche?", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "", + "topic": "TALK_NPC_MOONSHINER_INTRO", + "condition": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "Bye.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_MOONSHINER_INTRO", + "dynamic_line": "What can I do for you?", + "responses": [ + { "text": "Could you tell me a bit about yourself?", "topic": "TALK_NPC_MOONSHINER_STORY" }, + { "text": "Can I purchase any of your liquor?", "topic": "TALK_NPC_MOONSHINER_INTRO", "effect": "start_trade" }, + { + "text": "Anything I could do for you?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_MOONSHINER_STORY", + "dynamic_line": "I run this distillery you're standing in, before it wasn't so legal with the law. I was in some town making a deal on my product when a horde of rioters busted in, so I ran for it. I thought my business would be a nice place to stay, so I came out here.", + "responses": [ { "text": "Huh.", "topic": "TALK_NONE" } ] + } +] diff --git a/data/json/npcs/prepper/TALK_NPC_prepper.json b/data/json/npcs/prepper/TALK_NPC_prepper.json new file mode 100644 index 000000000000..b4270484e573 --- /dev/null +++ b/data/json/npcs/prepper/TALK_NPC_prepper.json @@ -0,0 +1,85 @@ +[ + { + "type": "talk_topic", + "id": "TALK_NPC_PREPPER_SURVIVOR", + "dynamic_line": { + "npc_has_var": "knows_u", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "", + "no": "Freeze you !" + }, + "speaker_effect": { "effect": { "npc_add_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "&Hold up your hands. \"Don't worry, I'm not going to hurt you\"", + "topic": "TALK_NPC_PREPPER_SURVIVOR_CALM", + "condition": { "not": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Hand over your stuff! Don't make any sudden moves, or you die!", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "", + "topic": "TALK_NPC_PREPPER_SURVIVOR_INTRO", + "condition": { "npc_has_var": "knows_u", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "Bye.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_PREPPER_SURVIVOR_CALM", + "dynamic_line": "Oh, you're not one of the . Come on in, just don't cause any trouble.", + "responses": [ + { "text": "Alright, let's chat.", "topic": "TALK_NPC_PREPPER_SURVIVOR_INTRO" }, + { "text": "I'll be back later.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_PREPPER_SURVIVOR_INTRO", + "dynamic_line": "What can I do for you?", + "responses": [ + { "text": "What are you doing here?", "topic": "TALK_NPC_PREPPER_SURVIVOR_STORY" }, + { + "text": "Would you be interested in bartering?", + "topic": "TALK_NPC_PREPPER_SURVIVOR_INTRO", + "effect": "start_trade" + }, + { "text": "Can I stay here for a while?", "topic": "TALK_NPC_PREPPER_SURVIVOR_STAY" }, + { + "text": "Why don't you come with me?", + "trial": { "type": "PERSUADE", "difficulty": -15, "mod": [ [ "value", 2 ] ] }, + "success": { "topic": "TALK_AGREE_FOLLOW", "effect": "follow", "opinion": { "trust": 1, "value": 1 } }, + "failure": { "topic": "TALK_DENY_FOLLOW", "effect": "deny_follow", "opinion": { "trust": 0, "fear": 0 } } + }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "I gotta go.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_PREPPER_SURVIVOR_STORY", + "dynamic_line": "They all said I was crazy for preparing for . Now, they're all dead, and I'm still kickin'. When the riots turned to hordes, I was ready; all I had to do was dodge a few to get back to my bastion. I've been living safely here ever since.", + "responses": [ + { "text": "Interesting.", "topic": "TALK_NPC_PREPPER_SURVIVOR_INTRO" }, + { "text": "Can I stay here for a while?", "topic": "TALK_NPC_PREPPER_SURVIVOR_STAY" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_PREPPER_SURVIVOR_STAY", + "dynamic_line": "Well, I guess you could borrow one of the spare beds, just don't hog it. I kept a few in case someone else joined me, but no one I knew came here.", + "responses": [ { "text": "Thanks.", "topic": "TALK_NPC_PREPPER_SURVIVOR_INTRO" } ] + } +] diff --git a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json index 20776a732709..5e44c54f3be4 100644 --- a/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json +++ b/data/json/npcs/refugee_center/surface_staff/NPC_free_merchant_shopkeep.json @@ -807,5 +807,62 @@ "dynamic_line": "*rubs his chin. \"It's probably technically a fire hazard, but there's not much to light up there besides what Dave brings. And a few of the guards are pretty attached to him, so we could maybe send folks up to keep an eye on him and make sure he's doing okay. That wouldn't interfere with comings and goings, either.\" He pauses a moment, looking at his ledger as if it contains answers. \"You know what? Sure. If Dave is okay with it, I can talk the others into letting him have rooftop access to build himself a little shelter, as long as he continues to keep it clean up there like he has in here.\"", "speaker_effect": { "effect": { "u_add_var": "Dave_Permission", "type": "mission", "value": "yes" } }, "responses": [ { "text": "Thanks. I'll go let him know.", "topic": "TALK_DONE" } ] + }, + { + "id": "TALK_EVAC_MERCHANT", + "type": "talk_topic", + "responses": [ + { + "text": "Are you interested in buying any processed lumber?", + "topic": "TALK_EVAC_MERCHANT_DEAL_NEGOTIATE_LUMBER", + "condition": { "u_has_mission": "MISSION_LUMBERMILL_SET_TRADE_ROUTE" } + }, + { + "text": "Does this center need any metal?", + "topic": "TALK_EVAC_MERCHANT_DEAL_NEGOTIATE_SCRAP", + "condition": { "u_has_mission": "MISSION_SCRAPPER_SET_TRADE_ROUTE" } + }, + { + "text": "Are you interested in any chemical supplies?", + "topic": "TALK_EVAC_MERCHANT_DEAL_NEGOTIATE_CHEM", + "condition": { "u_has_mission": "MISSION_CABIN_CHEMIST_SET_TRADE_ROUTE" } + } + ] + }, + { + "id": "TALK_EVAC_MERCHANT_DEAL_NEGOTIATE_SCRAP", + "type": "talk_topic", + "dynamic_line": [ "Sure, we could use some around here for repairs and whatnot. What are the terms?" ], + "responses": [ + { + "text": "Well, how about 250 merch for 50 kilos of…", + "effect": { "u_buy_item": "trade_writ_scrap" }, + "topic": "TALK_DONE" + } + ] + }, + { + "id": "TALK_EVAC_MERCHANT_DEAL_NEGOTIATE_LUMBER", + "type": "talk_topic", + "dynamic_line": [ "Sure, we could use some around here for repairs and whatnot. What are the terms?" ], + "responses": [ + { + "text": "Well, how about 500 merch for a dozen board feet of…", + "effect": { "u_buy_item": "trade_writ_lumberyard" }, + "topic": "TALK_DONE" + } + ] + }, + { + "id": "TALK_EVAC_MERCHANT_DEAL_NEGOTIATE_CHEM", + "type": "talk_topic", + "dynamic_line": [ "Chemicals? I'm sure we could find some use for them, and we are in need of medical supplies. What's the offer?" ], + "responses": [ + { + "text": "Well, how about 300 merch for 10 liters of…", + "effect": { "u_buy_item": "trade_writ_chemist" }, + "topic": "TALK_DONE" + } + ] } ] diff --git a/data/json/npcs/scrap_trader/scrap_trader.json b/data/json/npcs/scrap_trader/scrap_trader.json new file mode 100644 index 000000000000..cc90f65642d7 --- /dev/null +++ b/data/json/npcs/scrap_trader/scrap_trader.json @@ -0,0 +1,214 @@ +[ + { + "type": "npc", + "id": "NPC_scrap_trader", + "class": "NC_SCAVENGER", + "name_suffix": "scrapper", + "attitude": 0, + "mission": 7, + "chat": "TALK_NPC_SCRAP_TRADER", + "faction": "wasteland_scavengers", + "mission_offered": "MISSION_SCRAP_TRADER_GET_5_MICROWAVE" + }, + { + "type": "talk_topic", + "id": "TALK_NPC_SCRAP_TRADER", + "dynamic_line": { + "npc_has_var": "talked_to_trader", + "type": "dialogue", + "context": "first_meeting", + "value": "yes", + "yes": "Hello there. Nice to see you, .", + "no": "Haven't seen another face in quite a while. Not a living one, at least. State your business. Maybe you got some use for some of this scrap metal?" + }, + "speaker_effect": { "effect": { "npc_add_var": "talked_to_trader", "type": "dialogue", "context": "first_meeting", "value": "yes" } }, + "responses": [ + { + "text": "Nice to meet you.", + "topic": "TALK_NPC_SCRAP_TRADER_INTRO", + "condition": { "not": { "npc_has_var": "talked_to_trader", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Hands up, !", + "trial": { "type": "INTIMIDATE", "difficulty": 30 }, + "success": { "topic": "TALK_WEAPON_DROPPED", "effect": "drop_weapon", "opinion": { "trust": -4, "fear": 3 } }, + "failure": { "topic": "TALK_DONE", "effect": "hostile" }, + "condition": { "not": { "npc_has_var": "talked_to_trader", "type": "dialogue", "context": "first_meeting", "value": "yes" } } + }, + { + "text": "Pleasure to see you again, .", + "topic": "TALK_NPC_SCRAP_TRADER_INTRO", + "condition": { "npc_has_var": "talked_to_trader", "type": "dialogue", "context": "first_meeting", "value": "yes" } + }, + { "text": "See ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_SCRAP_TRADER_INTRO", + "dynamic_line": "Do you need something?", + "responses": [ + { "text": "What's your story?", "topic": "TALK_NPC_SCRAP_TRADER_STORY" }, + { "text": "Why stay here of all places?", "topic": "TALK_NPC_SCRAP_TRADER_FORT" }, + { "text": "Can I buy anything?", "topic": "TALK_SCRAP_TRADER_BULK_SELL" }, + { + "text": "Any jobs you need done?", + "condition": { "and": [ { "not": "has_assigned_mission" }, { "not": "has_many_assigned_missions" } ] }, + "topic": "TALK_MISSION_LIST" + }, + { "text": "Nah, see ya.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_SCRAP_TRADER_STORY", + "dynamic_line": "Well, I held a modest job here as a scrap yard worker. Business was fair most days, but when hit, I was on a solo shift. With all the craziness going on in the cities and whatnot, I decided to just stay here for while. I figure someone might find a use for the leftover metal lying around, so I started selling it to anyone who passed by.", + "responses": [ { "text": "Hmm.", "topic": "TALK_NONE" } ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_SCRAP_TRADER_FORT", + "dynamic_line": "Like I said, I was already here when the dead got pissed off. This place had some barbed wire, metalworking tools, and plenty of stuff to make weapons out of. Even the walls are my own making.", + "responses": [ + { "text": "Interesting.", "topic": "TALK_NONE" }, + { "text": "Think I could stay here?", "topic": "TALK_NPC_SCRAP_TRADER_HOME_STAY" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_NPC_SCRAP_TRADER_HOME_STAY", + "dynamic_line": "Sure, I'm fine with it. There's a spare bed over there for anyone who needs it. Just don't hog it. Someone else might come along.", + "responses": [ { "text": "Thanks, .", "topic": "TALK_NPC_SCRAP_TRADER_INTRO" } ] + }, + { + "id": "TALK_SCRAP_TRADER_BULK_SELL", + "//": "this is all the dialogue related to buying bulk metal or scrap.", + "type": "talk_topic", + "dynamic_line": [ "Sure thing. I've got a few things on hand, sold in batches of 10-piece each. What'll ya have?" ], + "responses": [ + { "text": "Nevermind.", "topic": "TALK_NONE" }, + { + "text": "I'd like some specialty metals.", + "topic": "TALK_SCRAP_TRADER_BULK_SELL_SPECIALTY", + "condition": { "npc_has_var": "specific_metal_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } + }, + { + "text": "[2$] I'll buy some scrap fragments.", + "effect": [ { "u_buy_item": "scrap", "cost": 200, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[5$] I'll buy some small sheet metal.", + "effect": [ { "u_buy_item": "sheet_metal_small", "cost": 500, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[10$] I'll buy some steel chunks.", + "effect": [ { "u_buy_item": "steel_chunk", "cost": 1000, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[30$] I'll buy some steel lumps.", + "effect": [ { "u_buy_item": "steel_lump", "cost": 3000, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some sheet metal.", + "effect": [ { "u_buy_item": "sheet_metal", "cost": 5000, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + } + ] + }, + { + "id": "TALK_SCRAP_TRADER_BULK_SELL_END", + "type": "talk_topic", + "dynamic_line": [ "Anything else you need?" ], + "responses": [ + { "text": "No, that's all.", "topic": "TALK_DONE" }, + { + "text": "I'd like some specialty metals.", + "topic": "TALK_SCRAP_TRADER_BULK_SELL_SPECIALTY", + "condition": { "npc_has_var": "specific_metal_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } + }, + { + "text": "[2$] I'll buy some scrap fragments.", + "effect": [ { "u_buy_item": "scrap", "cost": 200, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[5$] I'll buy some small sheet metal.", + "effect": [ { "u_buy_item": "sheet_metal_small", "cost": 500, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[10$] I'll buy some steel chunks.", + "effect": [ { "u_buy_item": "steel_chunk", "cost": 1000, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[30$] I'll buy some steel lumps.", + "effect": [ { "u_buy_item": "steel_lump", "cost": 3000, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[50$] I'll buy some sheet metal.", + "effect": [ { "u_buy_item": "sheet_metal", "cost": 5000, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + } + ] + }, + { + "id": "TALK_SCRAP_TRADER_BULK_SELL_SPECIALTY", + "type": "talk_topic", + "dynamic_line": [ "I've got freshly sorted metals in some small containers ready to go. What do you want?" ], + "//": "This is meant to be more costly due to the difficulty in obtaining them.", + "responses": [ + { "text": "Nevermind.", "topic": "TALK_NONE" }, + { + "text": "[10$] I'll buy some bismuth.", + "effect": [ { "u_buy_item": "bismuth", "container": "bag_zipper", "cost": 1000, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[10$] I'll buy some zinc.", + "effect": [ { "u_buy_item": "zinc_metal", "container": "jar_glass_sealed", "cost": 1000, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[12$] I'll buy some lead.", + "effect": [ { "u_buy_item": "lead", "container": "bag_zipper", "cost": 1200, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[14$] I'll buy some copper.", + "effect": [ { "u_buy_item": "scrap_copper", "cost": 1400, "count": 10 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[18$] I'll buy some tin.", + "effect": [ { "u_buy_item": "tin", "container": "bag_zipper", "cost": 1800, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[20$] I'll buy some magnesium.", + "effect": [ { "u_buy_item": "magnesium", "container": "bag_zipper", "cost": 2000, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[28$] I'll buy some silver.", + "effect": [ { "u_buy_item": "silver_small", "container": "bag_zipper", "cost": 2800, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[100$] I'll buy some gold.", + "effect": [ { "u_buy_item": "gold_small", "container": "bag_zipper", "cost": 10000, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + }, + { + "text": "[150$] I'll buy some platinum.", + "effect": [ { "u_buy_item": "platinum_small", "container": "jar_glass_sealed", "cost": 15000, "count": 100 } ], + "topic": "TALK_SCRAP_TRADER_BULK_SELL_END" + } + ] + } +] diff --git a/data/json/npcs/scrap_trader/scrap_trader_missions.json b/data/json/npcs/scrap_trader/scrap_trader_missions.json new file mode 100644 index 000000000000..76cdcbebe0e4 --- /dev/null +++ b/data/json/npcs/scrap_trader/scrap_trader_missions.json @@ -0,0 +1,103 @@ +[ + { + "id": "MISSION_SCRAP_TRADER_GET_5_MICROWAVE", + "type": "mission_definition", + "name": "Find 5 Microwaves", + "description": "Obtain 5 microwaves in exchange for credit with the scrap merchant.", + "goal": "MGOAL_FIND_ITEM", + "item": "microwave", + "count": 5, + "difficulty": 2, + "value": 10000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_SCRAP_TRADER_GET_75_CHARCOAL", + "end": { "effect": [ { "npc_add_var": "specific_metal_tradeable", "type": "dialogue", "context": "trade", "value": "yes" } ] }, + "has_generic_rewards": true, + "dialogue": { + "describe": "I need help…", + "offer": "Since business is increasing around here, I've decided to start selling more specialized metal. Problem is, I can't separate the metal out. Fortunately, I found some old schematics on a machine for this sort of thing. If you could get me 5 microwaves, I can melt down the sorted stuff into bars. I can quickly pay you in raw materials.", + "advice": "Microwaves were found in almost every home. An apartment block should have tons of them.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Someone's got to do it.", + "inquire": "Do you have the microwaves?", + "success": "Wonderful! I'll start the smelting as soon as possible.", + "success_lie": "Where are they? I don't believe you.", + "failure": "That's unfortunate. I guess I'll do it myself." + } + }, + { + "id": "MISSION_SCRAP_TRADER_GET_75_CHARCOAL", + "type": "mission_definition", + "name": "Obtain 75 Charcoal", + "description": "Obtain 75 lumps of charcoal in exchange for credit with the scrap merchant.", + "goal": "MGOAL_FIND_ITEM", + "item": "charcoal", + "count": 75, + "difficulty": 4, + "value": 7500, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_SCRAP_TRADER_GET_100_SOLDER", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need help…", + "offer": "That machine I put together is working wonderfully, but the generator is nearly out of juice. If you could get me 75 lumps of charcoal, I'll pay you however I can.", + "advice": "Its fairly simple to make some. I don't know where you could find any, though.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Someone's got to do it.", + "inquire": "Do you have the charcoal?", + "success": "Wonderful! This should do for a while.", + "success_lie": "Where are they? I don't believe you.", + "failure": "That's unfortunate. I guess I'll do it myself." + } + }, + { + "id": "MISSION_SCRAP_TRADER_GET_100_SOLDER", + "type": "mission_definition", + "name": "Obtain 100 Solder", + "description": "Obtain 100 solder in exchange for credit with the scrap merchant.", + "goal": "MGOAL_FIND_ITEM", + "item": "solder_wire", + "count": 100, + "difficulty": 3, + "value": 8000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "followup": "MISSION_SCRAPPER_SET_TRADE_ROUTE", + "has_generic_rewards": true, + "dialogue": { + "describe": "I need help…", + "offer": "That machine I put together needs some repairs on it, but I'm out of soldering wire. If you could get me about 100 spools, I'll pay you for it.", + "advice": "An electronics store might have some.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Someone's got to do it.", + "inquire": "Do you have the solder?", + "success": "Wonderful! This should do for a while.", + "success_lie": "Where are they? I don't believe you.", + "failure": "That's unfortunate. I guess I'll do it myself." + } + }, + { + "id": "MISSION_SCRAPPER_SET_TRADE_ROUTE", + "type": "mission_definition", + "name": "Establish A Trade Route", + "description": "Establish trade relations between the scrapper and a refugee center, and bring back a writ of the agreement.", + "goal": "MGOAL_FIND_ITEM", + "item": "trade_writ_scrap", + "count": 1, + "difficulty": 35, + "value": 10000, + "origins": [ "ORIGIN_OPENER_NPC" ], + "start": { "assign_mission_target": { "om_terrain": "evac_center_18", "om_special": "evac_center", "reveal_radius": 0 } }, + "has_generic_rewards": true, + "dialogue": { + "describe": "Go negotiate a trade agreement.", + "offer": "I was out scavenging recently, and I found one of those old evac shelters. Turns out the computer was still on and had an address for a refugee center. I figure they might want some spare metal, so I need you to go over there and strike a deal with them.", + "advice": "It should be pretty simple making the deal, but I'd recommend taking a car over there myself.", + "accepted": "I'll be here when you get back. Good luck!", + "rejected": "Please? This is really important to me.", + "inquire": "What did they say about it?", + "success": "Thank you!", + "success_lie": "How does this help us?", + "failure": "That's unfortunate. I guess we'll have to find someone else to trade with." + } + } +] diff --git a/data/json/overmap/overmap_special/specials.json b/data/json/overmap/overmap_special/specials.json index 045654c7efd2..85cac7a23e4d 100644 --- a/data/json/overmap/overmap_special/specials.json +++ b/data/json/overmap/overmap_special/specials.json @@ -6490,5 +6490,61 @@ { "point": [ 2, -1, 0 ], "connection": "local_road", "from": [ 1, -1, 0 ] } ], "flags": [ "CLASSIC", "URBAN" ] + }, + { + "type": "overmap_special", + "id": "Occupied Chem Lab", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "chemical_lab_ocu_north" }, + { "point": [ 0, 0, 1 ], "overmap": "chemical_lab_roof_ocu_north" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "connection": "local_road", "from": [ 0, 0, 0 ] } ], + "locations": [ "forest" ], + "city_distance": [ 5, 10 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC", "WILDERNESS", "ELECTRIC_GRID" ] + }, + { + "type": "overmap_special", + "id": "Occupied Scrap Yard", + "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "smallscrapyard_ocu_north" } ], + "connections": [ { "point": [ -1, 0, 0 ], "connection": "local_road", "from": [ 0, 0, 0 ] } ], + "locations": [ "field" ], + "city_distance": [ 5, 40 ], + "city_sizes": [ 1, -1 ], + "occurrences": [ 0, 1 ], + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "Occupied Lumbermill", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "lumbermill_0_0_ocu_north" }, + { "point": [ 1, 0, 0 ], "overmap": "lumbermill_1_0_ocu_north" }, + { "point": [ 0, 1, 0 ], "overmap": "lumbermill_0_1_ocu_north" }, + { "point": [ 1, 1, 0 ], "overmap": "lumbermill_1_1_ocu_north" }, + { "point": [ 0, 0, 1 ], "overmap": "lumbermill_0_0_roof_north" }, + { "point": [ 1, 0, 1 ], "overmap": "lumbermill_1_0_roof_north" }, + { "point": [ 0, 1, 1 ], "overmap": "lumbermill_0_1_roof_north" }, + { "point": [ 1, 1, 1 ], "overmap": "lumbermill_1_1_roof_north" }, + { "point": [ 2, 0, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 0, 2, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 1, 2, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 2, 1, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 2, 2, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 3, 0, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 3, 1, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 3, 2, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 0, 3, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 1, 3, 0 ], "overmap": "lumbermill_dforest_north" }, + { "point": [ 2, 3, 0 ], "overmap": "lumbermill_dforest_north" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "connection": "local_road", "from": [ 1, -1, 0 ] } ], + "locations": [ "forest" ], + "city_distance": [ 5, 60 ], + "city_sizes": [ 4, -1 ], + "occurrences": [ 0, 2 ], + "flags": [ "CLASSIC", "WILDERNESS", "ELECTRIC_GRID" ] } ] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json b/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json index 5bad4ccc9841..15305e7faaf7 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_industrial.json @@ -359,6 +359,14 @@ "color": "green", "flags": [ "SOURCE_CONSTRUCTION", "SOURCE_FABRICATION" ] }, + { + "type": "overmap_terrain", + "id": [ "lumbermill_0_0_ocu", "lumbermill_0_1_ocu", "lumbermill_1_0_ocu", "lumbermill_1_1_ocu" ], + "name": "lumbermill", + "sym": "L", + "color": "i_green", + "flags": [ "SOURCE_CONSTRUCTION", "SOURCE_FABRICATION", "SOURCE_PEOPLE" ] + }, { "type": "overmap_terrain", "id": "construction_site", diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_lab.json b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json index db8bd6a6a362..acfe5a3161b0 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_lab.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_lab.json @@ -465,5 +465,13 @@ "sym": "l", "color": "dark_gray", "see_cost": 2 + }, + { + "type": "overmap_terrain", + "id": [ "chemical_lab_ocu", "chemical_lab_roof_ocu" ], + "name": "small cabin", + "sym": "C", + "color": "i_green", + "flags": [ "SOURCE_CONSTRUCTION", "SOURCE_FABRICATION", "SOURCE_PEOPLE" ] } ] diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_waste_junk.json b/data/json/overmap/overmap_terrain/overmap_terrain_waste_junk.json index 61c6c828596a..8079836c81f6 100644 --- a/data/json/overmap/overmap_terrain/overmap_terrain_waste_junk.json +++ b/data/json/overmap/overmap_terrain/overmap_terrain_waste_junk.json @@ -290,5 +290,13 @@ "name": "abandoned textile mill", "color": "light_blue", "extend": { "flags": [ "SOURCE_CONSTRUCTION" ] } + }, + { + "type": "overmap_terrain", + "id": [ "smallscrapyard_ocu" ], + "name": "scrap yard", + "sym": "s", + "color": "red", + "flags": [ "SOURCE_PEOPLE" ] } ] diff --git a/data/json/snippets/epilogue_factions.json b/data/json/snippets/epilogue_factions.json index 673c0fe1ca74..58843cda0679 100644 --- a/data/json/snippets/epilogue_factions.json +++ b/data/json/snippets/epilogue_factions.json @@ -67,6 +67,14 @@ { "id": "epilogue_faction_isherwoods_150", "text": " The generational land of the Isherwoods came to flourish following , helping to feed nearby settlements. Survivors flocked to learn botany, animal handling, and backwoods remedies, eventually forming a small community…" + }, + { + "id": "epilogue_faction_lapin_0", + "text": " Mr. Lapin continued his remote life in the wilderness, teaching whoever would visit. The survivors who came slowly dwindled, until they stopped entirely. Mr. Lapin was found dead several years later following a heart attack. His body had decomposed to skeletal remains…" + }, + { + "id": "epilogue_faction_lapin_150", + "text": " The knowledge Mr. Lapin taught attracted a slew of individuals, who constructed makeshift housing to study with him. As more people came, they formed a small community…" } ] }