summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjc_gargma <jc_gargma@iserlohn-fortress.net>2023-12-05 11:14:05 -0800
committerjc_gargma <jc_gargma@iserlohn-fortress.net>2023-12-05 11:14:05 -0800
commitd07f3f6784c25e5ecd57d1143b151f8600c35954 (patch)
tree908f7e7490b5645c02ee12cec1b46e9c076e57b1
parentBackport fam fixes and more power armor changes. (diff)
downloadcataclysm-bn-d07f3f6784c25e5ecd57d1143b151f8600c35954.tar.xz
Fix Mr Lapin meet the Isherwood quest looping.
Backport street light additions Rename farm mapgen fix patch Backport campground mapgen fixes Backport tileset updates Backport energy weapon mod fixes Backport mechsuit ID card fixes
-rw-r--r--External_Tileset_DP_Normal.pngbin0 -> 42296 bytes
-rw-r--r--PKGBUILD39
-rw-r--r--backport-04-2_Add-street-lights-to-remaining-shops-port-change-to-.patch1718
-rw-r--r--backport-04_feat-content-port-game-store-3469.patch550
-rw-r--r--backport-05_fix-farm-mapgen-3715.patch (renamed from backport-04_fix-farm-mapgen-3715.patch)0
-rw-r--r--backport-06_fix-campground-mapgen-3702.patch186
-rw-r--r--backport-07_feat-interface-new-UDP-external-tileset-sprite-for-s.patch64
-rw-r--r--backport-08_feat-Convert-non-pistol-only-energy-weapon-mods-to-b.patch56
-rw-r--r--backport-09_feat-balance-MILITARY_MECH-flag-affects-ID-card-need.patch77
-rw-r--r--npc-06_lapin-update.patch8
10 files changed, 2692 insertions, 6 deletions
diff --git a/External_Tileset_DP_Normal.png b/External_Tileset_DP_Normal.png
new file mode 100644
index 0000000..1b47589
--- /dev/null
+++ b/External_Tileset_DP_Normal.png
Binary files differ
diff --git a/PKGBUILD b/PKGBUILD
index b2d8b7e..b562c74 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -20,7 +20,7 @@ _pkgname=Cataclysm-BN-cbn
pkgver=0.4
#pkgver=202310040030
#_pkgver=2023-10-04-0030
-pkgrel=9
+pkgrel=12
pkgdesc="A post-apocalyptic roguelike."
#url="http://cataclysmrl.blogspot.com/"
#url="http://www.cataclysm.glyphgryph.com/"
@@ -42,7 +42,14 @@ source=("$pkgname-$pkgver.tar.gz::https://github.com/cataclysmbnteam/Cataclysm-B
"backport-03_feat-balance-power-armor-updates-3625.patch"
"backport-03-2_fix-bugfixes-Fix-light-and-helmet-power-helms-having.patch"
"backport-03-3_feat-balance-HEAVY_WEAPON_SUPPORT-flag-for-large-mut.patch"
- "backport-04_fix-farm-mapgen-3715.patch"
+ "backport-04_feat-content-port-game-store-3469.patch"
+ "backport-04-2_Add-street-lights-to-remaining-shops-port-change-to-.patch"
+ "backport-05_fix-farm-mapgen-3715.patch"
+ "backport-06_fix-campground-mapgen-3702.patch"
+ "backport-07_feat-interface-new-UDP-external-tileset-sprite-for-s.patch"
+ "External_Tileset_DP_Normal.png"
+ "backport-08_feat-Convert-non-pistol-only-energy-weapon-mods-to-b.patch"
+ "backport-09_feat-balance-MILITARY_MECH-flag-affects-ID-card-need.patch"
"revert-01_removed-traits.patch"
"revert-02_revert-book-revamp.patch"
@@ -173,7 +180,14 @@ b2sums=('4d47457c12a539ed6fa1c5b1351f473e43aecfe1e4f2aafd37e7068fc166d95c7f72980
'c7d5c65d71f87439ffece8f230257c03b066f90a9b94194a21a3d7a59057d12e2fbf4378d485623c635d3e077ab864a6e90b1173c899e31004c5315d6a2145fe'
'20e5409086ab1927df3eab494d804d31d0544cd5444c166b760f7a7d574ea2975ad74d4d974d2e263f557f6a1e9757422dfee95b08f39db94a916372e1a1a2b1'
'fd7a7e216e3adda177a19747b5275a7222238c939e0d815e555665adbae18665db46e04691b95022aba14cf133110607dc10f6baf7540517314ebeb1b6bf2d69'
+ 'c5368de53a75e45f074acfc062cddcd07fc5615ecef77fe16b37ba7cec1ee7cea6ff1bd3b8fae66d51aab5f6ea43e39c372814064b2de5f4e0774531ace07290'
+ '67e6dccd3f6ed1b8ffddb631b8f81a4d1162349f96b7cf6eac2f73f43a2f076c2a9fcdf328c1f130461a14d308deaf19cf9c147eee41313afa823e9d2b5c51e1'
'd48d017ccf864d9cfd30051cc3bd94ca53c9a5982cc2d65ece9da487e3c6fcded2b83f95062227d8e778085aa578bfd0ab3c7f5cde095a5def3f7e52973bc5d1'
+ '2561b1ee8dac83b1b26049004fb6c5719441977d89af4e56458d464acf315ee1adddb8420ee077a6ab7fb014761540bcd3aef0451452d66b72b4efc6838cf48a'
+ 'c7321241e4bbe4bff078eb308a044568adcf57104284446c9f24399b37ac7693ac2203beff0a1e072d3db71380516ec5bdaac7338220886bd45f1cc670b5f2bb'
+ 'ba9a966dc826e5190adca3439da8e98eb493072e7df0ea5383e8d3eed7e22041c74368dfff9c8666cd800a552d156b11838aa961db73a485686d8939794189f4'
+ '03562be8187854c02003cbb40d021e2457bd6ba346ed0b106c40ad4fe4d700f83f463041c11da1076c2ec4440f2b03c013089c451491598f47ab64750e408205'
+ '7bc0e4907e069b40fdf06be91155f6bc99beeed425e20072d7dfa591977504c0959ad42f497cc0f33545c205028e823ef5c9cf568e51180a1fc65c3442812f86'
'fdef1f81084e7b08203b8464f37a00e2efc8b11d423c6e6b82e612392d91047160d2bc472b63c836ebc48adee0b4f2b3434c3e07eed5876275b234e69d7f6b9c'
'c2d6d7f74ada2ef54079fdf3759d9875552e2894dc8b753435acc692e705a9b297674eddb4e5a01a9269a84be7a82a8fef7e5762724b4d0f065976e877a05b00'
'e417a1786fbafb685099431f7f9926201ab80636bf3812da67acc341c7ef2b6a3853734d5b8b1bc355acbd5c0bedefb0401f8854aa5cb00032550afc8a7b9ebe'
@@ -223,7 +237,7 @@ b2sums=('4d47457c12a539ed6fa1c5b1351f473e43aecfe1e4f2aafd37e7068fc166d95c7f72980
'bc5e233c9c5b7f799a126d51d672ad510ff4f6f75a573ea8b8e994d6be07375c0b4997acef16dacad555a7f36907a361f6cc4076b97d66c4c567dc9e707bc37e'
'863676b5168dc2a63ad89a5c9de6f52b65a681954c7a646c2e9a9ca4decad871ab6674df7b8e6d4fa08e90ec0696771a2c5afce358e5e9b729adbd2fc7360aef'
'6478e17056a909a6674721d496047e5b3abe2deaf355d4a90461daf702281f5c21acc5e4ccee394917f07e6f2065daf9405384061d80cc2e528ddd3369765b98'
- '93be2ff64a3217f92b369c067121683083859c7e939535e55f11818dc346d4862a50faa371315ad28ab54c9778c749d7684e8a7d68a18f774be3c2fe7891bd62'
+ '49d39404138e5e45fdb05b772636388eb7aada9dab6e549904e4b87053329d9df506ad6f390d73fb25c518299459df657ca6e02142fed9d29f4cd1c5f89734d7'
'246a189a0002e755bbed91257c324d0f34bab724f38a31bad1d5eb8bc5b126ecb3a0af8f69a6d0f5f084930c670d2747942beabab0b684f7f66a13044dec394a'
'739d0a1acbf6cdd1c6e78cac75a792d475b140219ffbf8c44d4db9fa82dc93f0822763be14c81afe69ab167a611a5d89fceb3df39d28b191835e14628c369140'
'f7a9c6d083f73c780be2f7ebf4e5e8deb4001aaca39b73ec9c6a5ef69f0621b45f9c384f32bc1c86cf238052ad77cf4703cc07886ede8bc62f19433d838b282a'
@@ -323,8 +337,25 @@ prepare() {
patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-03-2_fix-bugfixes-Fix-light-and-helmet-power-helms-having.patch
patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-03-3_feat-balance-HEAVY_WEAPON_SUPPORT-flag-for-large-mut.patch
+ # Backport streetlights and the game store required for it
+ patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-04_feat-content-port-game-store-3469.patch
+ patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-04-2_Add-street-lights-to-remaining-shops-port-change-to-.patch
+
# Backport some farm fixes
- patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-04_fix-farm-mapgen-3715.patch
+ patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-05_fix-farm-mapgen-3715.patch
+
+ # Backport some campground fixes
+ patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-06_fix-campground-mapgen-3702.patch
+
+ # Backport some external tileset changes
+ patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-07_feat-interface-new-UDP-external-tileset-sprite-for-s.patch
+ cp -f "$srcdir"/External_Tileset_DP_Normal.png data/json/external_tileset/External_Tileset_DP_Normal.png
+
+ # Backport energy weapon mod fixes
+ patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-08_feat-Convert-non-pistol-only-energy-weapon-mods-to-b.patch
+
+ # Backport industrial mech incorrectly requiring a military ID card
+ patch -Np1 --no-backup-if-mismatch -i "$srcdir"/backport-09_feat-balance-MILITARY_MECH-flag-affects-ID-card-need.patch
# # # Reverts
diff --git a/backport-04-2_Add-street-lights-to-remaining-shops-port-change-to-.patch b/backport-04-2_Add-street-lights-to-remaining-shops-port-change-to-.patch
new file mode 100644
index 0000000..a004c37
--- /dev/null
+++ b/backport-04-2_Add-street-lights-to-remaining-shops-port-change-to-.patch
@@ -0,0 +1,1718 @@
+From 1c153718ab5ebddf00e83394a51c48692a338b4b Mon Sep 17 00:00:00 2001
+From: Chaosvolt <chaosvolt@users.noreply.github.com>
+Date: Thu, 9 Nov 2023 04:58:40 -0600
+Subject: [PATCH] Add street lights to remaining shops, port change to make
+ them no longer opaque (#3594)
+
+* Add street lights to remaining shops
+
+* Updoots
+
+* Also port streetlight thing
+
+Co-Authored-By: Fris0uman <41293484+Fris0uman@users.noreply.github.com>
+
+---------
+
+Co-authored-by: Fris0uman <41293484+Fris0uman@users.noreply.github.com>
+---
+ .../furniture-appliances.json | 2 +-
+ .../furniture-terrains.json | 4 ++--
+ data/json/mapgen/diner.json | 2 +-
+ data/json/mapgen/gunsmith.json | 2 +-
+ data/json/mapgen/recycle_center.json | 12 +++++++++---
+ data/json/mapgen/restaurant.json | 16 ++++++++++++----
+ data/json/mapgen/restaurant_fast.json | 8 ++++++--
+ data/json/mapgen/s_bookstore.json | 18 ++++++++++++------
+ data/json/mapgen/s_candy.json | 8 ++++++--
+ data/json/mapgen/s_clothing.json | 19 ++++++++++++-------
+ data/json/mapgen/s_coffee.json | 12 +++++++++---
+ data/json/mapgen/s_electronics.json | 14 ++++++++++----
+ data/json/mapgen/s_furniture.json | 4 +++-
+ data/json/mapgen/s_games.json | 4 +++-
+ data/json/mapgen/s_gas.json | 14 +++++++++-----
+ data/json/mapgen/s_grocery.json | 17 ++++++++++++++---
+ data/json/mapgen/s_gun.json | 16 ++++++++++++----
+ data/json/mapgen/s_hardware.json | 16 ++++++++++++----
+ data/json/mapgen/s_icecream.json | 4 +++-
+ data/json/mapgen/s_liquor.json | 4 +++-
+ data/json/mapgen/school_1.json | 4 +++-
+ data/json/mapgen/smallscrapyard.json | 4 +++-
+ data/json/mapgen/smoke_lounge.json | 8 ++++++--
+ data/json/mapgen/sports_store.json | 4 +++-
+ data/json/mapgen/station_radio.json | 8 ++++++--
+ data/json/mapgen/storage_units_large.json | 4 +++-
+ data/json/mapgen/storage_units_medium.json | 4 +++-
+ data/json/mapgen/storage_units_small.json | 4 +++-
+ data/json/mapgen/teashop.json | 8 ++++++--
+ data/json/mapgen/thrift.json | 4 +++-
+ data/json/mapgen/veterinarian.json | 4 +++-
+ data/json/mapgen/vfw.json | 4 +++-
+ data/json/mapgen/warehouse.json | 6 ++++--
+ .../clothes_store_palette.json | 7 ++++++-
+ data/mods/No_Hope/Mapgen/school_1.json | 4 +++-
+ 35 files changed, 198 insertions(+), 75 deletions(-)
+
+diff --git a/data/json/furniture_and_terrain/furniture-appliances.json b/data/json/furniture_and_terrain/furniture-appliances.json
+index a0dd071fb08..42707a73da0 100644
+--- a/data/json/furniture_and_terrain/furniture-appliances.json
++++ b/data/json/furniture_and_terrain/furniture-appliances.json
+@@ -260,7 +260,7 @@
+ "move_cost_mod": -1,
+ "coverage": 40,
+ "required_str": -1,
+- "flags": [ "BASHABLE" ],
++ "flags": [ "BASHABLE", "TRANSPARENT" ],
+ "examine_action": "transform",
+ "transforms_into": "f_street_light_rewired_on",
+ "prompt": "Switch on the street light.",
+diff --git a/data/json/furniture_and_terrain/furniture-terrains.json b/data/json/furniture_and_terrain/furniture-terrains.json
+index 93b8b04c453..c3baf2822a4 100644
+--- a/data/json/furniture_and_terrain/furniture-terrains.json
++++ b/data/json/furniture_and_terrain/furniture-terrains.json
+@@ -722,7 +722,7 @@
+ "move_cost_mod": -1,
+ "coverage": 40,
+ "required_str": -1,
+- "flags": [ "BASHABLE" ],
++ "flags": [ "BASHABLE", "TRANSPARENT" ],
+ "deconstruct": {
+ "items": [
+ { "item": "pipe", "count": 8 },
+@@ -759,7 +759,7 @@
+ "move_cost_mod": -1,
+ "coverage": 40,
+ "required_str": 32,
+- "flags": [ "BASHABLE" ],
++ "flags": [ "BASHABLE", "TRANSPARENT" ],
+ "bash": {
+ "str_min": 30,
+ "str_max": 100,
+diff --git a/data/json/mapgen/diner.json b/data/json/mapgen/diner.json
+index 038b6e5caba..9cc0551086a 100644
+--- a/data/json/mapgen/diner.json
++++ b/data/json/mapgen/diner.json
+@@ -38,7 +38,7 @@
+ ",": "t_pavement_y",
+ "-": "t_wall_w",
+ ".": "t_grass",
+- "'": "t_sidewalk",
++ "'": "t_pavement",
+ "=": "t_sidewalk",
+ "G": "t_linoleum_gray",
+ "H": "t_linoleum_white",
+diff --git a/data/json/mapgen/gunsmith.json b/data/json/mapgen/gunsmith.json
+index e69cc01605e..c0b3988ac7b 100644
+--- a/data/json/mapgen/gunsmith.json
++++ b/data/json/mapgen/gunsmith.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "__________________sss'__",
++ "__________________sss__'",
+ "_,___,___,___,___,sss_%_",
+ "_,___,___,___,___,sss_%_",
+ "_,___,___,___,___,sss_%_",
+diff --git a/data/json/mapgen/recycle_center.json b/data/json/mapgen/recycle_center.json
+index 6baee912caf..63875d260b1 100644
+--- a/data/json/mapgen/recycle_center.json
++++ b/data/json/mapgen/recycle_center.json
+@@ -4,6 +4,7 @@
+ "object": {
+ "fill_ter": "t_thconc_floor",
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_table",
+ "&": "f_trashcan",
+ "P": "f_sign",
+@@ -29,7 +30,7 @@
+ { "chance": 50, "repeat": [ 180, 350 ], "item": "recycle_plastic", "x": [ 7, 8 ], "y": [ 11, 19 ] }
+ ],
+ "rows": [
+- ".........s..............",
++ ".........s.............'",
+ ".........s..............",
+ ".........s..............",
+ ".........s..............",
+@@ -58,6 +59,7 @@
+ "&": "t_floor",
+ "+": "t_door_metal_c",
+ ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "D": "t_door_c",
+ "_": "t_thconc_floor",
+ "c": "t_floor",
+@@ -140,6 +142,7 @@
+ "object": {
+ "fill_ter": "t_thconc_floor",
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_table",
+ "&": "f_trashcan",
+ "C": "f_chair",
+@@ -169,7 +172,7 @@
+ ],
+ "place_vehicles": [ { "chance": 75, "fuel": 0, "rotation": 270, "status": -1, "vehicle": "forklift", "x": 16, "y": [ 7, 16 ] } ],
+ "rows": [
+- ".....cccc...............",
++ ".....cccc..............'",
+ ".....cccc...............",
+ ".....cccc...............",
+ "..---S++S--|||ww||D|w|..",
+@@ -198,6 +201,7 @@
+ "+": "t_chaingate_c",
+ "-": "t_chainfence",
+ ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "D": "t_door_metal_c",
+ "P": "t_concrete",
+ "S": "t_chainfence",
+@@ -283,6 +287,7 @@
+ "object": {
+ "fill_ter": "t_thconc_floor",
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "&": "f_trashcan",
+ "P": "f_sign",
+@@ -309,7 +314,7 @@
+ ],
+ "place_loot": [ { "item": "television", "x": 4, "y": 14, "chance": 100 }, { "item": "stepladder", "x": 8, "y": 13, "chance": 100 } ],
+ "rows": [
+- "__________ppppp_________",
++ "__________ppppp________'",
+ "__________ppppp_________",
+ "______4___ppppp_____7___",
+ "_4________ppppp_________",
+@@ -344,6 +349,7 @@
+ "P": "t_concrete",
+ "R": "t_recycler",
+ "_": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "p": "t_pavement",
+ "s": "t_grass",
+ "t": "t_thconc_floor",
+diff --git a/data/json/mapgen/restaurant.json b/data/json/mapgen/restaurant.json
+index 033ac5d8031..53f703b94af 100644
+--- a/data/json/mapgen/restaurant.json
++++ b/data/json/mapgen/restaurant.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "____,____,____,____,____",
++ "____,____,____,____,___'",
+ "____,____,____,____,____",
+ "____,____,____,____,____",
+ "____,____,____,____,____",
+@@ -48,6 +48,7 @@
+ "S": "t_linoleum_white",
+ "W": "t_window",
+ "_": "t_pavement",
++ "'": "t_pavement",
+ "d": "t_pavement",
+ "g": "t_linoleum_gray",
+ "w": "t_linoleum_white",
+@@ -57,6 +58,7 @@
+ "|": "t_wall_r"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "&": "f_trashcan",
+ "B": "f_bench",
+@@ -170,7 +172,7 @@
+ "object": {
+ "fill_ter": "t_carpet_green",
+ "rows": [
+- "ssssssssssssssssssssssss",
++ "sssssssssssssssssssssss`",
+ "ssssssssssssssssssssssss",
+ "ssss|-------------|sssss",
+ "____|&wlfF|.......|sssss",
+@@ -220,6 +222,7 @@
+ "g": "t_wall_glass",
+ "l": "t_linoleum_gray",
+ "s": "t_sidewalk",
++ "`": "t_sidewalk",
+ "w": "t_linoleum_white",
+ "{": "t_linoleum_white",
+ "4": "t_gutter_downspout",
+@@ -228,6 +231,7 @@
+ "|": "t_wall_y"
+ },
+ "furniture": {
++ "`": "f_street_light",
+ "#": "f_counter",
+ "2": "f_counter",
+ "&": "f_trashcan",
+@@ -342,7 +346,7 @@
+ "object": {
+ "fill_ter": "t_linoleum_white",
+ "rows": [
+- "____,____,____,____,____",
++ "____,____,____,____,___'",
+ "____,____,____,____,____",
+ "____,____,____,____,____",
+ "____,____,____,____,____",
+@@ -385,6 +389,7 @@
+ "c": "t_rdoor_b",
+ "x": "t_linoleum_white",
+ "_": "t_pavement",
++ "'": "t_pavement",
+ "f": "t_linoleum_white",
+ "t": "t_linoleum_white",
+ "4": "t_gutter_downspout",
+@@ -394,6 +399,7 @@
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "G": "f_oven",
+ "x": "f_rack",
+@@ -511,7 +517,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "____,____,____,____,____",
++ "____,____,____,____,___'",
+ "____,____,____,____,____",
+ "____,____,____,____,____",
+ "____,____,____,____,____",
+@@ -553,6 +559,7 @@
+ "S": "t_linoleum_white",
+ "W": "t_window",
+ "_": "t_pavement",
++ "'": "t_pavement",
+ "d": "t_pavement",
+ "g": "t_linoleum_gray",
+ "w": "t_linoleum_white",
+@@ -563,6 +570,7 @@
+ "|": "t_wall_p"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "&": "f_trashcan",
+ "B": "f_bench",
+diff --git a/data/json/mapgen/restaurant_fast.json b/data/json/mapgen/restaurant_fast.json
+index 5dc4d3f73fd..21cd246c537 100644
+--- a/data/json/mapgen/restaurant_fast.json
++++ b/data/json/mapgen/restaurant_fast.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- ",_____ssssssssssss_____,",
++ ",_____ssssssssssss_____'",
+ ",__,__#### ss ####__,__,",
+ ",_,,,_#ssssssssss#__,__,",
+ ",__,__#HTHssssHTH#__,__,",
+@@ -45,6 +45,7 @@
+ "%": "t_wall_glass",
+ "+": "t_door_glass_c",
+ ",": "t_pavement_y",
++ "'": "t_pavement_y",
+ "-": "t_wall_w",
+ ".": "t_floor",
+ "5": "t_wall_glass",
+@@ -66,6 +67,7 @@
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "H": "f_chair",
+ "O": "f_woodstove",
+ "S": "f_sink",
+@@ -168,7 +170,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "____,,,,,#ssssssssssssss",
++ "____,,,,,#sssssssssssss'",
+ "_________#ss|555++++555|",
+ "_________#ss5.HH.HH..hh|",
+ "_________#ss5.TT.TT..Th|",
+@@ -216,6 +218,7 @@
+ "r": "t_linoleum_gray",
+ "d": "t_sidewalk",
+ "s": "t_sidewalk",
++ "'": "t_sidewalk",
+ "D": "t_door_locked",
+ "t": "t_door_c",
+ "w": "t_linoleum_white",
+@@ -224,6 +227,7 @@
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "H": "f_chair",
+ "F": "f_arcade_machine",
+ "S": "f_sink",
+diff --git a/data/json/mapgen/s_bookstore.json b/data/json/mapgen/s_bookstore.json
+index 625a11737e3..1553c7f116b 100644
+--- a/data/json/mapgen/s_bookstore.json
++++ b/data/json/mapgen/s_bookstore.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "~~~~~~~~~~~~~~~~~~~~~~~~",
++ "~~~~~~~~~~~~~~~~~~~~~~~'",
+ "~~~~~~~~~~~~~~~~~~~~~~~~",
+ "*|----OOO-::--OO--OO--|*",
+ "*|s.l#.Thf..#ccccccccc|*",
+@@ -45,9 +45,11 @@
+ "|": "t_wall_w",
+ "4": "t_gutter_downspout",
+ "<": "t_ladder_up",
+- "~": "t_sidewalk"
++ "~": "t_sidewalk",
++ "'": "t_sidewalk"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "T": "f_table",
+ "]": "f_rack",
+@@ -226,7 +228,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "~~~~~~~~~~~~~~~~~~~~~~~~",
++ "~~~~~~~~~~~~~~~~~~~~~~~'",
+ "~~~~~~~~~~~~~~~~~~~~~~~~",
+ "~~~~~~~~~~~~~~~~~~~~~~~~",
+ "**|========::-OO--OO-|**",
+@@ -264,9 +266,11 @@
+ "O": "t_window",
+ "q": "t_grass",
+ "|": "t_wall_w",
+- "~": "t_sidewalk"
++ "~": "t_sidewalk",
++ "'": "t_sidewalk"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "T": "f_table",
+ "[": "f_rack",
+@@ -433,7 +437,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "~~~~~~~~~~~~~~~~~~~~~~~~",
++ "~~~~~~~~~~~~~~~~~~~~~~~'",
+ "~~~qSq~~~~~~~~~~qqq~~~~~",
+ "~~~~~~~~~~~~~~~~~~~~~~~~",
+ "~~~~~~~~~~~~~~~~~~~~~~~~",
+@@ -471,9 +475,11 @@
+ "q": "t_dirt",
+ "|": "t_wall_w",
+ "4": "t_gutter_downspout",
+- "~": "t_sidewalk"
++ "~": "t_sidewalk",
++ "'": "t_sidewalk"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "S": "f_statue",
+ "T": "f_table",
+diff --git a/data/json/mapgen/s_candy.json b/data/json/mapgen/s_candy.json
+index f3afd458e67..b624abe21ee 100644
+--- a/data/json/mapgen/s_candy.json
++++ b/data/json/mapgen/s_candy.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- ".............dssd.......",
++ ".............dssd......'",
+ "....fD..f.D..dssd....fD.",
+ "........D.f..dssd..d....",
+ "...uudud.....dssd.d7d...",
+@@ -36,6 +36,7 @@
+ "+": "t_door_c",
+ "-": "t_wall_glass",
+ ".": [ [ "t_grass", 5 ], [ "t_grass_long", 5 ], "t_dirt" ],
++ "'": "t_dirt",
+ "7": "t_tree_apple_harvested",
+ "D": "t_dirt",
+ "R": "t_railing_v",
+@@ -55,6 +56,7 @@
+ "|": "t_wall_y"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "&": "f_trashcan",
+ "B": "f_bench",
+@@ -168,7 +170,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "............ss..........",
++ "............ss.........'",
+ "............ss..........",
+ "...d....d...ss.u.u.u.u..",
+ "..d7d..d4d..ss|||||||||.",
+@@ -197,6 +199,7 @@
+ "+": "t_door_glass_c",
+ "-": "t_wall_glass",
+ ".": [ [ "t_grass", 5 ], [ "t_grass_long", 5 ], "t_dirt" ],
++ "'": "t_dirt",
+ "4": "t_tree_pine",
+ "7": "t_tree_birch_harvested",
+ "D": "t_dirt",
+@@ -218,6 +221,7 @@
+ "|": "t_brick_wall"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "&": "f_trashcan",
+ "C": "f_chair",
+diff --git a/data/json/mapgen/s_clothing.json b/data/json/mapgen/s_clothing.json
+index f4957f00293..0de27ff1eca 100644
+--- a/data/json/mapgen/s_clothing.json
++++ b/data/json/mapgen/s_clothing.json
+@@ -8,7 +8,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "...........--...........",
++ "...........--..........'",
+ "...........--...........",
+ "..##:::::::**:::::::##..",
+ "..# y &y&y(y #..",
+@@ -34,6 +34,7 @@
+ "....................4..."
+ ],
+ "palettes": [ "standard_building_palette", "clothes_store_palette" ],
++ "terrain": { "'": "t_region_groundcover_urban" },
+ "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 0, 0 ], "y": [ 23, 23 ], "chance": 2, "repeat": [ 2, 3 ] } ],
+ "vehicles": { ".": { "vehicle": "shopping_cart", "chance": 1, "status": 0 } }
+ }
+@@ -99,7 +100,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "------------------------",
++ "-----------------------'",
+ "-----.ppp.-----.ppp.----",
+ "------------------------",
+ "...#:::::::***:::::::#..",
+@@ -186,7 +187,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "------------------------",
++ "-----------------------'",
+ "------------------------",
+ "------------------------",
+ "..p--####:::++:::#......",
+@@ -274,7 +275,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "~~~~~~~~~~~~~~~~~~~~~~~~",
++ "~~~~~~~~~~~~~~~~~~~~~~~'",
+ "~~~~~~~~~~~~~~~~~~~~~~~~",
+ "~~~~11~~~~1111~~~11~~~~~",
+ "***|===::----==::==|****",
+@@ -311,11 +312,13 @@
+ "i": "t_door_locked_interior",
+ "|": "t_wall_w",
+ "~": "t_sidewalk",
++ "'": "t_sidewalk",
+ "1": "t_sidewalk",
+ "4": "t_gutter_downspout"
+ },
+ "sealed_item": { "1": { "item": { "item": "seed_rose" }, "furniture": "f_planter_harvest" } },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "&": "f_counter_gate_c",
+ "@": "f_mannequin",
+@@ -409,7 +412,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "------------------------",
++ "-----------------------'",
+ "------------------------",
+ "------------------------",
+ ".#:::::**::::::**:::::#.",
+@@ -549,7 +552,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "~~~~~~~~~~~~~~~~~~~~~~~~",
++ "~~~~~~~~~~~~~~~~~~~~~~~'",
+ "~~~~~~~~~~~~~~~~~~~~~~~~",
+ "*****rzr**~~~**rzr******",
+ "*****rzr**~~~**rzr******",
+@@ -593,10 +596,12 @@
+ "z": "t_shrub",
+ "|": "t_brick_wall",
+ "~": "t_sidewalk",
++ "'": "t_sidewalk",
+ "R": "t_grass",
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "@": "f_mannequin",
+ "H": "f_chair",
+@@ -699,7 +704,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "------------------------",
++ "-----------------------'",
+ "----ppppp------ppppp----",
+ "------------------------",
+ "..#:::::::#**#:::::::#..",
+diff --git a/data/json/mapgen/s_coffee.json b/data/json/mapgen/s_coffee.json
+index 6b005ff91ba..647ea9e335f 100644
+--- a/data/json/mapgen/s_coffee.json
++++ b/data/json/mapgen/s_coffee.json
+@@ -13,7 +13,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "S___________SSTzzzzzzzTS",
++ "S___________SSTzzzzzzzT'",
+ "S_____,_____SSzMbMbMbMzS",
+ "S_____,_____SSSSSSSS/MzS",
+ "S_____,_____SSSSSSSS/MzS",
+@@ -59,6 +59,7 @@
+ "M": "t_dirt",
+ "O": "t_window",
+ "S": "t_sidewalk",
++ "'": "t_sidewalk",
+ "U": "t_linoleum_white",
+ "V": "t_wall_glass",
+ "W": "t_fencegate_c",
+@@ -77,6 +78,7 @@
+ "T": "t_tree_coffee"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "%": "f_trashcan",
+ "/": "f_bluebell",
+@@ -187,7 +189,7 @@
+ "//": "Default fill is floor but some tables are outside",
+ "fill_ter": "t_floor",
+ "rows": [
+- "_______,,,,,,,ss########",
++ "_______,,,,,,,s'########",
+ "______________ss#pppppp#",
+ "______________ssspHTTHp#",
+ "______________ssspppppp#",
+@@ -241,11 +243,13 @@
+ "p": "t_concrete",
+ "r": "t_linoleum_white",
+ "s": "t_sidewalk",
++ "'": "t_sidewalk",
+ "x": "t_console_broken",
+ "4": "t_gutter_downspout",
+ "|": "t_wall_b"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "&": "f_trashcan",
+ "H": "f_chair",
+ "O": "f_oven",
+@@ -333,6 +337,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_chair",
+ "&": "f_trashcan",
+ "+": "f_null",
+@@ -378,7 +383,7 @@
+ ],
+ "place_toilets": [ { "x": 20, "y": 17 } ],
+ "rows": [
+- "______________sss_______",
++ "______________sss______'",
+ "______u__u____sss_______",
+ "____uSSuSSSu__sss_SSS___",
+ "__||||||----||sss||w||__",
+@@ -414,6 +419,7 @@
+ "T": "t_floor",
+ "^": "t_floor",
+ "_": "t_grass",
++ "'": "t_dirt",
+ "a": "t_floor",
+ "b": "t_door_metal_pickable",
+ "c": "t_floor",
+diff --git a/data/json/mapgen/s_electronics.json b/data/json/mapgen/s_electronics.json
+index 6bc6965bc10..ab3923027a1 100644
+--- a/data/json/mapgen/s_electronics.json
++++ b/data/json/mapgen/s_electronics.json
+@@ -8,7 +8,7 @@
+ "object": {
+ "fill_ter": "t_linoleum_gray",
+ "rows": [
+- "zs______,______,______sz",
++ "ss______,______,______s'",
+ "zs______,______,______sz",
+ "zs______,______,______sz",
+ "zs______,______,______sz",
+@@ -50,6 +50,7 @@
+ "_": "t_pavement",
+ "d": "t_pavement",
+ "s": "t_sidewalk",
++ "'": "t_sidewalk",
+ "x": "t_console_broken",
+ "z": "t_shrub",
+ "|": "t_wall_w",
+@@ -57,6 +58,7 @@
+ "<": "t_ladder_up"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "C": "f_displaycase",
+ "E": "f_desk",
+@@ -166,8 +168,8 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- " xxxxxxx 9 ",
+- " 9 xxxpJpxxx 9 ",
++ " xxxxxxx 9 '",
++ " 9 xxxpJpxxx 9 ",
+ " xxxxxxxxxxxxxxxx",
+ " ------:::-+--:::--- x",
+ " 9 |{{{{{y.......#..Y| x",
+@@ -193,6 +195,7 @@
+ ],
+ "terrain": {
+ " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ ".": "t_floor",
+ "p": "t_grass",
+ "J": "t_grass",
+@@ -232,6 +235,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "{": "f_rack",
+ "S": "f_stool",
+@@ -331,7 +335,7 @@
+ "object": {
+ "fill_ter": "t_region_groundcover_urban",
+ "rows": [
+- " ____________________ ",
++ " ____________________ '",
+ " *___*___*______*___* ",
+ " ---:::---+----:::--- ",
+ " |H....#...........R| ",
+@@ -357,6 +361,7 @@
+ " ==================== "
+ ],
+ "terrain": {
++ "'": "t_region_groundcover_urban",
+ "*": "t_pavement_y",
+ "+": "t_door_metal_pickable",
+ "-": "t_concrete_wall",
+@@ -398,6 +403,7 @@
+ ]
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "S": "f_stool",
+ "{": "f_rack",
+diff --git a/data/json/mapgen/s_furniture.json b/data/json/mapgen/s_furniture.json
+index 85599da1ad5..8ba0dcd792b 100644
+--- a/data/json/mapgen/s_furniture.json
++++ b/data/json/mapgen/s_furniture.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- " ",
++ " '",
+ " |ggggggggg++ggggggggg| ",
+ " |.CphpH.c....O.O.&F&.| ",
+ " |B.....kc...........y| ",
+@@ -34,6 +34,7 @@
+ ],
+ "terrain": {
+ " ": "t_pavement",
++ "'": "t_pavement",
+ "+": "t_door_c",
+ "-": "t_wall_w",
+ "D": "t_door_locked",
+@@ -43,6 +44,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_table",
+ "&": "f_fridge",
+ "B": "f_rack",
+diff --git a/data/json/mapgen/s_games.json b/data/json/mapgen/s_games.json
+index 18b62a01b36..f19b9a4eef6 100644
+--- a/data/json/mapgen/s_games.json
++++ b/data/json/mapgen/s_games.json
+@@ -6,7 +6,7 @@
+ "object": {
+ "fill_ter": "t_carpet_purple",
+ "rows": [
+- "......fg____g____g____gf",
++ "......fg____g____g____g'",
+ "......fg____g____g____gf",
+ "......fg____g____g____gf",
+ "......fg____g____g____gf",
+@@ -40,6 +40,7 @@
+ "_": "t_pavement",
+ ".": "t_region_groundcover_urban",
+ "f": "t_sidewalk",
++ "'": "t_sidewalk",
+ "g": "t_pavement_y",
+ "h": "t_carpet_purple",
+ "i": "t_carpet_purple",
+@@ -56,6 +57,7 @@
+ "9": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "h": "f_rack_wood",
+ "i": "f_counter",
+ "ƃ": "f_counter_gate_c",
+diff --git a/data/json/mapgen/s_gas.json b/data/json/mapgen/s_gas.json
+index 5f276fe967f..0ead27e3b96 100644
+--- a/data/json/mapgen/s_gas.json
++++ b/data/json/mapgen/s_gas.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_pavement",
+ "rows": [
+- "........................",
++ ".......................'",
+ ".-----..................",
+ ".|...|..........sss.....",
+ ".|...|...........&s.....",
+@@ -38,11 +38,12 @@
+ "+": "t_chaingate_l",
+ "-": "t_chainfence_h",
+ ".": "t_pavement",
++ "'": "t_pavement",
+ "5": "t_gas_pump",
+ "s": "t_little_column",
+ "|": "t_chainfence_v"
+ },
+- "furniture": { "9": "f_aut_gas_console" },
++ "furniture": { "'": "f_street_light", "9": "f_aut_gas_console" },
+ "signs": { "P": { "signage": "Danger! Do not smoke! Risk of explosion!" } },
+ "vendingmachines": { "1": { "item_group": "vending_drink" }, "2": { "item_group": "vending_food" } },
+ "place_liquids": [ { "liquid": "gasoline", "x": 3, "y": 3, "repeat": [ 200, 1075 ] } ]
+@@ -56,7 +57,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "____:]:____:____:]:____]",
++ "____:]:____:____:]:____'",
+ "____]]]____:____]]]____]",
+ "____!#!____:____!#!____]",
+ "____]]]____:____]]]____]",
+@@ -82,7 +83,8 @@
+ " 4 ]]]]]]]]]]]]]]]]"
+ ],
+ "palettes": [ "road" ],
+- "terrain": { "P": "t_sidewalk", "4": "t_gutter_downspout" },
++ "terrain": { "'": "t_sidewalk", "P": "t_sidewalk", "4": "t_gutter_downspout" },
++ "furniture": { "'": "f_street_light" },
+ "signs": { "P": { "signage": "Wide selection of storage batteries! Discounts!" } },
+ "items": { "l": { "item": "cleaning", "chance": 70 }, "&": { "item": "trash_cart", "chance": 50 } },
+ "place_loot": [
+@@ -161,7 +163,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "________________________",
++ "_______________________'",
+ "________________________",
+ "________________________",
+ "________________________",
+@@ -202,10 +204,12 @@
+ "O": "t_dirt",
+ "[": "t_fence_v",
+ "_": "t_pavement",
++ "'": "t_pavement",
+ "~": "t_fence_h",
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "6": "f_table",
+ "9": "f_rack",
+ ":": "f_dresser",
+diff --git a/data/json/mapgen/s_grocery.json b/data/json/mapgen/s_grocery.json
+index 8fc7ac2924b..458e6612b1a 100644
+--- a/data/json/mapgen/s_grocery.json
++++ b/data/json/mapgen/s_grocery.json
+@@ -6,7 +6,7 @@
+ "weight": 500,
+ "object": {
+ "rows": [
+- "ssssssssssssssssssssssss",
++ "sssssssssssssssssssssss'",
+ "ssWWWWWWWWssssssssssssss",
+ "sswsssssssssssssssssssss",
+ "sswsssssssssssssssssssss",
+@@ -57,12 +57,14 @@
+ "l": "t_linoleum_gray",
+ "r": "t_linoleum_white",
+ "s": "t_sidewalk",
++ "'": "t_sidewalk",
+ "t": "t_linoleum_white",
+ "w": "t_chainfence_v",
+ "4": "t_gutter_downspout",
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "7": "f_bookcase",
+ "C": "f_crate_c",
+@@ -187,7 +189,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- " ",
++ " '",
+ " ",
+ " ---:::---++---:::--- ",
+ " |..................| ",
+@@ -214,6 +216,7 @@
+ ],
+ "terrain": {
+ " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "+": "t_door_c",
+ "-": "t_wall_w",
+ ".": "t_floor",
+@@ -221,7 +224,15 @@
+ "4": "t_gutter_downspout",
+ "|": "t_wall_w"
+ },
+- "furniture": { "#": "f_counter", "&": "f_glass_fridge", "{": "f_rack", "b": "f_stool", "S": "f_sink", "L": "f_locker" },
++ "furniture": {
++ "'": "f_street_light",
++ "#": "f_counter",
++ "&": "f_glass_fridge",
++ "{": "f_rack",
++ "b": "f_stool",
++ "S": "f_sink",
++ "L": "f_locker"
++ },
+ "toilets": { "T": { } },
+ "place_items": [
+ { "item": "fridgesnacks", "x": 3, "y": [ 10, 15 ], "chance": 80, "repeat": [ 1, 12 ] },
+diff --git a/data/json/mapgen/s_gun.json b/data/json/mapgen/s_gun.json
+index b25e265ffb2..b1efabd10ec 100644
+--- a/data/json/mapgen/s_gun.json
++++ b/data/json/mapgen/s_gun.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- " ____________________ ",
++ " ____________________ '",
+ " *___*___*______*___* ",
+ " *___*___*______*___* ",
+ " *___*___*______*___* ",
+@@ -38,6 +38,7 @@
+ ],
+ "terrain": {
+ " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "*": "t_pavement_y",
+ "+": "t_door_metal_pickable",
+ "-": "t_wall_w",
+@@ -57,6 +58,7 @@
+ },
+ "toilets": { "&": { } },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "H": "f_counter",
+ "S": "f_stool",
+@@ -202,7 +204,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "_ssssssssssssssssssssss_",
++ "_ssssssssssssssssssssss'",
+ "_s@@@@@@@_ssss_@@@@@@@s_",
+ "_s||555||_ssss_||555||s_",
+ "_s|#####5_ssss_5#####|s_",
+@@ -239,6 +241,7 @@
+ "D": "t_door_c",
+ "L": "t_door_metal_locked",
+ "_": "t_pavement",
++ "'": "t_pavement",
+ "s": "t_sidewalk",
+ "|": "t_wall_w",
+ "?": "t_console_broken",
+@@ -246,6 +249,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "a": "f_stool",
+ "E": "f_desk",
+@@ -346,7 +350,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "_ssssssssssssssssssssss_",
++ "_ssssssssssssssssssssss'",
+ "_s@@xx@@@_ssss_@@@@@@@s_",
+ "_s||5l5||_ssss_||555||s_",
+ "_s|#lll#5_ssss_5#####|s_",
+@@ -383,6 +387,7 @@
+ "D": "t_door_o",
+ "L": "t_door_metal_locked",
+ "_": "t_pavement",
++ "'": "t_pavement",
+ "p": "t_door_metal_o",
+ "s": "t_sidewalk",
+ "|": "t_wall_w",
+@@ -391,6 +396,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "E": "f_desk",
+ "S": "f_sink",
+@@ -449,7 +455,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "....d...d....dss..dd.d..",
++ "....d...d....dss..dd.d.'",
+ ".......d......ss........",
+ "d.............ssd.d.....",
+ "..d....d..d.dssss......d",
+@@ -479,6 +485,7 @@
+ "+": "t_door_metal_pickable",
+ "-": "t_brick_wall",
+ ".": "t_grass",
++ "'": "t_dirt",
+ "S": "t_grass",
+ "T": "t_dirt",
+ "W": "t_wall_w",
+@@ -498,6 +505,7 @@
+ "toilets": { ";": { } },
+ "place_item": [ { "item": "corpse", "repeat": 1, "x": 19, "y": 12 } ],
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_sandbag_wall",
+ "&": "f_trashcan",
+ "C": "f_chair",
+diff --git a/data/json/mapgen/s_hardware.json b/data/json/mapgen/s_hardware.json
+index b0c7b87b010..6ad00420a5b 100644
+--- a/data/json/mapgen/s_hardware.json
++++ b/data/json/mapgen/s_hardware.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "________________________",
++ "_______________________'",
+ "________________________",
+ "~~~~~~~~~~~_____________",
+ "~~~~~~~~~~~_____________",
+@@ -41,12 +41,14 @@
+ ";": "t_door_locked",
+ "O": "t_window",
+ "_": "t_pavement",
++ "'": "t_pavement",
+ "U": "t_pavement",
+ "|": "t_wall_w",
+ "~": "t_sidewalk",
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "@": "f_locker",
+ "[": "f_bookcase",
+@@ -132,7 +134,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "ppppp~~~~~~~~~~~~~~~~~~~",
++ "ppppp~~~~~~~~~~~~~~~~~~`",
+ "ppppp###---##++##---###~",
+ "ppppp#b.........v....P#'",
+ "ppppp#b.b.b.r..r.o.o.P#'",
+@@ -179,6 +181,7 @@
+ "w": "t_chainfence_v",
+ "|": "t_chaingate_c",
+ "~": "t_sidewalk",
++ "`": "t_sidewalk",
+ "4": "t_gutter_downspout"
+ },
+ "sealed_item": {
+@@ -188,6 +191,7 @@
+ "M": { "item": { "item": "seed_flower" }, "furniture": "f_planter_harvest" }
+ },
+ "furniture": {
++ "`": "f_street_light",
+ "D": "f_dumpster",
+ "H": "f_warehouse_shelf",
+ "P": "f_rack",
+@@ -282,7 +286,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "~~~~~~~~~~~~~~~~~~~~~~~~",
++ "~~~~~~~~~~~~~~~~~~~~~~~'",
+ "*W^^^WW|-=--:---:---:-|*",
+ "*w~~~%~|..............|*",
+ "*w~~~v~|..............|*",
+@@ -322,9 +326,11 @@
+ "w": "t_chainfence_v",
+ "|": "t_wall_w",
+ "~": "t_sidewalk",
++ "'": "t_sidewalk",
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "]": "f_rack",
+ "l": "f_stool",
+@@ -416,7 +422,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "~~~~~~~~~~~~~~~~~~~~~~~~",
++ "~~~~~~~~~~~~~~~~~~~~~~~'",
+ "~~~WWWWWWWWW^^WWWWWWW~~~",
+ "***w~~~~~~~~~~~~~~~~w***",
+ "***w~~~~~~~~~~~~~~~~w***",
+@@ -453,10 +459,12 @@
+ "w": "t_chainfence_v",
+ "|": "t_wall_w",
+ "~": "t_sidewalk",
++ "'": "t_sidewalk",
+ "4": "t_gutter_downspout"
+ },
+ "toilets": { "&": { } },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "[": "f_table",
+ "]": "f_rack",
+diff --git a/data/json/mapgen/s_icecream.json b/data/json/mapgen/s_icecream.json
+index d080aec2899..54be44ee64a 100644
+--- a/data/json/mapgen/s_icecream.json
++++ b/data/json/mapgen/s_icecream.json
+@@ -6,7 +6,7 @@
+ "weight": 100,
+ "object": {
+ "rows": [
+- ".............d__d.......",
++ ".............d__d......`",
+ ".............d__d.......",
+ "...D...b.....d__d.......",
+ "..bab.DaD...d____d......",
+@@ -38,6 +38,7 @@
+ "+": "t_door_glass_c",
+ "-": "t_wall_y",
+ ".": "t_grass",
++ "`": "t_dirt",
+ "C": "t_sidewalk",
+ "D": "t_dirt",
+ "T": "t_floor",
+@@ -67,6 +68,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "`": "f_street_light",
+ "#": "f_bench",
+ "&": "f_sink",
+ "C": "f_counter",
+diff --git a/data/json/mapgen/s_liquor.json b/data/json/mapgen/s_liquor.json
+index c3b46ee2a13..e7f1086e8c1 100644
+--- a/data/json/mapgen/s_liquor.json
++++ b/data/json/mapgen/s_liquor.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- " ",
++ " '",
+ " ",
+ " --:---------+--:-- ",
+ " |#..#####....cs..| ",
+@@ -34,6 +34,7 @@
+ ],
+ "terrain": {
+ " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "-": "t_wall_g",
+ ".": "t_floor",
+ ":": "t_window",
+@@ -49,6 +50,7 @@
+ "+": "t_door_c"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_rack",
+ "&": "f_glass_fridge",
+ "c": "f_counter",
+diff --git a/data/json/mapgen/school_1.json b/data/json/mapgen/school_1.json
+index f617810dc9a..ef14e1f33bd 100644
+--- a/data/json/mapgen/school_1.json
++++ b/data/json/mapgen/school_1.json
+@@ -11,7 +11,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "ssssssss_______sssssssssssssssssssssssssssssssssssssssssssssssssssssssss",
++ "ssssssss_______ssssssss`sssssssssssssssssssssss`sssssssssssssssssssssss`",
+ "s$;$ $;$_______$;$ $;$ssssssssssssssssssssssssssssssssssssssssssssssssss",
+ "sLLLLLLL_______LLLLLLLss ss ",
+ "s_____________________ss ss $;$$$$$;$$$$$$$$;$$$$$;$ ",
+@@ -433,6 +433,7 @@
+ "_": "t_pavement",
+ "f": "t_chainfence_h",
+ "s": "t_sidewalk",
++ "`": "t_sidewalk",
+ "w": "t_window",
+ "x": "t_console_broken",
+ "|": "t_wall_y",
+@@ -461,6 +462,7 @@
+ "j": "t_sewage_pipe"
+ },
+ "furniture": {
++ "`": "f_street_light",
+ "%": "f_curtain",
+ "@": "f_bed",
+ "#": "f_bench",
+diff --git a/data/json/mapgen/smallscrapyard.json b/data/json/mapgen/smallscrapyard.json
+index d6366f986e3..b7469fd6aca 100644
+--- a/data/json/mapgen/smallscrapyard.json
++++ b/data/json/mapgen/smallscrapyard.json
+@@ -249,6 +249,7 @@
+ "method": "json",
+ "object": {
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_wreckage",
+ "&": "f_toilet",
+ "-": "f_null",
+@@ -284,7 +285,7 @@
+ { "chance": 35, "item": "hardware_plumbing", "x": 16, "y": 8 }
+ ],
+ "rows": [
+- "__._______._.__.____.___",
++ "__._______._.__.____.__'",
+ "_____..._._._.__...____.",
+ "_-------.........------_",
+ "_|^#................^^|_",
+@@ -324,6 +325,7 @@
+ "W": "t_wall_metal",
+ "^": "t_dirt",
+ "_": "t_grass",
++ "'": "t_dirt",
+ "b": "t_dirt",
+ "d": "t_dirt",
+ "f": "t_dirt",
+diff --git a/data/json/mapgen/smoke_lounge.json b/data/json/mapgen/smoke_lounge.json
+index d362e1a7ab3..dcb123ec551 100644
+--- a/data/json/mapgen/smoke_lounge.json
++++ b/data/json/mapgen/smoke_lounge.json
+@@ -30,7 +30,7 @@
+ { "chance": 25, "item": "floor_trash", "x": 14, "y": 6 }
+ ],
+ "rows": [
+- "____d______d__1sss1__d__",
++ "____d______d__1sss1__d_'",
+ "_|||--------|||sss|||||_",
+ "_|M..........{|TTT|^.#|_",
+ "_|M..........{|TTT|.g#|_",
+@@ -62,6 +62,7 @@
+ "D": "t_door_c",
+ "T": "t_thconc_floor",
+ "_": "t_grass",
++ "'": "t_dirt",
+ "a": "t_pavement",
+ "1": "t_dirt",
+ "d": "t_dirt",
+@@ -72,6 +73,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "S": "f_statue",
+ "^": [ "f_indoor_plant_y", "f_indoor_plant" ],
+@@ -176,7 +178,7 @@
+ ],
+ "fill_ter": "t_floor",
+ "rows": [
+- "___d___1sss1____d_______",
++ "___d___1sss1____d______'",
+ "_||---||ttt||||||||||||_",
+ "_|{...^|D-D|cccc.^|RY&|d",
+ "_|{....|..........+...|_",
+@@ -206,6 +208,7 @@
+ "-": "t_wall_glass",
+ "D": "t_door_glass_c",
+ "_": "t_grass",
++ "'": "t_dirt",
+ "d": "t_dirt",
+ "1": "t_dirt",
+ "p": "t_pavement",
+@@ -216,6 +219,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_table",
+ "C": "f_chair",
+ "H": "f_sofa",
+diff --git a/data/json/mapgen/sports_store.json b/data/json/mapgen/sports_store.json
+index 35be3e50755..fc324851d9f 100644
+--- a/data/json/mapgen/sports_store.json
++++ b/data/json/mapgen/sports_store.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- ".`''''`''''`''''`''''`..",
++ ".`''''`''''`''''`''''`.?",
+ ".`''''`''''`''''`''''`..",
+ ".`''''`''''`''''`''''`..",
+ ".`''''`''''`''''`''''`..",
+@@ -34,6 +34,7 @@
+ ],
+ "terrain": {
+ ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "?": "t_dirt",
+ " ": "t_floor",
+ "'": "t_pavement",
+ "`": "t_pavement_y",
+@@ -46,6 +47,7 @@
+ "/": "t_door_curtain_c"
+ },
+ "furniture": {
++ "?": "f_street_light",
+ "#": "f_counter",
+ "h": "f_stool",
+ "t": "f_treadmill",
+diff --git a/data/json/mapgen/station_radio.json b/data/json/mapgen/station_radio.json
+index dda7f03f220..20a79244477 100644
+--- a/data/json/mapgen/station_radio.json
++++ b/data/json/mapgen/station_radio.json
+@@ -8,7 +8,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- " sssssssssssssssssssss ",
++ " sssssssssssssssssssss'",
+ " sssssssFffffffffffffFss",
+ " sssssssF____________Fss",
+ " ss|----|______&&&&__Fss",
+@@ -46,6 +46,7 @@
+ "_": "t_pavement",
+ "&": "t_radio_tower",
+ "s": "t_sidewalk",
++ "'": "t_sidewalk",
+ "x": "t_console_broken",
+ "F": "t_chainfence",
+ "f": "t_chainfence",
+@@ -54,6 +55,7 @@
+ "<": "t_ladder_up"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "o": "f_bookcase",
+ "d": "f_desk",
+ "h": "f_chair",
+@@ -151,7 +153,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "ss ##w###",
++ "ss '##w###",
+ "ss #ffffffff#xxxP#",
+ "sssssssssG________#.h.P#",
+ "ss ######________Dc.hP#",
+@@ -178,6 +180,7 @@
+ ],
+ "terrain": {
+ " ": [ "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "+": "t_door_c",
+ "=": "t_door_locked_alarm",
+ "D": "t_door_locked",
+@@ -199,6 +202,7 @@
+ "<": "t_ladder_up"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "o": "f_bookcase",
+ "d": "f_desk",
+ "h": "f_chair",
+diff --git a/data/json/mapgen/storage_units_large.json b/data/json/mapgen/storage_units_large.json
+index de33a51bbd2..f3465e8bf41 100644
+--- a/data/json/mapgen/storage_units_large.json
++++ b/data/json/mapgen/storage_units_large.json
+@@ -163,7 +163,7 @@
+ "object": {
+ "fill_ter": "t_thconc_floor",
+ "rows": [
+- "6622rrrrrrrrrrrrrrrrr226",
++ "6622rrrrrrrrrrrrrrrrr2'6",
+ "..22yrrryrrryrrryrrry22.",
+ "..22yrrryrrryrrryrrry22.",
+ "..22yrrryrrryrrryrrry22.",
+@@ -195,6 +195,7 @@
+ ".": "t_pavement",
+ "1": "t_window",
+ "2": "t_sidewalk",
++ "'": "t_sidewalk",
+ "U": "t_sidewalk",
+ "3": "t_tree_young",
+ "4": "t_chaingate_l",
+@@ -209,6 +210,7 @@
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "A": "f_rack",
+ "B": "f_toilet",
+ "C": "f_counter",
+diff --git a/data/json/mapgen/storage_units_medium.json b/data/json/mapgen/storage_units_medium.json
+index 75acce80edc..66bc96bb28a 100644
+--- a/data/json/mapgen/storage_units_medium.json
++++ b/data/json/mapgen/storage_units_medium.json
+@@ -163,7 +163,7 @@
+ "object": {
+ "fill_ter": "t_thconc_floor",
+ "rows": [
+- "|------------2rrrrrrrrr2",
++ "|------------2rrrrrrrrr'",
+ "|A MM 7y....2yrrryrrry2",
+ "|A M 7y....2yrrryrrry2",
+ "|A |8....2yrrryrrry2",
+@@ -195,6 +195,7 @@
+ ".": "t_pavement",
+ "1": "t_window",
+ "2": "t_sidewalk",
++ "'": "t_sidewalk",
+ "V": "t_sidewalk",
+ "W": "t_sidewalk",
+ "3": "t_tree_young",
+@@ -210,6 +211,7 @@
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "A": "f_rack",
+ "B": "f_toilet",
+ "C": "f_counter",
+diff --git a/data/json/mapgen/storage_units_small.json b/data/json/mapgen/storage_units_small.json
+index cabceb9c453..60de5508575 100644
+--- a/data/json/mapgen/storage_units_small.json
++++ b/data/json/mapgen/storage_units_small.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_thconc_floor",
+ "rows": [
+- "sssssss..........sssssss",
++ "sssssss..........ssssss'",
+ "sssssss..........sssssss",
+ "sssssss..........sssssss",
+ "sssssss..........sssssss",
+@@ -43,9 +43,11 @@
+ "p": "t_pavement_y",
+ "r": "t_pavement",
+ "s": "t_sidewalk",
++ "'": "t_sidewalk",
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_chair",
+ "R": "f_rubble",
+ "^": "f_rubble",
+diff --git a/data/json/mapgen/teashop.json b/data/json/mapgen/teashop.json
+index 7653f3aabda..204d15c2c39 100644
+--- a/data/json/mapgen/teashop.json
++++ b/data/json/mapgen/teashop.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "...S....................",
++ "...S...................'",
+ ".z.S.z..123123123123123.",
+ "...S....SSSSCTCSSSSSCSz.",
+ ".z.S.z..SCTCSSSSCTCSTSz.",
+@@ -44,6 +44,7 @@
+ ",": "t_floor",
+ "-": "t_wall_w",
+ ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "1": "t_grass",
+ "2": "t_grass",
+ "3": "t_grass",
+@@ -65,6 +66,7 @@
+ "|": "t_wall_w"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "&": "f_dumpster",
+ "1": "f_dandelion",
+@@ -171,7 +173,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- ".....SSS.......T.....T..",
++ ".....SSS.......T.....T.'",
+ ".qqqqSSSqqqqqq|||OOO|||.",
+ ".q...TSS.T..Tz|c,$$$&C|.",
+ ".q.T..SSS@...zOtC,,,,t|T",
+@@ -204,6 +206,7 @@
+ ";": "t_linoleum_gray",
+ ",": "t_floor",
+ ".": [ "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass", "t_dirt" ],
++ "'": "t_dirt",
+ "T": [ "t_tree", "t_tree_young", "t_shrub", "t_grass", "t_grass", "t_dirt" ],
+ "z": "t_shrub",
+ "@": "t_grass",
+@@ -233,6 +236,7 @@
+ "q": "t_fence_v"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "Y": "f_rack_coat",
+ "&": "f_trashcan",
+diff --git a/data/json/mapgen/thrift.json b/data/json/mapgen/thrift.json
+index baf5ae9c74d..67f576866f5 100644
+--- a/data/json/mapgen/thrift.json
++++ b/data/json/mapgen/thrift.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "rrrrrrrrrrrrrrrrrrrrrrrr",
++ "rrrrrrrrrrrrrrrrrrrrrrr'",
+ "yrrryrrryrrryrrryrrryrrr",
+ "yrrryrrryrrryrrryrrryrrr",
+ "yrrryrrryrrryrrryrrryrrr",
+@@ -50,12 +50,14 @@
+ "g": "t_door_glass_c",
+ "o": "t_carpet_purple",
+ "r": "t_pavement",
++ "'": "t_pavement",
+ "y": "t_pavement_y",
+ "|": "t_wall_w",
+ "Z": "t_gutter_downspout",
+ "<": "t_ladder_up"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "A": "f_rack",
+ "C": "f_counter",
+ "D": "f_sink",
+diff --git a/data/json/mapgen/veterinarian.json b/data/json/mapgen/veterinarian.json
+index b0c48efca59..a578e78f501 100644
+--- a/data/json/mapgen/veterinarian.json
++++ b/data/json/mapgen/veterinarian.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- " ",
++ " '",
+ " ",
+ " ",
+ " ",
+@@ -34,6 +34,7 @@
+ ],
+ "terrain": {
+ " ": "t_pavement",
++ "'": "t_pavement",
+ "%": "t_console_broken",
+ "*": "t_shrub",
+ "+": "t_door_c",
+@@ -56,6 +57,7 @@
+ "4": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "#": "f_counter",
+ "$": "f_safe_l",
+ "?": "f_counter",
+diff --git a/data/json/mapgen/vfw.json b/data/json/mapgen/vfw.json
+index ee75edffd1d..8b64b04b341 100644
+--- a/data/json/mapgen/vfw.json
++++ b/data/json/mapgen/vfw.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "rrrrrrrrrrrrr..33.22.33.",
++ "rrrrrrrrrrrrr..33.22.33'",
+ "yrrryrrryrrry.3..2222..3",
+ "yrrryrrryrrry.3.22pp22.3",
+ "yrrryrrryrrry..22pXSp22.",
+@@ -37,6 +37,7 @@
+ "+": "t_door_c",
+ "-": "t_wall_wood",
+ ".": [ [ "t_grass", 5 ], [ "t_grass_long", 2 ], "t_dirt", "t_shrub" ],
++ "'": "t_dirt",
+ "X": "t_grass",
+ "S": "t_grass",
+ "p": "t_grass",
+@@ -53,6 +54,7 @@
+ "5": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "A": "f_rack",
+ "C": "f_counter",
+ "D": "f_sink",
+diff --git a/data/json/mapgen/warehouse.json b/data/json/mapgen/warehouse.json
+index 11afc5094ad..93373ccf10c 100644
+--- a/data/json/mapgen/warehouse.json
++++ b/data/json/mapgen/warehouse.json
+@@ -7,7 +7,7 @@
+ "object": {
+ "fill_ter": "t_thconc_floor",
+ "rows": [
+- "....S.SSSSSSSSSSSS......",
++ "....S.SSSSSSSSSSSS.....'",
+ "zzzzSzSSSSSSSSSSSSzzzzzz",
+ ".---3-MMMMMMMMMMMM-----.",
+ ".|11 6 w111|.",
+@@ -35,7 +35,7 @@
+ "set": [
+ { "point": "terrain", "id": "t_dirt", "x": [ 0, 23 ], "y": 23, "repeat": [ 5, 8 ] },
+ { "point": "terrain", "id": "t_tree_pine", "x": [ 0, 5 ], "y": 0, "repeat": [ 0, 1 ] },
+- { "point": "terrain", "id": "t_tree_pine", "x": [ 18, 23 ], "y": 0, "repeat": [ 0, 1 ] },
++ { "point": "terrain", "id": "t_tree_pine", "x": [ 18, 21 ], "y": 0, "repeat": [ 0, 1 ] },
+ { "point": "terrain", "id": "t_shrub", "x": 0, "y": [ 2, 19 ], "repeat": [ 1, 4 ] },
+ { "point": "terrain", "id": "t_shrub", "x": 23, "y": [ 2, 19 ], "repeat": [ 1, 4 ] },
+ { "point": "terrain", "id": "t_tree_pine", "x": 0, "y": [ 2, 19 ], "repeat": [ 0, 2 ] },
+@@ -45,6 +45,7 @@
+ " ": "t_thconc_floor",
+ "-": "t_brick_wall",
+ ".": "t_grass",
++ "'": "t_dirt",
+ "3": "t_door_locked",
+ "M": "t_door_metal_locked",
+ "O": "t_window",
+@@ -56,6 +57,7 @@
+ "U": "t_gutter_downspout"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "1": [ "f_crate_c", "f_cardboard_box" ],
+ "2": "f_sink",
+ "5": "f_counter",
+diff --git a/data/json/mapgen_palettes/clothes_store_palette.json b/data/json/mapgen_palettes/clothes_store_palette.json
+index 85c11175374..9b2df7292c5 100644
+--- a/data/json/mapgen_palettes/clothes_store_palette.json
++++ b/data/json/mapgen_palettes/clothes_store_palette.json
+@@ -2,8 +2,9 @@
+ {
+ "type": "palette",
+ "id": "clothes_store_palette",
+- "terrain": { "%": "t_console_broken", "p": "t_region_groundcover_urban" },
++ "terrain": { "'": "t_sidewalk", "%": "t_console_broken", "p": "t_region_groundcover_urban" },
+ "furniture": {
++ "'": "f_street_light",
+ "c": "f_counter",
+ "C": "f_armchair",
+ "s": "f_stool",
+@@ -59,6 +60,7 @@
+ "type": "palette",
+ "id": "tailor_palette",
+ "terrain": {
++ "'": "t_sidewalk",
+ "%": "t_console_broken",
+ ";": "t_door_locked",
+ "0": "t_window_alarm",
+@@ -66,6 +68,7 @@
+ "p": "t_region_groundcover_urban"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "c": "f_counter",
+ "R": "f_clothing_rail",
+ "s": "f_stool",
+@@ -99,6 +102,7 @@
+ "type": "palette",
+ "id": "furs_palette",
+ "terrain": {
++ "'": "t_sidewalk",
+ "%": "t_console_broken",
+ ";": "t_door_locked",
+ "i": "t_door_locked_interior",
+@@ -107,6 +111,7 @@
+ "p": "t_region_groundcover_urban"
+ },
+ "furniture": {
++ "'": "f_street_light",
+ "c": "f_displaycase",
+ "s": "f_stool",
+ "d": "f_desk",
+diff --git a/data/mods/No_Hope/Mapgen/school_1.json b/data/mods/No_Hope/Mapgen/school_1.json
+index a914d0bd9f6..76aad2fdff5 100644
+--- a/data/mods/No_Hope/Mapgen/school_1.json
++++ b/data/mods/No_Hope/Mapgen/school_1.json
+@@ -11,7 +11,7 @@
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+- "ssssssss_______sssssssssssssssssssssssssssssssssssssssssssssssssssssssss",
++ "ssssssss_______ssssssss`sssssssssssssssssssssss`sssssssssssssssssssssss`",
+ "s$;$ $;$_______$;$ $;$ssssssssssssssssssssssssssssssssssssssssssssssssss",
+ "sLLLLLLL_______LLLLLLLss ss ",
+ "s_____________________ss ss $;$$$$$;$$$$$$$$;$$$$$;$ ",
+@@ -426,6 +426,7 @@
+ "_": "t_pavement",
+ "f": "t_chainfence_h",
+ "s": "t_sidewalk",
++ "`": "t_sidewalk",
+ "w": "t_window",
+ "|": "t_wall_y",
+ "I": "t_column",
+@@ -454,6 +455,7 @@
+ "x": "t_console_broken"
+ },
+ "furniture": {
++ "`": "f_street_light",
+ "%": "f_curtain",
+ "@": "f_bed",
+ "#": "f_bench",
+--
+2.42.0
+
diff --git a/backport-04_feat-content-port-game-store-3469.patch b/backport-04_feat-content-port-game-store-3469.patch
new file mode 100644
index 0000000..ae90ba9
--- /dev/null
+++ b/backport-04_feat-content-port-game-store-3469.patch
@@ -0,0 +1,550 @@
+From 361b8b6452e14ad5c74fad05e1ad093669103ef4 Mon Sep 17 00:00:00 2001
+From: Zlorthishen <79779913+Zlorthishen@users.noreply.github.com>
+Date: Sun, 22 Oct 2023 21:16:10 -0500
+Subject: [PATCH] feat(content, port): game store (#3469)
+
+* Update fluff.json
+
+* Update overmap_terrain_commercial.json
+
+* Update multitile_city_buildings.json
+
+* Update regional_map_settings.json
+
+* Update activities_hobbies.json
+
+* Update mansion.json
+
+* Update mall_item_groups.json
+
+* style(autofix.ci): automated formatting
+
+* Add files via upload
+
+* Update regional_map_settings.json
+
+* Update activities_hobbies.json
+
+* style(autofix.ci): automated formatting
+
+* Update multitile_city_buildings.json
+
+* style(autofix.ci): automated formatting
+
+---------
+
+Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
+---
+ .../Locations_MapExtras/mall_item_groups.json | 12 +-
+ .../Locations_MapExtras/mansion.json | 19 +-
+ data/json/itemgroups/activities_hobbies.json | 26 ++-
+ data/json/items/fluff.json | 176 ++++++++++++++++++
+ data/json/mapgen/s_games.json | 139 ++++++++++++++
+ .../overmap/multitile_city_buildings.json | 6 +
+ .../overmap_terrain_commercial.json | 14 ++
+ data/json/regional_map_settings.json | 1 +
+ 8 files changed, 384 insertions(+), 9 deletions(-)
+ create mode 100644 data/json/mapgen/s_games.json
+
+diff --git a/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json b/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json
+index 0841f79f760..031e545771a 100644
+--- a/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json
++++ b/data/json/itemgroups/Locations_MapExtras/mall_item_groups.json
+@@ -93,19 +93,25 @@
+ [ "portable_game", 60 ],
+ [ "bat", 60 ],
+ [ "backpack", 40 ],
+- [ "pockknife", 20 ],
++ [ "pockknife", 5 ],
+ [ "wristwatch", 20 ],
+ [ "teleumbrella", 5 ],
+ { "group": "kids_books", "prob": 155 },
++ { "group": "games", "prob": 170 },
++ [ "frisbee", 40 ],
++ [ "disc_golf", 40 ],
++ [ "magic_8_ball", 30 ],
+ [ "novel_pulp", 20 ],
+ [ "folding_bicycle", 5 ],
+ [ "sunglasses", 25 ],
+- [ "cowboy_hat", 25 ],
+- [ "mp3", 40 ],
+ [ "wolfsuit", 5 ],
+ [ "dinosuit", 5 ],
+ [ "gum", 10 ],
++ [ "baseball", 40 ],
++ [ "football", 40 ],
++ [ "basketball", 50 ],
+ [ "talking_doll", 50 ],
++ [ "marble", 60 ],
+ [ "creepy_doll", 1 ],
+ [ "jedi_cloak", 5 ],
+ [ "clown_suit", 5 ],
+diff --git a/data/json/itemgroups/Locations_MapExtras/mansion.json b/data/json/itemgroups/Locations_MapExtras/mansion.json
+index bd0b6889844..7a8de7a0074 100644
+--- a/data/json/itemgroups/Locations_MapExtras/mansion.json
++++ b/data/json/itemgroups/Locations_MapExtras/mansion.json
+@@ -712,13 +712,21 @@
+ "magazine": 100,
+ "subtype": "distribution",
+ "items": [
+- [ "bat_nerf", 100 ],
+- [ "marble", 60 ],
++ [ "bat_nerf", 70 ],
++ [ "marble", 50 ],
+ [ "talking_doll", 50 ],
+- [ "fc_hairpin", 50 ],
+- { "group": "kids_books", "prob": 170 },
+- [ "backpack", 40 ],
++ [ "basketball", 30 ],
++ [ "fc_hairpin", 30 ],
++ { "group": "kids_books", "prob": 170, "count": [ 1, 4 ] },
++ { "group": "games", "prob": 170, "count": [ 1, 2 ] },
++ [ "backpack", 20 ],
++ [ "baseball", 30 ],
++ [ "football", 20 ],
++ [ "frisbee", 40 ],
++ [ "disc_golf", 20 ],
++ [ "radio_car_box", 10 ],
+ [ "orangesoda", 30 ],
++ [ "magic_8_ball", 10 ],
+ [ "hairpin", 30 ],
+ [ "purple_drink", 20 ],
+ [ "candy", 20 ],
+@@ -726,6 +734,7 @@
+ [ "rock", 10 ],
+ [ "bat", 10 ],
+ [ "creepy_doll", 3 ],
++ [ "portable_game", 5 ],
+ [ "whistle", 3 ]
+ ]
+ },
+diff --git a/data/json/itemgroups/activities_hobbies.json b/data/json/itemgroups/activities_hobbies.json
+index 57e3c00bda2..a6745c4cc5d 100644
+--- a/data/json/itemgroups/activities_hobbies.json
++++ b/data/json/itemgroups/activities_hobbies.json
+@@ -222,8 +222,8 @@
+ [ "textbook_traps", 8 ],
+ [ "lighter", 60 ],
+ [ "ref_lighter", 10 ],
+- [ "electric_lighter", 10 ],
+ [ "matches", 60 ],
++ [ "electric_lighter", 10 ],
+ [ "sewing_kit", 47 ],
+ [ "tailors_kit", 3 ],
+ [ "thread", 40 ],
+@@ -324,5 +324,29 @@
+ [ "survival_kit", 30 ],
+ [ "premium_survival_kit", 3 ]
+ ]
++ },
++ {
++ "type": "item_group",
++ "id": "games",
++ "items": [
++ [ "chess", 50 ],
++ [ "checkers", 50 ],
++ [ "deck_of_cards", 50 ],
++ [ "cards_magic", 50 ],
++ [ "pictionary", 50 ],
++ [ "monopoly", 50 ],
++ [ "dnd", 50 ],
++ [ "g_warhammer", 50 ],
++ [ "g_warhammer40k", 50 ],
++ [ "catan", 50 ],
++ [ "battleship", 50 ],
++ [ "clue", 50 ],
++ [ "metal_RPG_die", 30 ],
++ [ "RPG_die", 40 ],
++ [ "character_sheet", 20 ],
++ [ "scorecard", 10 ],
++ [ "dnd_handbook", 5 ],
++ [ "portable_game", 5 ]
++ ]
+ }
+ ]
+diff --git a/data/json/items/fluff.json b/data/json/items/fluff.json
+index 1b9438f0d83..b1a6aa3fb1c 100644
+--- a/data/json/items/fluff.json
++++ b/data/json/items/fluff.json
+@@ -59,5 +59,181 @@
+ "material": [ "paper" ],
+ "symbol": "*",
+ "color": "light_gray"
++ },
++ {
++ "id": "chess",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "chess set" },
++ "description": "A wooden box containing all the equipment needed to play a game of chess.",
++ "weight": "907 g",
++ "volume": "2 L",
++ "price": 7500,
++ "price_postapoc": 100,
++ "material": [ "wood" ],
++ "symbol": "?",
++ "color": "brown",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "checkers",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "checkers set" },
++ "description": "A wooden box containing a set of round tokens used to play checkers.",
++ "weight": "788 g",
++ "volume": "1500 ml",
++ "price": 2000,
++ "price_postapoc": 100,
++ "material": [ "wood" ],
++ "symbol": "?",
++ "color": "brown",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "cards_magic",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "deck of Sorcery cards", "str_pl": "decks of Sorcery cards" },
++ "description": "A set of cards meant to play the game \"Sorcery.\" Each card has a fun picture of a different monster.",
++ "weight": "210 g",
++ "volume": "250 ml",
++ "price": 2300,
++ "price_postapoc": 100,
++ "material": [ "paper" ],
++ "symbol": "?",
++ "color": "blue",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "pictionary",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Picturesque", "str_pl": "sets of Picturesque" },
++ "description": "A game where one draws an image, and the others attempt to guess what it is.",
++ "weight": "350 g",
++ "volume": "500 ml",
++ "price": 1500,
++ "price_postapoc": 100,
++ "material": [ "plastic" ],
++ "symbol": "?",
++ "color": "yellow",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "monopoly",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Capitalism", "str_pl": "sets of Capitalism" },
++ "description": "A game where players traverse around the board buying property and swindling their friends.",
++ "weight": "300 g",
++ "volume": "500 ml",
++ "price": 99,
++ "price_postapoc": 100,
++ "material": [ "plastic" ],
++ "symbol": "?",
++ "color": "red",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "dnd",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Blobs and Bandits", "str_pl": "sets of Blobs and Bandits" },
++ "description": "A roleplaying game set in the post-apocalypse, so you can pretend to survive the apocalypse while surviving the apocalypse.",
++ "weight": "680 g",
++ "volume": "1250 ml",
++ "price": 12950,
++ "price_postapoc": 1000,
++ "material": [ "plastic" ],
++ "symbol": "?",
++ "color": "red",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "g_warhammer",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Battlehammer", "str_pl": "sets of Battlehammer" },
++ "description": "A strategy game featuring a set of tiny figurines of fantasy creatures.",
++ "weight": "680 g",
++ "volume": "1250 ml",
++ "price": 10880,
++ "price_postapoc": 5000,
++ "material": [ "plastic" ],
++ "symbol": "?",
++ "color": "yellow",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "g_warhammer40k",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Battlehammer 20k", "str_pl": "sets of Battlehammer 20k" },
++ "description": "A strategy game featuring a set of tiny figurines of grotesque aliens and imperious space marines.",
++ "weight": "680 g",
++ "volume": "1250 ml",
++ "price": 10880,
++ "price_postapoc": 5000,
++ "material": [ "plastic" ],
++ "symbol": "?",
++ "color": "yellow",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "catan",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Settlers of the Ranch", "str_pl": "sets of Settlers of the Ranch" },
++ "description": "A strategy game where players build settlements and trade for supplies.",
++ "weight": "804 g",
++ "volume": "1250 ml",
++ "price": 7050,
++ "price_postapoc": 5000,
++ "material": [ "wood" ],
++ "symbol": "?",
++ "color": "light_blue",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "battleship",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Warships", "str_pl": "sets of Warships" },
++ "description": "A game where players try to guess where the opponent placed their ships on the board.",
++ "weight": "450 g",
++ "volume": "500 ml",
++ "price": 2000,
++ "price_postapoc": 1000,
++ "material": [ "plastic" ],
++ "symbol": "?",
++ "color": "blue",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
++ },
++ {
++ "id": "clue",
++ "type": "GENERIC",
++ "category": "other",
++ "name": { "str": "Murder Mystery", "str_pl": "sets of Murder Mystery" },
++ "description": "A game where players try to figure out who murdered the butler.",
++ "weight": "370 g",
++ "volume": "500 ml",
++ "price": 2480,
++ "price_postapoc": 1000,
++ "material": [ "paper" ],
++ "symbol": "?",
++ "color": "blue",
++ "flags": [ "NO_REPAIR" ],
++ "use_action": "PLAY_GAME"
+ }
+ ]
+diff --git a/data/json/mapgen/s_games.json b/data/json/mapgen/s_games.json
+new file mode 100644
+index 00000000000..18b62a01b36
+--- /dev/null
++++ b/data/json/mapgen/s_games.json
+@@ -0,0 +1,139 @@
++[
++ {
++ "type": "mapgen",
++ "method": "json",
++ "om_terrain": [ "s_games" ],
++ "object": {
++ "fill_ter": "t_carpet_purple",
++ "rows": [
++ "......fg____g____g____gf",
++ "......fg____g____g____gf",
++ "......fg____g____g____gf",
++ "......fg____g____g____gf",
++ "......fg____g____g____gf",
++ "......fg____g____g____gf",
++ "......ffffffffffffffffff",
++ "......9##oooo#cc#oooo##.",
++ ".##o#o## kkkk Ykkkk #.",
++ ".#hhhhh| #.",
++ ".# iiƃ#.",
++ ".# l hh hh i #.",
++ ".# hhh | lkl hh hh i #.",
++ ".# hhh | l j A#.",
++ ".# i #.",
++ ".# hh hkk i #.",
++ ".#hhhhh| Y||c|oo||||#.",
++ ".##o#o###|c||D |;r#.",
++ ".______9#;;;| ll c;q#.",
++ "._______c;;;| lkkl |###.",
++ ".nn_____#;;m| lkkl c;q#.",
++ ".nn_____#mmm|F ll |;r#.",
++ ".nn_____######oooo#####.",
++ "........................"
++ ],
++ "vendingmachines": { "D": { "item_group": "vending_drink" }, "F": { "item_group": "vending_food" } },
++ "terrain": {
++ "|": "t_wall_w",
++ "#": "t_brick_wall",
++ "o": "t_window",
++ "c": "t_door_c",
++ "_": "t_pavement",
++ ".": "t_region_groundcover_urban",
++ "f": "t_sidewalk",
++ "g": "t_pavement_y",
++ "h": "t_carpet_purple",
++ "i": "t_carpet_purple",
++ "j": "t_console_broken",
++ "k": "t_carpet_purple",
++ "l": "t_carpet_purple",
++ "n": "t_pavement",
++ "Y": "t_carpet_purple",
++ ";": "t_linoleum_gray",
++ "q": "t_linoleum_gray",
++ "r": "t_linoleum_gray",
++ "m": "t_linoleum_gray",
++ "s": "t_carpet_purple",
++ "9": "t_gutter_downspout"
++ },
++ "furniture": {
++ "h": "f_rack_wood",
++ "i": "f_counter",
++ "ƃ": "f_counter_gate_c",
++ "k": "f_table",
++ "A": "f_stool",
++ "l": "f_chair",
++ "m": "f_crate_c",
++ "n": "f_dumpster",
++ "Y": "f_trashcan",
++ "r": "f_sink",
++ "s": "f_locker"
++ },
++ "toilets": { "q": { } },
++ "place_vehicles": [
++ { "vehicle": "car", "x": 9, "y": 2, "chance": 35, "rotation": 270 },
++ { "vehicle": "scooter_electric", "x": 5, "y": 20, "chance": 35, "rotation": 270 },
++ { "vehicle": "beetle", "x": 14, "y": 2, "chance": 35, "rotation": 270 },
++ { "vehicle": "electric_car", "x": 19, "y": 2, "chance": 35, "rotation": 270 }
++ ],
++ "place_loot": [
++ { "group": "magazines", "chance": 50, "repeat": 5, "x": [ 2, 6 ], "y": 9 },
++ { "group": "bookstore_misc", "chance": 50, "repeat": 5, "x": [ 3, 5 ], "y": 12 },
++ { "group": "games", "chance": 50, "repeat": 3, "x": [ 3, 5 ], "y": 13 },
++ { "group": "games", "chance": 50, "repeat": 5, "x": [ 2, 6 ], "y": 16 },
++ { "group": "games", "chance": 50, "repeat": 4, "x": [ 13, 14 ], "y": [ 11, 12 ] },
++ { "group": "games", "chance": 50, "repeat": 5, "x": [ 16, 17 ], "y": [ 11, 12 ] },
++ { "group": "games", "chance": 50, "repeat": 4, "x": [ 9, 12 ], "y": 8 },
++ { "group": "games", "chance": 50, "repeat": 4, "x": [ 17, 20 ], "y": 8 },
++ { "group": "games", "chance": 50, "repeat": 5, "x": [ 12, 13 ], "y": 15 },
++ { "group": "games", "chance": 50, "repeat": 5, "x": [ 15, 17 ], "y": 15 },
++ { "group": "trash", "chance": 50, "repeat": 5, "x": 11, "y": 16 },
++ { "group": "trash", "chance": 50, "repeat": 5, "x": 16, "y": 8 },
++ { "group": "games", "chance": 50, "repeat": 3, "x": [ 9, 11 ], "y": 21 },
++ { "group": "games", "chance": 50, "repeat": 4, "x": 11, "y": 20 },
++ { "group": "cleaning_bulk", "chance": 80, "x": 18, "y": 21 },
++ { "group": "vending_food_items", "chance": 80, "repeat": 4, "x": 19, "y": [ 14, 15 ] },
++ { "group": "trash", "chance": 50, "repeat": 5, "x": [ 1, 2 ], "y": [ 20, 22 ] },
++ { "item": "dnd_handbook", "x": 16, "y": 20, "chance": 100 },
++ { "item": "dnd", "x": 15, "y": 20, "chance": 90 },
++ { "item": "character_sheet", "x": [ 15, 16 ], "y": [ 19, 20 ], "chance": 80, "repeat": [ 1, 6 ] },
++ { "item": "metal_RPG_die", "x": 16, "y": 19, "chance": 10 },
++ { "item": "RPG_die", "x": 15, "y": 19, "chance": 90, "repeat": [ 1, 4 ] }
++ ]
++ }
++ },
++ {
++ "type": "mapgen",
++ "method": "json",
++ "om_terrain": [ "s_games_roof" ],
++ "object": {
++ "fill_ter": "t_flat_roof",
++ "rows": [
++ " ",
++ " ",
++ " ",
++ " ",
++ " ",
++ " ",
++ " ",
++ " |222222222222223 ",
++ " |222225..............3 ",
++ " |...............X.:..3 ",
++ " |....................3 ",
++ " |....................3 ",
++ " |...A...........=&...3 ",
++ " |....................3 ",
++ " |....................3 ",
++ " |....................3 ",
++ " |....................3 ",
++ " |-----5|.............3 ",
++ " |.............3 ",
++ " |.............3 ",
++ " |........A....3 ",
++ " |.............3 ",
++ " |-------------3 ",
++ " "
++ ],
++ "palettes": [ "roof_palette" ]
++ }
++ }
++]
+diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json
+index cef6a12b31b..4124a2b0778 100644
+--- a/data/json/overmap/multitile_city_buildings.json
++++ b/data/json/overmap/multitile_city_buildings.json
+@@ -3802,5 +3802,11 @@
+ { "point": [ 0, 0, 0 ], "overmap": "s_laundromat_1_north" },
+ { "point": [ 0, 0, 1 ], "overmap": "s_laundromat_roof_1_north" }
+ ]
++ },
++ {
++ "type": "city_building",
++ "id": "s_games",
++ "locations": [ "land" ],
++ "overmaps": [ { "point": [ 0, 0, 0 ], "overmap": "s_games_north" }, { "point": [ 0, 0, 1 ], "overmap": "s_games_roof_north" } ]
+ }
+ ]
+diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json
+index 1b9abe94e1f..5d3488e6b35 100644
+--- a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json
++++ b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json
+@@ -1507,5 +1507,19 @@
+ "urban_14_9"
+ ],
+ "copy-from": "urban_13_3"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "s_games",
++ "name": "gaming store",
++ "copy-from": "generic_city_building",
++ "sym": "g",
++ "color": "cyan"
++ },
++ {
++ "type": "overmap_terrain",
++ "id": "s_games_roof",
++ "name": "gaming store roof",
++ "copy-from": "s_games"
+ }
+ ]
+diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json
+index a64a7448dc0..b69100f0cc9 100644
+--- a/data/json/regional_map_settings.json
++++ b/data/json/regional_map_settings.json
+@@ -928,6 +928,7 @@
+ "shopping_plaza": 125,
+ "movie_theater": 75,
+ "garage_gas_city": 250,
++ "s_games": 80,
+ "2fmotel_city": 50,
+ "cs_car_dealership": 100,
+ "cs_car_showroom": 100,
+--
+2.42.0
+
diff --git a/backport-04_fix-farm-mapgen-3715.patch b/backport-05_fix-farm-mapgen-3715.patch
index c737051..c737051 100644
--- a/backport-04_fix-farm-mapgen-3715.patch
+++ b/backport-05_fix-farm-mapgen-3715.patch
diff --git a/backport-06_fix-campground-mapgen-3702.patch b/backport-06_fix-campground-mapgen-3702.patch
new file mode 100644
index 0000000..0dd5977
--- /dev/null
+++ b/backport-06_fix-campground-mapgen-3702.patch
@@ -0,0 +1,186 @@
+From 0f8ea67a352735ca1b12525b87b8d37b7fe0d284 Mon Sep 17 00:00:00 2001
+From: 0Monet <146018959+0Monet@users.noreply.github.com>
+Date: Fri, 17 Nov 2023 19:36:11 +0100
+Subject: [PATCH] fix: campground mapgen (#3702)
+
+* fix_campground
+
+* fix_waterless_toilets
+
+* style(autofix.ci): automated formatting
+
+---------
+
+Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
+---
+ data/json/mapgen/campground.json | 124 ++++++++++------------
+ data/json/mapgen_palettes/campground.json | 4 +-
+ 2 files changed, 60 insertions(+), 68 deletions(-)
+
+diff --git a/data/json/mapgen/campground.json b/data/json/mapgen/campground.json
+index 0bd8910b1c4..b4e8ff694f3 100644
+--- a/data/json/mapgen/campground.json
++++ b/data/json/mapgen/campground.json
+@@ -1,68 +1,10 @@
+ [
+ {
++ "type": "mapgen",
+ "method": "json",
++ "om_terrain": [ [ "campground_1a", "campground_1b" ], [ "campground_2a", "campground_2b" ] ],
++ "weight": 100,
+ "object": {
+- "items": {
+- ";": [
+- { "item": "dresser", "chance": 5, "repeat": [ 1, 2 ] },
+- { "item": "creepy", "chance": 2 },
+- { "item": "camping", "chance": 5 },
+- { "item": "archery", "chance": 2 }
+- ],
+- ",": [
+- { "item": "dresser", "chance": 5, "repeat": [ 1, 2 ] },
+- { "item": "creepy", "chance": 2 },
+- { "item": "camping", "chance": 5 },
+- { "item": "archery", "chance": 2 }
+- ],
+- "t": [
+- { "item": "barbecue", "chance": 5, "repeat": [ 1, 2 ] },
+- { "item": "misc_smoking", "chance": 2 },
+- { "item": "cannedfood", "chance": 2, "repeat": [ 1, 2 ] }
+- ]
+- },
+- "place_monsters": [
+- { "chance": 50, "density": 1, "monster": "CAMPERS", "x": [ 8, 18 ], "y": [ 7, 22 ] },
+- { "monster": "GROUP_PARK_ANIMAL", "x": [ 2, 17 ], "y": [ 2, 15 ], "repeat": [ 0, 2 ] },
+- { "chance": 50, "density": 1, "monster": "CAMPERS", "x": [ 3, 17 ], "y": [ 32, 46 ] },
+- { "monster": "GROUP_PARK_ANIMAL", "x": [ 2, 17 ], "y": [ 31, 46 ], "repeat": [ 0, 2 ] },
+- { "monster": "GROUP_PARK_ANIMAL", "x": [ 30, 46 ], "y": [ 31, 46 ], "repeat": [ 0, 2 ] }
+- ],
+- "place_vehicles": [
+- { "chance": 25, "fuel": 15, "rotation": 270, "status": -1, "vehicle": "campground_vehicles", "x": 16, "y": 2 },
+- { "chance": 25, "fuel": -1, "rotation": 180, "status": -1, "vehicle": "campground_vehicles", "x": 5, "y": 19 },
+- { "chance": 50, "fuel": 20, "rotation": 0, "status": -1, "vehicle": "lux_rv", "x": 43, "y": 18 },
+- {
+- "chance": 25,
+- "fuel": 15,
+- "rotation": 180,
+- "status": -1,
+- "vehicle": "campground_vehicles",
+- "x": 26,
+- "y": 14
+- },
+- {
+- "chance": 25,
+- "fuel": 15,
+- "rotation": 360,
+- "status": -1,
+- "vehicle": "campground_vehicles",
+- "x": 18,
+- "y": 32
+- },
+- { "chance": 25, "fuel": -1, "rotation": 0, "status": -1, "vehicle": "campground_vehicles", "x": 7, "y": 34 },
+- {
+- "chance": 25,
+- "fuel": -1,
+- "rotation": 270,
+- "status": -1,
+- "vehicle": "campground_vehicles",
+- "x": 17,
+- "y": 40
+- },
+- { "chance": 10, "fuel": -1, "rotation": 0, "status": -1, "vehicle": "rv", "x": 42, "y": 27 },
+- { "chance": 25, "fuel": 15, "rotation": 90, "status": -1, "vehicle": "campground_vehicles", "x": 35, "y": 43 }
+- ],
+ "rows": [
+ "_____________________ssssss_ss_......sssssssss__",
+ "_______sssssssssssssssbbbbs__ss......|ww||||||||",
+@@ -113,11 +55,61 @@
+ "______________sssssss#####sssssssss____ssssss___",
+ "____________________ssssss______________________"
+ ],
+- "palettes": [ "campground_palette" ]
+- },
+- "om_terrain": [ [ "campground_1a", "campground_1b" ], [ "campground_2a", "campground_2b" ] ],
+- "type": "mapgen",
+- "weight": 100
++ "palettes": [ "campground_palette" ],
++ "items": {
++ ";": [
++ { "item": "dresser", "chance": 5, "repeat": [ 1, 2 ] },
++ { "item": "creepy", "chance": 2 },
++ { "item": "camping", "chance": 5 },
++ { "item": "archery", "chance": 2 }
++ ],
++ ",": [
++ { "item": "dresser", "chance": 5, "repeat": [ 1, 2 ] },
++ { "item": "creepy", "chance": 2 },
++ { "item": "camping", "chance": 5 },
++ { "item": "archery", "chance": 2 }
++ ],
++ "t": [
++ { "item": "barbecue", "chance": 5, "repeat": [ 1, 2 ] },
++ { "item": "misc_smoking", "chance": 2 },
++ { "item": "cannedfood", "chance": 2, "repeat": [ 1, 2 ] }
++ ]
++ },
++ "place_monsters": [
++ { "chance": 50, "density": 1, "monster": "CAMPERS", "x": [ 8, 18 ], "y": [ 7, 22 ] },
++ { "monster": "GROUP_PARK_ANIMAL", "x": [ 2, 17 ], "y": [ 2, 15 ], "repeat": [ 0, 2 ] },
++ { "chance": 50, "density": 1, "monster": "CAMPERS", "x": [ 3, 17 ], "y": [ 32, 46 ] },
++ { "monster": "GROUP_PARK_ANIMAL", "x": [ 2, 17 ], "y": [ 31, 46 ], "repeat": [ 0, 2 ] },
++ { "monster": "GROUP_PARK_ANIMAL", "x": [ 30, 46 ], "y": [ 31, 46 ], "repeat": [ 0, 2 ] }
++ ],
++ "place_vehicles": [
++ { "chance": 25, "fuel": 15, "rotation": 270, "status": -1, "vehicle": "campground_vehicles", "x": 16, "y": 5 },
++ { "chance": 25, "fuel": -1, "rotation": 180, "status": -1, "vehicle": "campground_vehicles", "x": 5, "y": 19 },
++ { "chance": 50, "fuel": 20, "rotation": 0, "status": -1, "vehicle": "lux_rv", "x": 42, "y": 18 },
++ {
++ "chance": 25,
++ "fuel": 15,
++ "rotation": 180,
++ "status": -1,
++ "vehicle": "campground_vehicles",
++ "x": 26,
++ "y": 14
++ },
++ { "chance": 25, "fuel": 15, "rotation": 90, "status": -1, "vehicle": "campground_vehicles", "x": 22, "y": 31 },
++ { "chance": 25, "fuel": -1, "rotation": 0, "status": -1, "vehicle": "campground_vehicles", "x": 7, "y": 34 },
++ {
++ "chance": 25,
++ "fuel": -1,
++ "rotation": 270,
++ "status": -1,
++ "vehicle": "campground_vehicles",
++ "x": 17,
++ "y": 41
++ },
++ { "chance": 10, "fuel": -1, "rotation": 0, "status": -1, "vehicle": "rv", "x": 42, "y": 27 },
++ { "chance": 25, "fuel": 15, "rotation": 90, "status": -1, "vehicle": "campground_vehicles", "x": 34, "y": 41 }
++ ]
++ }
+ },
+ {
+ "method": "json",
+diff --git a/data/json/mapgen_palettes/campground.json b/data/json/mapgen_palettes/campground.json
+index c14a2f34e06..3d659fb5018 100644
+--- a/data/json/mapgen_palettes/campground.json
++++ b/data/json/mapgen_palettes/campground.json
+@@ -32,7 +32,6 @@
+ "h": "f_chair",
+ "H": "f_camp_chair",
+ "#": "f_large_canvas_wall",
+- "&": "f_toilet",
+ ";": "f_large_groundsheet",
+ ",": "f_center_groundsheet",
+ "B": "f_brazier",
+@@ -42,6 +41,7 @@
+ "t": "f_table",
+ "n": "f_tourist_table",
+ "o": "f_firering"
+- }
++ },
++ "toilets": { "&": { } }
+ }
+ ]
+--
+2.42.0
+
diff --git a/backport-07_feat-interface-new-UDP-external-tileset-sprite-for-s.patch b/backport-07_feat-interface-new-UDP-external-tileset-sprite-for-s.patch
new file mode 100644
index 0000000..f923ac4
--- /dev/null
+++ b/backport-07_feat-interface-new-UDP-external-tileset-sprite-for-s.patch
@@ -0,0 +1,64 @@
+From fac99a00b26d617ca185d2546dd97f26a8e693b8 Mon Sep 17 00:00:00 2001
+From: Chaosvolt <chaosvolt@users.noreply.github.com>
+Date: Tue, 14 Nov 2023 12:56:15 -0600
+Subject: [PATCH] feat (interface): new UDP external tileset sprite for signs
+ (#3670)
+
+* feat (interface): new UPD external tileset sprite for signs
+
+* Update external_tileset.md
+---
+ .../External_Tileset_DP_Normal.json | 3 ++-
+ .../External_Tileset_DP_Normal.png | Bin 33382 -> 42296 bytes
+ .../reference/graphics/external_tileset.md | 8 +++++++-
+ 3 files changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/data/json/external_tileset/External_Tileset_DP_Normal.json b/data/json/external_tileset/External_Tileset_DP_Normal.json
+index d25b8d76ac5..b799eceadbf 100644
+--- a/data/json/external_tileset/External_Tileset_DP_Normal.json
++++ b/data/json/external_tileset/External_Tileset_DP_Normal.json
+@@ -55,5 +55,6 @@
+ { "id": "armguard_bronze", "fg": 44 },
+- { "id": "overlay_worn_armguard_bronze", "fg": 45 }
++ { "id": "overlay_worn_armguard_bronze", "fg": 45 },
++ { "id": "f_sign", "fg": 47 }
+ ],
+ "sprite_width": 32,
+ "sprite_height": 32
+diff --git a/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md b/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md
+index 0f11c64a3a8..68adcf2625b 100644
+--- a/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md
++++ b/doc/src/content/docs/en/mod/json/reference/graphics/external_tileset.md
+@@ -35,6 +35,8 @@ Links to relevant pull requests, for content covered below:
+ [#3221](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3221)
+ - Rewired street lights: [#3273](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3273)
+ - Alternative ear/tail mutation: [#3340](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3340)
++- New trees: [#3626](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3626)
++- Alternative sign sprite: [#3670](https://github.com/cataclysmbnteam/Cataclysm-BN/pull/3670)
+
+ ## Undead People
+
+@@ -72,8 +74,9 @@ Ultica are planned for the future.
+ - Buckler, including worn and wielded. Item specific to BN.
+ - Battle masks, iron and bronze, including worn sprites. Items specific to BN.
+ - Bronze arm guards, including worn sprites. Item specific to BN.
++- Cacao pods. Item specific to BN.
+
+-### External_Tileset_DP_Large.png
++### External_Tileset_DP_Tall.png
+
+ - Off state for utility light. Ability to switch on and off specific to BN.
+ - Alien nerve cluster, furniture added to mi-go locations in BN.
+@@ -82,6 +85,9 @@ Ultica are planned for the future.
+ - Cherry tree uses summer sprite (plus cherry blossom coloration), summer sprite depicted without
+ berries, due to harvest season being moved in BN.
+ - Rewired street light, including active state. Furniture specific to BN.
++- Cocoa tree. Terrain specific to BN.
++- Cocoa plant. Terrain specific to BN.
++- Override for sign sprite. Removes lettering on the front specific to DDA.
+
+ ### alternative_mutation_tileset.png
+
+--
+2.42.0
+
diff --git a/backport-08_feat-Convert-non-pistol-only-energy-weapon-mods-to-b.patch b/backport-08_feat-Convert-non-pistol-only-energy-weapon-mods-to-b.patch
new file mode 100644
index 0000000..2d9da9e
--- /dev/null
+++ b/backport-08_feat-Convert-non-pistol-only-energy-weapon-mods-to-b.patch
@@ -0,0 +1,56 @@
+From 7d7dfe329b14390b4f45b42e8de701d993926641 Mon Sep 17 00:00:00 2001
+From: KheirFerrum <102964889+KheirFerrum@users.noreply.github.com>
+Date: Thu, 16 Nov 2023 02:47:48 +0000
+Subject: [PATCH] feat: Convert non-pistol only energy weapon mods to be
+ compatible with all energy weapons. (#3688)
+
+Convert non-pistol only energy weapon mods
+
+Now works with all energy weapons
+---
+ data/json/items/gunmod/laser_gunmods.json | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/data/json/items/gunmod/laser_gunmods.json b/data/json/items/gunmod/laser_gunmods.json
+index 4d3bde9ff24..82ddd880c05 100644
+--- a/data/json/items/gunmod/laser_gunmods.json
++++ b/data/json/items/gunmod/laser_gunmods.json
+@@ -12,7 +12,7 @@
+ "symbol": ":",
+ "color": "light_gray",
+ "location": "lens",
+- "mod_target_category": [ [ "ENERGY_WEAPONS", "PISTOLS" ], [ "ENERGY_WEAPONS", "RIFLES" ] ],
++ "mod_target_category": [ [ "ENERGY_WEAPONS" ] ],
+ "range_modifier": -25,
+ "damage_modifier": { "damage_type": "heat", "amount": 10 },
+ "ammo_effects": [ "SHOT" ]
+@@ -30,7 +30,7 @@
+ "symbol": ":",
+ "color": "light_gray",
+ "location": "lens",
+- "mod_target_category": [ [ "ENERGY_WEAPONS", "PISTOLS" ], [ "ENERGY_WEAPONS", "RIFLES" ] ],
++ "mod_target_category": [ [ "ENERGY_WEAPONS" ] ],
+ "range_modifier": 15,
+ "damage_modifier": { "damage_type": "heat", "amount": 5 },
+ "dispersion_modifier": 15
+@@ -68,7 +68,7 @@
+ "symbol": ":",
+ "color": "light_gray",
+ "location": "emitter",
+- "mod_target_category": [ [ "ENERGY_WEAPONS", "PISTOLS" ], [ "ENERGY_WEAPONS", "RIFLES" ] ],
++ "mod_target_category": [ [ "ENERGY_WEAPONS" ] ],
+ "ups_charges_multiplier": 0.9
+ },
+ {
+@@ -85,7 +85,7 @@
+ "symbol": ":",
+ "color": "light_gray",
+ "location": "emitter",
+- "mod_target_category": [ [ "ENERGY_WEAPONS", "PISTOLS" ], [ "ENERGY_WEAPONS", "RIFLES" ] ],
++ "mod_target_category": [ [ "ENERGY_WEAPONS" ] ],
+ "range_modifier": 5,
+ "damage_modifier": { "damage_type": "heat", "amount": 10 },
+ "ups_charges_multiplier": 2.0
+--
+2.42.0
+
diff --git a/backport-09_feat-balance-MILITARY_MECH-flag-affects-ID-card-need.patch b/backport-09_feat-balance-MILITARY_MECH-flag-affects-ID-card-need.patch
new file mode 100644
index 0000000..e08411b
--- /dev/null
+++ b/backport-09_feat-balance-MILITARY_MECH-flag-affects-ID-card-need.patch
@@ -0,0 +1,77 @@
+From f73f0d1a09f44aee8c8be75d12fed308ba779997 Mon Sep 17 00:00:00 2001
+From: Chaosvolt <chaosvolt@users.noreply.github.com>
+Date: Fri, 17 Nov 2023 07:09:19 -0600
+Subject: [PATCH] feat(balance): MILITARY_MECH flag affects ID card needed, fix
+ duplicate message (#3697)
+
+* feat(balance): MILITARY_MECH flag affects ID card needed, fix duplicate message
+
+* Fix the thing
+---
+ data/json/monsters/mechsuits.json | 1 -
+ src/character.cpp | 1 -
+ src/monexamine.cpp | 8 +++++---
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/data/json/monsters/mechsuits.json b/data/json/monsters/mechsuits.json
+index 3bdc8f061a4..3f169a5c668 100644
+--- a/data/json/monsters/mechsuits.json
++++ b/data/json/monsters/mechsuits.json
+@@ -134,7 +134,6 @@
+ "flags": [
+ "SEES",
+ "HEARS",
+- "MILITARY_MECH",
+ "BASHES",
+ "PUSH_VEH",
+ "PUSH_MON",
+diff --git a/src/character.cpp b/src/character.cpp
+index c5b903133ac..6d8d9335c9c 100644
+--- a/src/character.cpp
++++ b/src/character.cpp
+@@ -1364,7 +1364,6 @@ void Character::mount_creature( monster &z )
+ }
+ add_msg_if_player( m_good, _( "You hear your %s whir to life." ), z.get_name() );
+ }
+- add_msg_if_player( m_good, _( "You hear your %s whir to life." ), z.get_name() );
+ }
+ // some rideable mechs have night-vision
+ recalc_sight_limits();
+diff --git a/src/monexamine.cpp b/src/monexamine.cpp
+index 2dc423d10b1..4be13ab25aa 100644
+--- a/src/monexamine.cpp
++++ b/src/monexamine.cpp
+@@ -58,6 +58,7 @@ static const efftype_id effect_led_by_leash( "led_by_leash" );
+ static const efftype_id effect_tied( "tied" );
+
+ static const itype_id itype_cash_card( "cash_card" );
++static const itype_id itype_id_industrial( "id_industrial" );
+ static const itype_id itype_id_military( "id_military" );
+
+ static const skill_id skill_survival( "survival" );
+@@ -430,10 +431,10 @@ void monexamine::insert_battery( monster &z )
+
+ bool monexamine::mech_hack( monster &z )
+ {
+- itype_id card_type = itype_id_military;
++ itype_id card_type = ( z.has_flag( MF_MILITARY_MECH ) ? itype_id_military : itype_id_industrial );
+ avatar &you = get_avatar();
+ if( you.has_amount( card_type, 1 ) ) {
+- if( query_yn( _( "Swipe your ID card into the mech's security port?" ) ) ) {
++ if( query_yn( _( "Swipe your %s into the mech's security port?" ), item::nname( card_type ) ) ) {
+ you.mod_moves( -100 );
+ z.add_effect( effect_pet, 1_turns, num_bp );
+ z.friendly = -1;
+@@ -443,7 +444,8 @@ bool monexamine::mech_hack( monster &z )
+ return true;
+ }
+ } else {
+- add_msg( m_info, _( "You do not have the required ID card to activate this mech." ) );
++ add_msg( m_info, _( "You do not have the required %s to activate this mech." ),
++ item::nname( card_type ) );
+ }
+ return false;
+ }
+--
+2.42.0
+
diff --git a/npc-06_lapin-update.patch b/npc-06_lapin-update.patch
index d568b6e..b1938f4 100644
--- a/npc-06_lapin-update.patch
+++ b/npc-06_lapin-update.patch
@@ -17,11 +17,15 @@
{ "text": "Well, bye.", "topic": "TALK_DONE" }
]
},
-@@ -68,10 +69,33 @@
+@@ -68,10 +69,37 @@
"dynamic_line": "People come to me to learn how to keep rabbits. They learn and they go. I like to think I'm making the world better.",
"responses": [
{ "text": "…", "topic": "TALK_WARRENER" },
-+ { "text": "Anyone nearby I should meet?", "topic": "TALK_WARRENER_ISHERWOOD" },
++ {
++ "text": "Anyone nearby I should meet?",
++ "topic": "TALK_WARRENER_ISHERWOOD",
++ "condition": { "u_has_var": "u_met_carlos_isherwood", "type": "general", "context": "meeting", "value": "no" }
++ },
{ "text": "That sounds optimistic?", "topic": "TALK_WARRENER_WORLD_OPTIMISTIC" }
]
},