diff --git a/data/changelog.txt b/data/changelog.txt
index caef8e9c1e332..f3af2ea0ca4aa 100644
--- a/data/changelog.txt
+++ b/data/changelog.txt
@@ -46,6 +46,7 @@ Friendly NPC crafting by crafting menu
Functionality to drop items off ledges/cliffs onto creatures below
NPC fleeing behaviour adjusted and slightly improved
Adds basic vehicle proficiencies for driving and boating, as well as athletic proficiencies which increase muscle engine output.
+Add overheat mechanics to energy guns.
## Content:
@@ -81,6 +82,8 @@ Add a synagogue
Adds a chance for small, personal photographs to spawn within people’s wallets and creates a starting pool of 34 snippets from which to pull.
Adds curved road bends, rotaries and rest stops/laybys
JSONify Defense Mode
+Adds a new mission to the Exodii
+Add boats to river banks
## Interface:
@@ -143,6 +146,7 @@ Add the Mind Over Matter mod to the CDDA repository
[MoM] Add Enervation damage type, apply it to Eater and feral vitakinetics
[Magiclysm] Add more than a dozen spells to magiclysm
[Magiclysm] Add fantasy species starting option
+[Magiclysm] Add two more playable fantasy species for Magiclysm
## Balance:
diff --git a/data/json/construction.json b/data/json/construction.json
index cf9add5257e73..7760154f9f6a2 100644
--- a/data/json/construction.json
+++ b/data/json/construction.json
@@ -7820,11 +7820,11 @@
"time": "60 m",
"qualities": [ [ { "id": "DRILL", "level": 1 } ], [ { "id": "WRENCH_FINE", "level": 1 } ] ],
"components": [
+ [ [ "heavy_punching_bag_sack", 1 ] ],
[ [ "nuts_bolts", 4 ] ],
[ [ "chain", 4 ] ],
[ [ "blanket", 6 ] ],
[ [ "material_sand", 4000 ] ],
- [ [ "bag_plastic", 4 ] ],
[ [ "duct_tape", 20 ] ]
],
"pre_flags": [ "INDOORS" ],
diff --git a/data/json/faults/faults_guns.json b/data/json/faults/faults_guns.json
index fcce3628819df..4c7eb3cf42322 100644
--- a/data/json/faults/faults_guns.json
+++ b/data/json/faults/faults_guns.json
@@ -28,5 +28,32 @@
"type": "fault",
"name": { "str": "Fouling" },
"description": "Fouling is caused by firing gunpowder loads repeatedly, which reduces reliability and can eventually cause damage to the gun. Fouling accumulates slowly (unless blackpowder is used) due to the design of modern smokeless powder found in the vast majority of retail cartridges and it is not a significant problem until high levels of fouling are reached due to firing thousands of rounds without cleaning your firearm."
+ },
+ {
+ "id": "fault_overheat_explosion",
+ "type": "fault",
+ "name": { "str": "Fatal containment failure" },
+ "description": "It got hot."
+ },
+ {
+ "id": "fault_overheat_venting",
+ "type": "fault",
+ "name": { "str": "Emergency venting" },
+ "description": "This weapon can uncontrollably vent coolant when overheated."
+ },
+ {
+ "id": "fault_overheat_melting",
+ "type": "fault",
+ "name": { "str": "Fused internals" },
+ "description": "Excessive heat has rendered this weapon inoperable.",
+ "item_prefix": "ruined",
+ "flags": [ "RUINED_GUN" ]
+ },
+ {
+ "id": "fault_overheat_safety",
+ "type": "fault",
+ "name": { "str": "Overheat safety" },
+ "description": "This weapon will attempt to enter a cooling cycle when overheated.",
+ "flags": [ "JAMMED_GUN" ]
}
]
diff --git a/data/json/flags.json b/data/json/flags.json
index a298ee9ae3174..3e89aff1066d7 100644
--- a/data/json/flags.json
+++ b/data/json/flags.json
@@ -190,6 +190,11 @@
"info": "This gear prevents you from hearing any sounds.",
"conflicts": [ "PARTIAL_DEAF" ]
},
+ {
+ "id": "OVERHEATS",
+ "type": "json_flag",
+ "info": "Continuously firing this weapon will cause it to overheat and can potentially damage it."
+ },
{
"id": "DIAMOND",
"type": "json_flag",
diff --git a/data/json/furniture_and_terrain/furniture-recreation.json b/data/json/furniture_and_terrain/furniture-recreation.json
index ba9d9609dffa0..2d906285bdc09 100644
--- a/data/json/furniture_and_terrain/furniture-recreation.json
+++ b/data/json/furniture_and_terrain/furniture-recreation.json
@@ -397,8 +397,7 @@
{ "item": "nuts_bolts", "charges": 4 },
{ "item": "chain", "count": 4 },
{ "item": "blanket", "count": 6 },
- { "item": "material_sand", "charges": 4000 },
- { "item": "bag_plastic", "count": 4 }
+ { "item": "material_sand", "charges": 4000 }
]
},
"bash": {
diff --git a/data/json/items/appliances.json b/data/json/items/appliances.json
index 247501fdc3072..17c83e8a08941 100644
--- a/data/json/items/appliances.json
+++ b/data/json/items/appliances.json
@@ -389,7 +389,7 @@
"max_contains_volume": "20 L",
"max_item_volume": "32 ml",
"max_contains_weight": "25 kg",
- "ammo_restriction": { "diesel": 100, "gasoline": 100, "jp8": 100, "avgas": 100 }
+ "item_restriction": [ "diesel", "biodiesel", "jp8", "lamp_oil", "motor_oil" ]
}
],
"symbol": "O",
diff --git a/data/json/items/armor/bespoke_armor/custom_storage.json b/data/json/items/armor/bespoke_armor/custom_storage.json
index dbc8e25f2d4b1..d10d6a64207c4 100644
--- a/data/json/items/armor/bespoke_armor/custom_storage.json
+++ b/data/json/items/armor/bespoke_armor/custom_storage.json
@@ -176,8 +176,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle.",
"ripoff": 2
@@ -390,8 +390,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle.",
"ripoff": 2
@@ -402,8 +402,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle.",
"ripoff": 2
diff --git a/data/json/items/armor/hats.json b/data/json/items/armor/hats.json
index eeb7fda5697bd..b8725b3a89274 100644
--- a/data/json/items/armor/hats.json
+++ b/data/json/items/armor/hats.json
@@ -495,6 +495,7 @@
"description": "A hard plastic hat worn at construction and industrial sites. Provides excellent protection from cuts and percussion.",
"weight": "430 g",
"volume": "2500 ml",
+ "longest_side": "28 cm",
"price": 1200,
"price_postapoc": 250,
"material": [ "plastic" ],
@@ -709,6 +710,7 @@
"description": "A hard plastic hat worn at construction and industrial sites, with a cloth tucked under it to serve as a makeshift hood. Makes it a bit more comfortable to wear, and better protects the neck from sun and rain.",
"weight": "470 g",
"volume": "2750 ml",
+ "longest_side": "28 cm",
"price": 1200,
"price_postapoc": 300,
"material": [ "plastic" ],
diff --git a/data/json/items/armor/helmets.json b/data/json/items/armor/helmets.json
index a80106806c74d..7dddec4ac4792 100644
--- a/data/json/items/armor/helmets.json
+++ b/data/json/items/armor/helmets.json
@@ -439,6 +439,7 @@
"description": "A distinctive helmet worn by firefighters. More than just a piece of firefighting equipment, it serves as a badge of honor and respect.",
"weight": "1500 g",
"volume": "1250 ml",
+ "longest_side": "30 cm",
"price": 24000,
"price_postapoc": 500,
"to_hit": 1,
@@ -591,6 +592,7 @@
"description": "A thick foam helmet. Designed to protect against concussion.",
"weight": "400 g",
"volume": "1500 ml",
+ "longest_side": "26 cm",
"price": 17000,
"price_postapoc": 250,
"material": [ "plastic", "plastic_pad" ],
@@ -1071,6 +1073,7 @@
"description": "A helmet that covers the entire head along with glareproof visors, offering the best protection for when you ride around on your motorcycle. Activate to raise the visor.",
"weight": "1587 g",
"volume": "2250 ml",
+ "longest_side": "33 cm",
"price": 32500,
"price_postapoc": 750,
"to_hit": -1,
@@ -1162,6 +1165,7 @@
"description": "A helmet that covers the entire head along with glareproof visors, offering the best protection when you ride around on your motorcycle. The visor is raised. Activate to put down the visor.",
"weight": "1587 g",
"volume": "2250 ml",
+ "longest_side": "33 cm",
"price": 32500,
"price_postapoc": 750,
"to_hit": -1,
@@ -1229,6 +1233,7 @@
"description": "A helmet designed to protect from falls and kicks involving horses, has a small peak to protect from glare",
"weight": "660 g",
"volume": "1800 ml",
+ "longest_side": "28 cm",
"price": 7000,
"price_postapoc": 300,
"techniques": [ "WBLOCK_1" ],
diff --git a/data/json/items/armor/storage.json b/data/json/items/armor/storage.json
index b405febeb7e9f..c01a5803b9502 100644
--- a/data/json/items/armor/storage.json
+++ b/data/json/items/armor/storage.json
@@ -26,8 +26,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle.",
"ripoff": 2
@@ -241,8 +241,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle",
"ripoff": 2
@@ -253,8 +253,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle",
"ripoff": 2
@@ -729,6 +729,7 @@
"description": "Useful for carrying money, documents, or smuggled goods.",
"weight": "1700 g",
"volume": "15750 ml",
+ "longest_side": "46 cm",
"price": 24000,
"price_postapoc": 50,
"to_hit": -2,
@@ -826,8 +827,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle",
"ripoff": 2
@@ -2503,8 +2504,8 @@
"holster": true,
"max_contains_volume": "510 ml",
"max_contains_weight": "1 kg",
- "max_item_length": "12 cm",
- "min_item_length": "7 cm",
+ "max_item_length": "24 cm",
+ "min_item_length": "18 cm",
"moves": 80,
"description": "Small pocket for a water bottle",
"ripoff": 2
diff --git a/data/json/items/containers/containers.json b/data/json/items/containers/containers.json
index bad226d149294..3de3d2c28ffa7 100644
--- a/data/json/items/containers/containers.json
+++ b/data/json/items/containers/containers.json
@@ -447,6 +447,7 @@
"description": "A watertight plastic bottle, holds 500ml of liquid. Some may be factory-sealed to increase shelf life.",
"weight": "13 g",
"volume": "510 ml",
+ "longest_side": "18 cm",
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -478,6 +479,7 @@
"description": "An inverted plastic bottle for condiments. Preserves its contents from rot until opened.",
"weight": "19 g",
"volume": "525 ml",
+ "longest_side": "22 cm",
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -508,6 +510,7 @@
"description": "A watertight plastic bottle, holds 250ml of liquid.",
"weight": "7 g",
"volume": "255 ml",
+ "longest_side": "14 cm",
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -582,6 +585,7 @@
"description": "A two-liter plastic bottle that can hold a lot of soda, or, nowadays, boiled water.",
"weight": "53 g",
"volume": "2040 ml",
+ "longest_side": "31 cm",
"price": 25,
"price_postapoc": 10,
"material": [ "plastic" ],
@@ -1227,6 +1231,7 @@
"ascii_picture": "bucket",
"weight": "725 g",
"volume": "5500 ml",
+ "longest_side": "25 cm",
"price": 300,
"price_postapoc": 10,
"material": [ "steel" ],
@@ -1350,6 +1355,7 @@
"description": "A half-gallon carton constructed of a paper, aluminum, and plastic laminate. It has a threaded cap to keep liquid from leaking out.",
"weight": "28 g",
"volume": "2003 ml",
+ "longest_side": "32 cm",
"price": 0,
"price_postapoc": 0,
"to_hit": 1,
@@ -1405,6 +1411,7 @@
"description": "A cardboard container with 12 individual cavities for storing eggs.",
"weight": "28 g",
"volume": "620 ml",
+ "longest_side": "29 cm",
"price": 0,
"price_postapoc": 0,
"to_hit": 1,
@@ -1459,6 +1466,7 @@
"//": "Represents a 4 cm radius x 5 cm height steel can.",
"weight": "40 g",
"volume": "262 ml",
+ "longest_side": "8 cm",
"price": 0,
"price_postapoc": 0,
"material": [ "steel" ],
@@ -1487,6 +1495,7 @@
"//": "Represents a 4 cm radius x 10 cm height steel can.",
"looks_like": "can_food",
"weight": "70 g",
+ "longest_side": "10 cm",
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1511,6 +1520,7 @@
"description": "A military-style water canteen with a 1.5 liter capacity. Commonly worn at the hip.",
"weight": "155 g",
"volume": "1575 ml",
+ "longest_side": "20 cm",
"price": 800,
"price_postapoc": 50,
"to_hit": 1,
@@ -1549,9 +1559,10 @@
"looks_like": "bottle_plastic",
"description": "A Thermos brand vacuum flask. Built for temperature retention, helps keep things hot or cold. Contains 1L of liquid.",
"weight": "530 g",
+ "volume": "1250 ml",
+ "longest_side": "32 cm",
"price": 1595,
"price_postapoc": 100,
- "volume": "1250 ml",
"material": [ "steel" ],
"symbol": "I",
"color": "green",
@@ -1954,6 +1965,7 @@
"description": "A bulky plastic jerrycan, meant to carry fuel, but can carry other liquids in a pinch.",
"weight": "1587 g",
"volume": "10500 ml",
+ "longest_side": "33 cm",
"price": 1250,
"price_postapoc": 50,
"to_hit": -2,
@@ -2037,6 +2049,7 @@
"description": "A standard plastic jug used for milk and household cleaning chemicals. Some may be factory-sealed to increase shelf life.",
"weight": "190 g",
"volume": "3825 ml",
+ "longest_side": "28 cm",
"price": 0,
"price_postapoc": 10,
"to_hit": 1,
@@ -2298,6 +2311,7 @@
"description": "A waterproof case designed for a standard smartphone. Will protect your smartphone from water damage entirely.",
"weight": "50 g",
"volume": "125 ml",
+ "longest_side": "18 cm",
"price": 1000,
"price_postapoc": 100,
"material": [ "plastic" ],
@@ -2875,6 +2889,7 @@
"pocket_type": "CONTAINER",
"max_contains_volume": "100 ml",
"max_contains_weight": "230 g",
+ "max_item_length": "16 cm",
"moves": 100,
"watertight": true,
"rigid": true,
@@ -4157,6 +4172,7 @@
"description": "A metal paint can, able to hold a gallon of liquid.",
"weight": "400 g",
"volume": "4325 ml",
+ "longest_side": "21 cm",
"price": 10,
"price_postapoc": 3,
"material": [ "steel" ],
@@ -4182,6 +4198,7 @@
"description": "A plastic paint can, able to hold a gallon of liquid.",
"weight": "50 g",
"volume": "4325 ml",
+ "longest_side": "21 cm",
"price": 10,
"price_postapoc": 3,
"material": [ "plastic" ],
diff --git a/data/json/items/generic/bathroom_house.json b/data/json/items/generic/bathroom_house.json
index b04aeca31ca43..c1ac4990c4560 100644
--- a/data/json/items/generic/bathroom_house.json
+++ b/data/json/items/generic/bathroom_house.json
@@ -399,6 +399,7 @@
"looks_like": "bottle_plastic",
"weight": "130 g",
"volume": "502 ml",
+ "longest_side": "18 cm",
"pocket_data": [
{
"pocket_type": "CONTAINER",
diff --git a/data/json/items/generic/dining_kitchen.json b/data/json/items/generic/dining_kitchen.json
index 0ef0879748570..719292f9f934b 100644
--- a/data/json/items/generic/dining_kitchen.json
+++ b/data/json/items/generic/dining_kitchen.json
@@ -417,6 +417,7 @@
"description": "A piece of plastic tupperware with a matching watertight lid. Holds 750 ml of liquid.",
"copy-from": "base_plastic_dish",
"volume": "787 ml",
+ "longest_side": "17 cm",
"pocket_data": [
{
"pocket_type": "CONTAINER",
@@ -1152,6 +1153,7 @@
"color": "light_gray",
"weight": "728 g",
"volume": "1575 ml",
+ "longest_side": "21 cm",
"pocket_data": [ { "max_contains_volume": "1500 ml", "max_contains_weight": "2 kg", "watertight": true, "rigid": true } ],
"delete": { "qualities": [ "COOK" ] },
"melee_damage": { "bash": 5 }
diff --git a/data/json/items/gun/ups.json b/data/json/items/gun/ups.json
index 55330a50b1924..1407b9e669666 100644
--- a/data/json/items/gun/ups.json
+++ b/data/json/items/gun/ups.json
@@ -23,6 +23,9 @@
"modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 3 ] ],
"loudness": 23,
"energy_drain": "60 kJ",
+ "overheat_threshold": 100,
+ "cooling_value": 3,
+ "heat_per_shot": 10,
"reload": 0,
"valid_mod_locations": [
[ "emitter", 1 ],
@@ -35,7 +38,8 @@
[ "underbarrel", 1 ]
],
"ammo_effects": [ "DRAW_LASER_BEAM", "EMP" ],
- "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "USE_UPS" ],
+ "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "USE_UPS", "OVERHEATS" ],
+ "faults": [ "fault_overheat_melting", "fault_overheat_safety" ],
"melee_damage": { "bash": 12 }
},
{
@@ -64,6 +68,10 @@
"modes": [ [ "DEFAULT", "3 rd.", 3 ], [ "BURST", "5 rd.", 5 ], [ "AUTO", "high auto", 15 ] ],
"ammo_effects": [ "LASER", "PLASMA_BUBBLE", "INCENDIARY" ],
"flags": [ "NO_UNLOAD", "NEVER_JAMS", "NO_UNWIELD", "NO_SALVAGE", "NO_REPAIR", "UNBREAKABLE_MELEE", "NON_FOULING", "USE_UPS" ],
+ "overheat_threshold": 200,
+ "cooling_value": 2,
+ "heat_per_shot": 6,
+ "faults": [ "fault_overheat_melting", "fault_overheat_safety" ],
"melee_damage": { "bash": 8 }
},
{
@@ -101,6 +109,10 @@
"NEEDS_NO_LUBE",
"USE_UPS"
],
+ "overheat_threshold": 100,
+ "cooling_value": 2,
+ "heat_per_shot": 17,
+ "faults": [ "fault_overheat_melting", "fault_overheat_safety" ],
"melee_damage": { "bash": 6 }
},
{
@@ -125,6 +137,9 @@
"dispersion": 10,
"durability": 8,
"modes": [ [ "DEFAULT", "semi-auto", 1 ], [ "AUTO", "auto", 4 ] ],
+ "overheat_threshold": 100,
+ "cooling_value": 2,
+ "heat_per_shot": 5,
"loudness": 12,
"energy_drain": "40 kJ",
"reload": 0,
@@ -140,7 +155,8 @@
[ "underbarrel", 1 ]
],
"ammo_effects": [ "LASER", "INCENDIARY" ],
- "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "USE_UPS" ],
+ "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "USE_UPS", "OVERHEATS" ],
+ "faults": [ "fault_overheat_melting", "fault_overheat_safety" ],
"melee_damage": { "bash": 12 }
},
{
@@ -190,9 +206,13 @@
"loudness": 7,
"energy_drain": "10 kJ",
"reload": 200,
+ "overheat_threshold": 60,
+ "cooling_value": 2,
+ "heat_per_shot": 6,
"valid_mod_locations": [ [ "emitter", 1 ], [ "grip", 1 ], [ "lens", 1 ], [ "rail", 1 ], [ "sights", 1 ], [ "stock", 1 ], [ "underbarrel", 1 ] ],
"ammo_effects": [ "LASER", "INCENDIARY" ],
- "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "USE_UPS" ],
+ "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "USE_UPS", "OVERHEATS" ],
+ "faults": [ "fault_overheat_melting", "fault_overheat_safety" ],
"melee_damage": { "bash": 5 }
},
{
diff --git a/data/json/items/ranged/throwing.json b/data/json/items/ranged/throwing.json
index 8f78407ea82b9..a4506e4b9c8ed 100644
--- a/data/json/items/ranged/throwing.json
+++ b/data/json/items/ranged/throwing.json
@@ -78,6 +78,7 @@
"material": [ "plastic", "iron" ],
"volume": "500 ml",
"weight": "175 g",
+ "longest_side": "30 cm",
"to_hit": -1,
"thrown_damage": [ { "damage_type": "stab", "amount": 16 } ],
"melee_damage": { "cut": 8 }
diff --git a/data/json/items/tool/misc.json b/data/json/items/tool/misc.json
index ab2cc5965b3e4..1f6ca873ed4e9 100644
--- a/data/json/items/tool/misc.json
+++ b/data/json/items/tool/misc.json
@@ -618,6 +618,7 @@
"description": "An aerosol spray can filled with paint. Activate it to make graffiti on the floor.",
"weight": "340 g",
"volume": "250 ml",
+ "longest_side": "21 cm",
"price": 500,
"price_postapoc": 10,
"material": [ "aluminum" ],
@@ -635,6 +636,7 @@
"description": "A ten-foot wooden stepladder. Activate it to set it down.",
"weight": "20000 g",
"volume": "50 L",
+ "longest_side": "150 cm",
"price": 2000,
"price_postapoc": 100,
"to_hit": -3,
@@ -769,6 +771,7 @@
"description": "A telescoping umbrella which has been collapsed down for easy storage. May be used to keep dry when extended and wielded.",
"weight": "411 g",
"volume": "1500 ml",
+ "longest_side": "25 cm",
"price": 12000,
"price_postapoc": 100,
"to_hit": -2,
@@ -946,6 +949,7 @@
"looks_like": "stepladder",
"weight": "15750 g",
"volume": "50 L",
+ "longest_side": "150 cm",
"price": 2000,
"price_postapoc": 100,
"to_hit": -3,
diff --git a/data/json/items/tool_armor.json b/data/json/items/tool_armor.json
index ef4bd7566b111..1b0f720895a79 100644
--- a/data/json/items/tool_armor.json
+++ b/data/json/items/tool_armor.json
@@ -387,6 +387,7 @@
"description": "A plastic mask with a very dark visor, meant to protect the entire face while welding. It also serves as somewhat good armor, but makes it hard to see. Activate it to push it up your head.",
"weight": "1 kg",
"volume": "4 L",
+ "longest_side": "34 cm",
"price": 1400,
"price_postapoc": 500,
"to_hit": -3,
@@ -475,6 +476,7 @@
"description": "A plastic mask with a very dark visor, meant to protect the entire face while welding. It also serves as somewhat good armor, but makes it hard to see. Activate it to lower it over your face.",
"weight": "1 kg",
"volume": "4 L",
+ "longest_side": "34 cm",
"price": 1400,
"price_postapoc": 500,
"to_hit": -3,
diff --git a/data/json/mapgen/gas_stations/s_gas.json b/data/json/mapgen/gas_stations/s_gas.json
index 8553e234a1dab..cb05cb5c1644e 100644
--- a/data/json/mapgen/gas_stations/s_gas.json
+++ b/data/json/mapgen/gas_stations/s_gas.json
@@ -50,7 +50,7 @@
{ "liquid": "gasoline", "x": 2, "y": 3, "repeat": [ 200, 1075 ] },
{ "liquid": "diesel", "x": 4, "y": 3, "repeat": [ 200, 1075 ] }
],
- "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 5, 10 ] } ]
+ "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 1, 2 ], "chance": 25 } ]
}
},
{
@@ -191,7 +191,7 @@
"y": [ 15, 16 ]
}
],
- "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 5, 10 ] } ]
+ "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 1, 2 ], "chance": 25 } ]
}
},
{
@@ -291,7 +291,7 @@
{ "item": "softdrugs", "x": [ 8, 8 ], "y": [ 13, 15 ], "chance": 80, "repeat": [ 1, 8 ] }
],
"place_item": [ { "item": "shotgun_s", "x": 3, "y": 20 }, { "item": "shot_00", "x": 7, "y": 19, "chance": 50 } ],
- "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 5, 10 ] } ]
+ "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 1, 2 ], "chance": 25 } ]
}
},
{
@@ -341,7 +341,7 @@
"y": [ 12, 17 ]
}
],
- "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 5, 10 ] } ]
+ "place_monster": [ { "group": "GROUP_ZOMBIE_GAS", "x": [ 5, 10 ], "y": [ 6, 10 ], "repeat": [ 1, 2 ], "chance": 25 } ]
}
}
]
diff --git a/data/json/mapgen/nested/skyscraper_nested.json b/data/json/mapgen/nested/skyscraper_nested.json
new file mode 100644
index 0000000000000..f62d79d24b460
--- /dev/null
+++ b/data/json/mapgen/nested/skyscraper_nested.json
@@ -0,0 +1,3916 @@
+[
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a laundromat on the bottom-right",
+ "nested_mapgen_id": "skyscraper_shopping_0_lr_entrance_store",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ^.X.W.W.W.hhhhAA ",
+ " ....W.W.W.......H ",
+ " ..S.W.W.W..W.rr.H ",
+ " ]CCCW.W.W..W.rr.H ",
+ " ....W.W.W..W.rr. ",
+ " ^ ^..rW.W.W..C.rr.H ",
+ " G...rt.t.t..C.rr.H ",
+ " G................H ",
+ " ^ ^...&DDDDDDDDDDD ",
+ " HHHH HHHH HHHH ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "terrain": { ".": "t_linoleum_gray", "G": "t_door_glass_c", "H": "t_wall_glass" },
+ "set": [ { "square": "terrain", "id": "t_linoleum_gray", "x": 4, "y": 10, "x2": 19, "y2": 18 } ],
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "X": "f_console_broken",
+ "C": "f_counter",
+ "]": "f_counter_gate_c",
+ "W": "f_washer",
+ "D": "f_dryer",
+ "S": "f_stool",
+ "h": "f_chair",
+ "t": "f_table",
+ "r": "f_rack",
+ "A": "f_arcade_machine",
+ "&": "f_trashcan"
+ },
+ "items": {
+ "D": { "item": "laundry", "chance": 15 },
+ "W": { "item": "laundry", "chance": 15 },
+ "t": { "item": "laundry", "chance": 5 },
+ "&": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] }
+ },
+ "place_items": [
+ { "item": "behindcounter", "x": 7, "y": 12, "chance": 60 },
+ { "item": "snacks", "x": 7, "y": 15, "chance": 70 },
+ { "item": "magazines", "x": 7, "y": 16, "chance": 70 },
+ { "item": "laundromat_containers", "x": 15, "y": [ 15, 16 ], "chance": 60, "repeat": [ 1, 2 ] },
+ { "item": "laundromat_bleach", "x": [ 17, 18 ], "y": [ 12, 16 ], "chance": 30, "repeat": [ 4, 8 ] },
+ { "item": "cash_register_random", "x": [ 5, 7 ], "y": 13, "chance": 100 }
+ ],
+ "place_monster": [ { "group": "GROUP_ZOMBIE", "x": [ 5, 19 ], "y": [ 10, 18 ], "chance": 60, "repeat": [ 6, 12 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a fitness gym on the bottom right",
+ "nested_mapgen_id": "skyscraper_shopping_0_lr_entrance_store",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " SSLLB.R.R..P.P.P ",
+ " ...&B...........H ",
+ " BB+BB.R.R.......H ",
+ " ^..bb.....T.T.T.H ",
+ " ................ ",
+ " ^ ..C]CBb.E.E.E.E.H ",
+ " G..X..Bb.........H ",
+ " G..$..Bb.E.E.E.E.H ",
+ " ^ ^.C&.Bb......... ",
+ " HHHH HHHH HHHH ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "terrain": { ".": "t_linoleum_white", "+": "t_door_c", "B": "t_brick_wall", "G": "t_door_glass_c", "H": "t_wall_glass" },
+ "set": [ { "square": "terrain", "id": "t_linoleum_white", "x": 4, "y": 10, "x2": 19, "y2": 18 } ],
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "X": "f_console_broken",
+ "C": "f_counter",
+ "$": "f_counter",
+ "b": "f_bench",
+ "]": "f_counter_gate_c",
+ "E": "f_exercise",
+ "R": "f_ergometer",
+ "L": "f_locker",
+ "S": "f_shower",
+ "P": "f_punching_bag",
+ "T": "f_treadmill",
+ "&": "f_trashcan"
+ },
+ "items": {
+ "$": [ { "item": "cash_register_random", "chance": 100 }, { "item": "behindcounter", "chance": 50 } ],
+ "C": { "item": "behindcounter", "chance": 40 },
+ "b": { "item": "gym", "chance": 30 },
+ "L": { "item": "gym", "chance": 60, "repeat": [ 4, 9 ] },
+ ".": { "item": "gym", "chance": 5 },
+ "&": { "item": "trash", "chance": 50, "repeat": [ 2, 4 ] }
+ },
+ "place_monster": [ { "group": "GROUP_ZOMBIE", "x": [ 5, 19 ], "y": [ 10, 18 ], "chance": 60, "repeat": [ 5, 10 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a grocery store in the middle right. It and the map below are linked across tile boundaries",
+ "nested_mapgen_id": "skyscraper_shopping_0_mr_upper_store",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " U..]..^DDDDDDD^.!s ",
+ " .S.C............ ",
+ " ^ CCCC..dd.dd.ddt.H ",
+ " G......dd.dd.ddt.H ",
+ " G................H ",
+ " ^ .rr..ee. ",
+ " .rr..ee. ",
+ " .EE..ee.H "
+ ],
+ "terrain": { ".": "t_linoleum_white", "s": "t_sidewalk", "G": "t_door_glass_c", "H": "t_wall_glass", "!": "t_door_metal_locked" },
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "D": "f_glass_fridge",
+ "C": "f_counter",
+ "]": "f_counter_gate_c",
+ "S": "f_stool",
+ "d": "f_rack",
+ "t": "f_table",
+ "r": "f_rack",
+ "e": "f_rack",
+ "E": "f_rack",
+ "U": "f_trashcan"
+ },
+ "set": [
+ { "square": "terrain", "id": "t_floor", "x": 4, "y": 16, "x2": 19, "y2": 20 },
+ { "square": "terrain", "id": "t_floor", "x": 12, "y": 21, "x2": 19, "y2": 23 }
+ ],
+ "items": {
+ "C": { "item": "behindcounter", "chance": 40 },
+ "e": { "item": "groce_premade", "chance": 50, "repeat": [ 1, 2 ] },
+ "d": { "item": "groce_ingredient", "chance": 50, "repeat": [ 1, 2 ] },
+ "E": { "item": "cannedfood", "chance": 70, "repeat": [ 2, 4 ] },
+ "t": { "item": "snacks", "chance": 50, "repeat": [ 1, 3 ] },
+ "D": { "item": "groce_frozen", "chance": 70, "repeat": [ 1, 2 ] },
+ "U": { "item": "trash", "chance": 20, "repeat": [ 1, 2 ] }
+ },
+ "place_loot": [ { "group": "cash_register_random", "x": [ 4, 6 ], "y": 18 } ],
+ "place_monster": [ { "group": "GROUP_VANILLA", "x": [ 4, 19 ], "y": [ 16, 20 ], "chance": 80, "repeat": [ 5, 10 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a grocery store in the middle right. It and the map above are linked across tile boundaries",
+ "nested_mapgen_id": "skyscraper_shopping_0_mr_lower_store",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " .pp..ee.H ",
+ " .pp..ee.H ",
+ " ........ ",
+ " .PP..dd. ",
+ " .PP..dd.H ",
+ " .PP..dd.H ",
+ " .PP..dd.H ",
+ " ........ ",
+ " !.DDDDDD. ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "terrain": { ".": "t_linoleum_white", "H": "t_wall_glass", "!": "t_door_metal_locked" },
+ "furniture": { "e": "f_rack", "p": "f_rack", "A": "f_rack", "P": "f_rack", "d": "f_rack", "D": "f_glass_fridge" },
+ "set": [ { "square": "terrain", "id": "t_linoleum_white", "x": 12, "y": 0, "x2": 19, "y2": 8 } ],
+ "items": {
+ "A": { "item": "alcohol", "chance": 40, "repeat": [ 1, 2 ] },
+ "e": { "item": "groce_premade", "chance": 60, "repeat": [ 1, 2 ] },
+ "p": [
+ { "item": "groce_cereal", "chance": 50, "repeat": [ 1, 3 ] },
+ { "item": "groce_pasta", "chance": 50, "repeat": [ 1, 3 ] }
+ ],
+ "P": { "item": "produce", "chance": 50, "repeat": [ 1, 3 ] },
+ "d": { "item": "groce_bread", "chance": 50, "repeat": [ 1, 3 ] },
+ "D": { "item": "groce_dairyegg", "chance": 50, "repeat": [ 1, 3 ] }
+ },
+ "place_monster": [ { "group": "GROUP_VANILLA", "x": [ 12, 19 ], "y": [ 0, 7 ], "chance": 80, "repeat": [ 5, 10 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a beauty salon in the upper right",
+ "nested_mapgen_id": "skyscraper_shopping_0_ur_store_1",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " HH HH HHH HHH ",
+ " &..]..&M.M.M.M.MH ",
+ " .Sbc............H ",
+ " ^ c$cc...^rr^tt^ttH ",
+ " G.......######### ",
+ " G................ ",
+ " ^ ..rr^rr..rr^rr.. ",
+ " ..|||||..|||||.. ",
+ " ...m|m....C|C...H ",
+ " ..hu|uh..hu|uh..H ",
+ " ...C|C....m|m... ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "#": "t_rock_wall_half",
+ "s": "t_sidewalk",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass",
+ "!": "t_door_metal_locked",
+ "|": "t_wall_P"
+ },
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "$": "f_counter",
+ "c": "f_counter",
+ "C": "f_counter",
+ "]": "f_counter_gate_c",
+ "r": "f_rack",
+ "u": "f_sink",
+ "t": "f_table",
+ "M": "f_armchair",
+ "h": "f_chair",
+ "S": "f_stool",
+ "m": "f_bigmirror",
+ "&": "f_trashcan"
+ },
+ "set": [ { "square": "terrain", "id": "t_linoleum_white", "x": 4, "y": 5, "x2": 19, "y2": 14 } ],
+ "items": {
+ "b": { "item": "behindcounter", "chance": 60 },
+ "$": { "item": "cash_register_random", "chance": 100 },
+ "r": { "item": "beauty", "chance": 100, "repeat": [ 1, 4 ] },
+ "C": { "item": "SUS_hair_drawer", "chance": 100, "repeat": [ 1 ] },
+ "t": { "item": "magazines", "chance": 100, "repeat": [ 2, 4 ] },
+ "&": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] }
+ },
+ "place_monster": [ { "group": "GROUP_ZOMBIE", "x": [ 5, 18 ], "y": [ 5, 14 ], "chance": 60, "repeat": [ 6, 10 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_shopping_0_toilets_7x7_E",
+ "object": {
+ "mapgensize": [ 7, 7 ],
+ "rows": [
+ "aSS|T|T",
+ "...|+|+",
+ ".......",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "terrain": { ".": "t_linoleum_white", "|": "t_brick_wall", "+": "t_door_c" },
+ "furniture": { "S": "f_sink", "T": "f_toilet", "a": "f_trashcan" },
+ "set": [ { "square": "terrain", "id": "t_linoleum_white", "x": 0, "y": 0, "x2": 6, "y2": 2 } ],
+ "items": { "a": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] } },
+ "place_monster": [ { "group": "GROUP_ZOMBIE", "x": [ 0, 6 ], "y": [ 1, 2 ], "chance": 60, "repeat": [ 1, 5 ] } ],
+ "toilets": { "T": { } }
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_shopping_0_toilets_7x7_W",
+ "object": {
+ "mapgensize": [ 7, 7 ],
+ "rows": [
+ "T|T|SSa",
+ "+|+|...",
+ ".......",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "terrain": { ".": "t_linoleum_white", "|": "t_brick_wall", "+": "t_door_c" },
+ "furniture": { "S": "f_sink", "T": "f_toilet", "a": "f_trashcan" },
+ "set": [ { "square": "terrain", "id": "t_linoleum_white", "x": 0, "y": 0, "x2": 6, "y2": 2 } ],
+ "items": { "a": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] } },
+ "place_monster": [ { "group": "GROUP_ZOMBIE", "x": [ 0, 6 ], "y": [ 1, 2 ], "chance": 60, "repeat": [ 1, 5 ] } ],
+ "toilets": { "T": { } }
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a food court in the middle left",
+ "nested_mapgen_id": "skyscraper_shopping_0_ml_lower_store_1",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " s!~RCOSUfF ",
+ " d ~~~~~~~l ",
+ " d ]c$ccccc ",
+ " ........G ",
+ " HTh.hTTh.G ",
+ " HTh.hTTh. ",
+ " U......U ",
+ " HTh.hTTh. ",
+ " HTh.hTTh.! ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "set": [
+ { "square": "terrain", "id": "t_linoleum_white", "x": 4, "y": 0, "x2": 11, "y2": 2 },
+ { "square": "terrain", "id": "t_floor", "x": 4, "y": 3, "x2": 11, "y2": 8 }
+ ],
+ "terrain": {
+ ".": "t_floor",
+ "~": "t_linoleum_white",
+ "!": "t_door_metal_locked",
+ "s": "t_sidewalk",
+ "d": "t_region_groundcover_forest",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass"
+ },
+ "furniture": {
+ "$": "f_counter",
+ "c": "f_counter",
+ "C": "f_counter",
+ "]": "f_counter_gate_c",
+ "O": "f_oven",
+ "R": "f_rack",
+ "S": "f_sink",
+ "T": "f_table",
+ "h": "f_chair",
+ "l": "f_locker",
+ "d": "f_dumpster",
+ "f": "f_fridge",
+ "F": [ [ "f_fridge", 20 ], [ "f_freezer", 1 ] ],
+ "U": "f_trashcan"
+ },
+ "items": {
+ "U": { "item": "restaur_trash", "chance": 70, "repeat": [ 2, 5 ] },
+ "d": { "item": "restaur_trash", "chance": 30, "repeat": [ 1, 3 ] },
+ "T": { "item": "restaur_table", "chance": 15 },
+ "f": { "item": "restaur_fridge", "chance": 50, "repeat": [ 2, 8 ] },
+ "F": { "item": "restaur_fridge", "chance": 50, "repeat": [ 2, 8 ] },
+ "S": { "item": "restaur_sink", "chance": 60, "repeat": [ 2, 5 ] },
+ "R": { "item": "restaur_rack", "chance": 75, "repeat": [ 1, 3 ] },
+ "C": { "item": "restaur_kitchen", "chance": 75, "repeat": [ 1, 8 ] },
+ "l": { "item": "softdrugs", "chance": 100, "repeat": [ 2, 3 ] },
+ "$": { "item": "cash_register_random", "chance": 100 }
+ },
+ "place_zones": [ { "type": "NPC_INVESTIGATE_ONLY", "faction": "no_faction", "x": [ 4, 11 ], "y": [ 0, 1 ] } ],
+ "place_monster": [
+ { "group": "GROUP_GROCERY", "x": [ 4, 10 ], "y": 1, "chance": 5, "repeat": [ 1, 5 ] },
+ { "group": "GROUP_GROCERY", "x": 1, "y": [ 0, 3 ], "chance": 5, "repeat": [ 1, 5 ] },
+ { "group": "GROUP_PLAGUE_ROACH", "x": [ 4, 10 ], "y": 1, "chance": 20, "repeat": [ 1, 5 ] },
+ { "group": "GROUP_PLAGUE_ROACH", "x": 1, "y": [ 0, 3 ], "chance": 20, "repeat": [ 1, 5 ] },
+ { "group": "GROUP_ROACH", "x": [ 4, 10 ], "y": 1, "chance": 20, "repeat": [ 1, 5 ] },
+ { "group": "GROUP_ROACH", "x": 1, "y": [ 0, 3 ], "chance": 20, "repeat": [ 1, 5 ] }
+ ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "weight": 500,
+ "//": "This is a grocery store in the middle left. Lower weight because of guaranteed grocery store on the right",
+ "nested_mapgen_id": "skyscraper_shopping_0_ml_upper_store_1",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " RG..........]..U ",
+ " RG..tttttt..cbS. ",
+ " RG..------..cc$c ^ ",
+ " --..rrrrrr......G ",
+ " H................G ",
+ " H.ffffff.r|t.r|G# ^ ",
+ " H.------.r|t.r|.A ",
+ " d .rrrrrr.r|t.r|.A ",
+ " d ........ ",
+ " s!.BBBBBB. ",
+ " "
+ ],
+ "set": [
+ { "square": "terrain", "id": "t_linoleum_white", "x": 4, "y": 13, "x2": 11, "y2": 22 },
+ { "square": "terrain", "id": "t_linoleum_white", "x": 12, "y": 13, "x2": 19, "y2": 20 }
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "R": "t_thconc_floor",
+ "!": "t_door_metal_locked",
+ "-": "t_wall_w",
+ "|": "t_wall_w",
+ "#": "t_brick_wall",
+ "A": "t_atm",
+ "s": "t_sidewalk",
+ "d": "t_region_groundcover_forest",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass"
+ },
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "$": "f_counter",
+ "c": "f_counter",
+ "]": "f_counter_gate_c",
+ "f": "f_glass_fridge",
+ "B": "f_bookcase",
+ "r": "f_rack",
+ "R": "f_rack",
+ "t": "f_table",
+ "d": "f_dumpster",
+ "S": "f_stool",
+ "U": "f_trashcan"
+ },
+ "items": {
+ "b": { "item": "behindcounter", "chance": 60 },
+ "$": { "item": "cash_register_random", "chance": 100 },
+ "U": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] }
+ },
+ "place_items": [
+ { "item": "magazines", "x": [ 5, 7 ], "y": 22, "chance": 80, "repeat": [ 3, 10 ] },
+ { "item": "novels", "x": [ 8, 10 ], "y": 22, "chance": 80, "repeat": [ 2, 6 ] },
+ { "item": "behindcounter", "x": 16, "y": 18, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "softdrugs", "x": 16, "y": 19, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "cleaning", "x": 16, "y": 20, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_premade", "x": [ 5, 10 ], "y": 18, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "alcohol", "x": 14, "y": [ 18, 20 ], "chance": 80, "repeat": [ 1, 6 ] },
+ { "item": "groce_pasta", "x": 12, "y": 18, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_ingredient", "x": 12, "y": [ 19, 20 ], "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_frozen", "x": 4, "y": 13, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_meat", "x": 4, "y": 14, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_dairyegg", "x": 4, "y": 15, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_cereal", "x": [ 5, 6 ], "y": 20, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_bread", "x": [ 7, 8 ], "y": 20, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "snacks", "x": [ 9, 10 ], "y": 20, "chance": 80, "repeat": [ 1, 12 ] },
+ { "item": "groce_softdrink", "x": [ 8, 10 ], "y": 14, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "groce_condiment", "x": [ 8, 10 ], "y": 16, "chance": 80, "repeat": [ 1, 8 ] },
+ { "item": "produce", "x": [ 11, 13 ], "y": 14, "chance": 85, "repeat": [ 1, 10 ] },
+ { "item": "cannedfood", "x": [ 11, 13 ], "y": 16, "chance": 80, "repeat": [ 1, 8 ] }
+ ],
+ "place_monster": [ { "group": "GROUP_GROCERY", "x": [ 6, 18 ], "y": [ 13, 20 ], "chance": 80, "repeat": [ 3, 9 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is an electronics store in the middle left",
+ "nested_mapgen_id": "skyscraper_shopping_0_ml_upper_store_1",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " C...........]..U ",
+ " C...tttttt..cbS. ",
+ " C...------..cc$c ^ ",
+ " --..RRRRRR......G ",
+ " H................G ",
+ " H.ffffff.1|2.3|G# ^ ",
+ " H.------.1|2.3|.A ",
+ " d .rrrrrr.1|2.3|.A ",
+ " d ........ ",
+ " s!.CCCCCC. ",
+ " "
+ ],
+ "set": [
+ { "square": "terrain", "id": "t_floor", "x": 4, "y": 13, "x2": 11, "y2": 22 },
+ { "square": "terrain", "id": "t_floor", "x": 12, "y": 13, "x2": 19, "y2": 20 }
+ ],
+ "terrain": {
+ ".": "t_floor",
+ "R": "t_thconc_floor",
+ "!": "t_door_metal_locked",
+ "-": "t_wall_w",
+ "|": "t_wall_w",
+ "#": "t_brick_wall",
+ "A": "t_atm",
+ "s": "t_sidewalk",
+ "d": "t_region_groundcover_forest",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass"
+ },
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "$": "f_counter",
+ "c": "f_counter",
+ "C": "f_counter",
+ "]": "f_counter_gate_c",
+ "f": "f_rack",
+ "r": "f_rack",
+ "2": "f_rack",
+ "3": "f_rack",
+ "1": "f_rack",
+ "R": "f_rack",
+ "t": "f_table",
+ "d": "f_dumpster",
+ "S": "f_stool",
+ "U": "f_trashcan"
+ },
+ "items": {
+ "1": { "item": "elecsto_diy", "chance": 35 },
+ "2": { "item": "elecsto_homapl", "chance": 50 },
+ "3": { "item": "supplies_electronics", "chance": 50, "repeat": [ 2, 5 ] },
+ "b": { "item": "behindcounter", "chance": 60 },
+ "C": { "item": "elecsto_displ", "chance": 20 },
+ "r": { "item": "elecsto_lights", "chance": 20 },
+ "f": { "item": "elecsto_persele", "chance": 50 },
+ "R": { "item": "supplies_electronics", "chance": 50, "repeat": [ 2, 5 ] },
+ "t": { "item": "elecsto_books", "chance": 10 },
+ "$": { "item": "cash_register_random", "chance": 100 },
+ "U": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] }
+ },
+ "place_monster": [ { "group": "GROUP_ELECTRO", "x": [ 6, 18 ], "y": [ 13, 20 ], "chance": 80, "repeat": [ 5, 10 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a book store in the middle left",
+ "nested_mapgen_id": "skyscraper_shopping_0_ml_upper_store_1",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " QQQQQQQQQQ#..BBB ",
+ " Q.....Q...]..... ",
+ " Q..a..Q.a.ccc$cc ^ ",
+ " Q.....Q.........G ",
+ " H..........KKK...G ",
+ " Ha..UUUU..WWWWW.. ^ ",
+ " H................ ",
+ " d .NNNPPP..OOTTJJJ ",
+ " d ........ ",
+ " s!.IIIAMM. ",
+ " "
+ ],
+ "set": [
+ { "square": "terrain", "id": "t_floor", "x": 4, "y": 13, "x2": 11, "y2": 22 },
+ { "square": "terrain", "id": "t_floor", "x": 12, "y": 13, "x2": 19, "y2": 20 }
+ ],
+ "terrain": {
+ ".": "t_floor",
+ "!": "t_door_metal_locked",
+ "-": "t_wall_w",
+ "|": "t_wall_w",
+ "#": "t_brick_wall",
+ "s": "t_sidewalk",
+ "d": "t_region_groundcover_forest",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass"
+ },
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "a": "f_armchair",
+ "$": "f_counter",
+ "c": "f_counter",
+ "]": "f_counter_gate_c",
+ "A": "f_bookcase",
+ "B": "f_bookcase",
+ "Q": "f_bookcase",
+ "K": "f_bookcase",
+ "J": "f_bookcase",
+ "I": "f_bookcase",
+ "T": "f_bookcase",
+ "O": "f_bookcase",
+ "M": "f_bookcase",
+ "N": "f_bookcase",
+ "P": "f_bookcase",
+ "U": "f_bookcase",
+ "W": "f_bookcase",
+ "t": "f_table",
+ "d": "f_dumpster",
+ "S": "f_stool"
+ },
+ "items": {
+ "b": { "item": "behindcounter", "chance": 60 },
+ "$": { "item": "cash_register_random", "chance": 100 },
+ "&": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] },
+ "B": { "item": "homebooks", "chance": 50, "repeat": [ 2, 5 ] },
+ "K": { "item": "SUS_business_bookcase", "chance": 80 },
+ "J": { "item": "SUS_engineering_bookcase", "chance": 75 },
+ "W": { "item": "SUS_crafts_bookcase", "chance": 75 },
+ "U": { "item": "SUS_cooking_bookcase", "chance": 75 },
+ "I": { "item": "SUS_tailoring_bookcase", "chance": 75 },
+ "T": { "item": "SUS_computers_bookcase", "chance": 70 },
+ "O": { "item": "SUS_electronics_bookcase", "chance": 75 },
+ "M": { "item": "SUS_historical_manufacturing_bookcase", "chance": 60 },
+ "N": { "item": "SUS_chemistry_bookcase", "chance": 75 },
+ "P": { "item": "SUS_medicine_bookcase", "chance": 60 },
+ "A": { "item": "SUS_bushcraft_bookcase", "chance": 75 },
+ "Q": { "item": "SUS_fiction_bookcase", "chance": 70 },
+ "d": { "item": "SUS_office_desk", "chance": 70 },
+ "L": { "item": "SUS_janitors_closet", "chance": 100 }
+ },
+ "place_monster": [ { "group": "GROUP_VANILLA", "x": [ 6, 18 ], "y": [ 13, 20 ], "chance": 80, "repeat": [ 3, 8 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "//": "This is a pet supply store in the upper-left.",
+ "nested_mapgen_id": "skyscraper_shopping_0_ul_store_1",
+ "object": {
+ "mapgensize": [ 24, 24 ],
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " HHH HH HHH ",
+ " R.D.d.t..uu.]..U ",
+ " HR.D.d.t..uu.cbS. ",
+ " HR.D.d.t..uu.cc$c ^ ",
+ " ~~~~~~~~~~~~~~~~G ",
+ " H.RRRRRR..RRRRRR. ^ ",
+ " H................ ",
+ " s!.CCCCCC..CCCCCC. ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "set": [ { "square": "terrain", "id": "t_floor", "x": 4, "y": 5, "x2": 19, "y2": 11 } ],
+ "terrain": {
+ ".": "t_floor",
+ "!": "t_door_metal_locked",
+ "s": "t_sidewalk",
+ "~": "t_carpet_green",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass"
+ },
+ "furniture": {
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "]": "f_counter_gate_c",
+ "c": "f_counter",
+ "$": "f_counter",
+ "R": "f_rack",
+ "C": "f_counter",
+ "d": "f_counter",
+ "D": "f_counter",
+ "u": "f_counter",
+ "t": "f_table",
+ "S": "f_stool",
+ "U": "f_trashcan"
+ },
+ "items": {
+ "b": { "item": "behindcounter", "chance": 60 },
+ "$": { "item": "cash_register_random", "chance": 100 },
+ "R": { "item": "petstore_shelves", "chance": 70, "repeat": [ 2, 8 ] },
+ "C": { "item": "petstore_misc", "chance": 70, "repeat": [ 2, 8 ] },
+ "d": { "item": "vet_softdrug", "chance": 70, "repeat": [ 1, 2 ] },
+ "D": { "item": "vet_hardrug", "chance": 20 },
+ "u": { "item": "vet_utility", "chance": 85, "repeat": [ 1, 4 ] },
+ "t": { "item": "magazines", "chance": 70, "repeat": [ 1, 6 ] },
+ "U": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] }
+ },
+ "place_monster": [ { "group": "GROUP_VANILLA", "x": [ 4, 18 ], "y": [ 5, 11 ], "chance": 50, "repeat": [ 6, 10 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small1_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "FFF.d",
+ "....d",
+ "....c",
+ "ddx.c",
+ "....."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": 2, "y": 2, "rotation": 90, "chance": 75 } ],
+ "place_monster": [ { "group": "GROUP_VANILLA", "x": [ 0, 4 ], "y": [ 0, 2 ], "chance": 80, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small2_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "xddhc",
+ "x...c",
+ "xFF.c",
+ "---+-",
+ "....."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": 2, "y": 1, "rotation": 90, "chance": 75 } ],
+ "place_monster": [ { "group": "GROUP_VANILLA", "x": [ 0, 4 ], "y": [ 0, 2 ], "chance": 80, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_sofa_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "?????",
+ "?....",
+ "?.nn.",
+ "^...M",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_green",
+ "n": "t_carpet_green",
+ ".": "t_carpet_green",
+ "^": "t_carpet_green",
+ "M": "t_carpet_green",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_sofa_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "?????",
+ "?....",
+ "?.nn.",
+ "^...M",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_purple",
+ "n": "t_carpet_purple",
+ ".": "t_carpet_purple",
+ "^": "t_carpet_purple",
+ "M": "t_carpet_purple",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_sofa_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "?????",
+ "?....",
+ "?.nn.",
+ "^...M",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_red",
+ "n": "t_carpet_red",
+ ".": "t_carpet_red",
+ "^": "t_carpet_red",
+ "M": "t_carpet_red",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_sofa_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "?????",
+ "?....",
+ "?.nn.",
+ "^...M",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_yellow",
+ "n": "t_carpet_yellow",
+ ".": "t_carpet_yellow",
+ "^": "t_carpet_yellow",
+ "M": "t_carpet_yellow",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_office_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "xdFdx",
+ "dh.hd",
+ "d...d",
+ "-HGH-",
+ ":::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "x": "t_linoleum_white",
+ "d": "t_linoleum_white",
+ "h": "t_linoleum_white",
+ "F": "t_linoleum_white"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_office_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "xdFdx",
+ "dh.hd",
+ "d...d",
+ "-HGH-",
+ ":::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_green",
+ "x": "t_carpet_green",
+ "d": "t_carpet_green",
+ "h": "t_carpet_green",
+ "F": "t_carpet_green"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_office_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "xdFdx",
+ "dh.hd",
+ "d...d",
+ "-HGH-",
+ ":::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_purple",
+ "x": "t_carpet_purple",
+ "d": "t_carpet_purple",
+ "h": "t_carpet_purple",
+ "F": "t_carpet_purple"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_office_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "xdFdx",
+ "dh.hd",
+ "d...d",
+ "-HGH-",
+ ":::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_yellow",
+ "x": "t_carpet_yellow",
+ "d": "t_carpet_yellow",
+ "h": "t_carpet_yellow",
+ "F": "t_carpet_yellow"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_small_office_ul",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "xdFdx",
+ "dh.hd",
+ "d...d",
+ "-HGH-",
+ ":::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_red",
+ "x": "t_carpet_red",
+ "d": "t_carpet_red",
+ "h": "t_carpet_red",
+ "F": "t_carpet_red"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_glass_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "Vdd..F",
+ "Vxh..F",
+ "Vdd...",
+ "|-HGH-",
+ "::::::",
+ "::::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_linoleum_white",
+ "x": "t_linoleum_white",
+ "d": "t_linoleum_white",
+ "h": "t_linoleum_white",
+ "F": "t_linoleum_white"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 4 ], "y": [ 0, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_glass_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "Vdd..F",
+ "Vxh..F",
+ "Vdd...",
+ "|-HGH-",
+ "::::::",
+ "::::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_green",
+ "x": "t_carpet_green",
+ "d": "t_carpet_green",
+ "h": "t_carpet_green",
+ "F": "t_carpet_green"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 4 ], "y": [ 0, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_glass_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "Vdd..F",
+ "Vxh..F",
+ "Vdd...",
+ "|-HGH-",
+ "::::::",
+ "::::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_purple",
+ "x": "t_carpet_purple",
+ "d": "t_carpet_purple",
+ "h": "t_carpet_purple",
+ "F": "t_carpet_purple"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 4 ], "y": [ 0, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_glass_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "Vdd..F",
+ "Vxh..F",
+ "Vdd...",
+ "|-HGH-",
+ "::::::",
+ "::::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_red",
+ "x": "t_carpet_red",
+ "d": "t_carpet_red",
+ "h": "t_carpet_red",
+ "F": "t_carpet_red"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 4 ], "y": [ 0, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_glass_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "Vdd..F",
+ "Vxh..F",
+ "Vdd...",
+ "|-HGH-",
+ "::::::",
+ "::::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ ".": "t_carpet_yellow",
+ "x": "t_carpet_yellow",
+ "d": "t_carpet_yellow",
+ "h": "t_carpet_yellow",
+ "F": "t_carpet_yellow"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 4 ], "y": [ 0, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_office_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "d.FF.c",
+ "d...hc",
+ "ch...d",
+ "cx..xd",
+ "......",
+ "......"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 1, 4 ], "y": [ 1, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_computer_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "Vx.x.x",
+ "Vx.x.x",
+ "Vx...x",
+ "HHHGHH",
+ "..^.^.",
+ "......"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_6x6_files_ur",
+ "object": {
+ "mapgensize": [ 6, 6 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "|F.F.F",
+ "|F.F.F",
+ "|F...F",
+ "|--+--",
+ "......",
+ "......"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_register_ur",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "..FFF",
+ "c....",
+ "c....",
+ "cxddd",
+ "....."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 1, 4 ], "y": [ 1, 1 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_benches_ur",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".bttb",
+ ".bttb",
+ ".bttb",
+ ".....",
+ ".cccc"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_monster": [ { "group": "GROUP_VANILLA", "x": [ 0, 4 ], "y": [ 0, 4 ], "chance": 80, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofa_ur",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "c????",
+ "c...?",
+ "..n.?",
+ "M.n.?",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_purple",
+ "n": "t_carpet_purple",
+ "c": "t_carpet_purple",
+ ".": "t_carpet_purple",
+ "^": "t_carpet_purple",
+ "M": "t_carpet_purple",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofa_ur",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "c????",
+ "c...?",
+ "..n.?",
+ "M.n.?",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_green",
+ "n": "t_carpet_green",
+ "c": "t_carpet_green",
+ ".": "t_carpet_green",
+ "^": "t_carpet_green",
+ "M": "t_carpet_green",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofa_ur",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "c????",
+ "c...?",
+ "..n.?",
+ "M.n.?",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_red",
+ "n": "t_carpet_red",
+ "c": "t_carpet_red",
+ ".": "t_carpet_red",
+ "^": "t_carpet_red",
+ "M": "t_carpet_red",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofa_ur",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "c????",
+ "c...?",
+ "..n.?",
+ "M.n.?",
+ ":::::"
+ ],
+ "terrain": {
+ "?": "t_carpet_yellow",
+ "n": "t_carpet_yellow",
+ "c": "t_carpet_yellow",
+ ".": "t_carpet_yellow",
+ "^": "t_carpet_yellow",
+ "M": "t_carpet_yellow",
+ ":": "t_linoleum_gray"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_office_ur",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "d..xd",
+ "d..hd",
+ "dh..d",
+ "dx..d",
+ "....."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 1, 3 ], "y": [ 1, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_crowded_dl",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "*V..............",
+ "*VY.............",
+ "*Vdh...d.h......",
+ "*|dxdd.dxdd.FF..",
+ "*Vdddd.ddxd.dd..",
+ "*Vx..h..h.d..d..",
+ "*Vd.h..d..h.hd..",
+ "*|dddx.dddx..x..",
+ "*Vdxdd.xddd.dd..",
+ "*Vd.h...h.d..d..",
+ "*Vx..h.d.h..hd..",
+ "*|dddd.dxdd..x..",
+ "*|-HHH-HHHH-HHH-",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_generic_dl",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "*V..............",
+ "*VY.............",
+ "*V..............",
+ "*|dddxdddxdddx..",
+ "*Vd.h.d.h.d.h...",
+ "*V..............",
+ "*Vdddxdddxdddx..",
+ "*|d...d..hdh....",
+ "*V..h...........",
+ "*Vdddxdddxdddx..",
+ "*Vd.h.d.h.d.....",
+ "*|..........h...",
+ "*|-HHH-HHHH-HHH-",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_glass_dl",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "*V::::::::::::::",
+ "*V::::::::::::::",
+ "*V^::::^::^::::^",
+ "*|-HHHH----HGGH-",
+ "*Vd.h..d.h.....Y",
+ "*Vdddx.dxdd.....",
+ "*V..............",
+ "*|F..........MtM",
+ "*VF..........MtM",
+ "*V..............",
+ "*Vdddd.xddd.xddd",
+ "*|x.h....hd..h.d",
+ "*|-HHH-HHHH-HHH-",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "a": "t_linoleum_gray",
+ "F": "t_linoleum_white",
+ "h": "t_linoleum_white",
+ "d": "t_linoleum_white",
+ "x": "t_linoleum_white",
+ "M": "t_linoleum_white",
+ "t": "t_linoleum_white",
+ "Y": "t_linoleum_white"
+ },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_private_dl",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "*V..............",
+ "*V..............",
+ "*V..FFFFF..^....",
+ "*|----|----|d..Y",
+ "*Vdx.d|dx.d|dh..",
+ "*Vdhhd|d.hd|d...",
+ "*Vd.xd|dhxd|dx..",
+ "*|..............",
+ "*V..............",
+ "*Vd.xd|d.xd|dh.d",
+ "*Vdh.d|dhhd|d.hd",
+ "*|dxhd|dx.d|dxxd",
+ "*|-HHH-HHHH-HHH-",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_slide_dl",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "*V..............",
+ "*V..............",
+ "*V..............",
+ "*|...FFF..FFF...",
+ "*V...-|-..-|-...",
+ "*Vdx.d|dx.d|dx..",
+ "*Vdh.d|dh.d|d...",
+ "*|d.hd|d.hd|d.h.",
+ "*Vd.xd|d.xd|d...",
+ "*V....|....|....",
+ "*Vd.h.|d.h.|..hd",
+ "*|dddx|dxdd|xddd",
+ "*|-HHH-HHHH-HHH-",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_boss_cafe_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "::::::::::::::V*",
+ ":::::::::::::^V*",
+ "::::^::^a:::::V*",
+ "----|++|HHGGHH|*",
+ "CoSe|..|⌅~~~~⌅V*",
+ "Ciii|..|~~~~~~V*",
+ ".......|~~ddxdV*",
+ ".......|~~~~~dV*",
+ "bb...bb|~~~~~~V*",
+ "tt...tt|-=----|*",
+ "tt...tt|......|*",
+ "bb.å.bb|FFFFFF|*",
+ "-HHHHH-|------|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "b": "t_linoleum_white",
+ "t": "t_linoleum_white",
+ "å": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "~": "t_carpet_green",
+ "d": "t_carpet_green",
+ "x": "t_carpet_green",
+ "⌅": "t_carpet_green"
+ },
+ "furniture": { "å": "f_trashcan", "⌅": [ "f_indoor_plant", "f_indoor_plant_y" ] },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 9, 12 ], "y": [ 7, 8 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_boss_cafe_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "::::::::::::::V*",
+ ":::::::::::::^V*",
+ "::::^::^a:::::V*",
+ "----|++|HHGGHH|*",
+ "CoSe|..|⌅~~~~⌅V*",
+ "Ciii|..|~~~~~~V*",
+ ".......|~~ddxdV*",
+ ".......|~~~~~dV*",
+ "bb...bb|~~~~~~V*",
+ "tt...tt|-=----|*",
+ "tt...tt|......|*",
+ "bb.å.bb|FFFFFF|*",
+ "-HHHHH-|------|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "b": "t_linoleum_white",
+ "t": "t_linoleum_white",
+ "å": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "~": "t_carpet_yellow",
+ "d": "t_carpet_yellow",
+ "x": "t_carpet_yellow",
+ "⌅": "t_carpet_yellow"
+ },
+ "furniture": { "å": "f_trashcan", "⌅": [ "f_indoor_plant", "f_indoor_plant_y" ] },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 9, 12 ], "y": [ 7, 8 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_boss_cafe_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "::::::::::::::V*",
+ ":::::::::::::^V*",
+ "::::^::^a:::::V*",
+ "----|++|HHGGHH|*",
+ "CoSe|..|⌅~~~~⌅V*",
+ "Ciii|..|~~~~~~V*",
+ ".......|~~ddxdV*",
+ ".......|~~~~~dV*",
+ "bb...bb|~~~~~~V*",
+ "tt...tt|-=----|*",
+ "tt...tt|......|*",
+ "bb.å.bb|FFFFFF|*",
+ "-HHHHH-|------|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "b": "t_linoleum_white",
+ "t": "t_linoleum_white",
+ "å": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "~": "t_carpet_red",
+ "d": "t_carpet_red",
+ "x": "t_carpet_red",
+ "⌅": "t_carpet_red"
+ },
+ "furniture": { "å": "f_trashcan", "⌅": [ "f_indoor_plant", "f_indoor_plant_y" ] },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 9, 12 ], "y": [ 7, 8 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_boss_cafe_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "::::::::::::::V*",
+ ":::::::::::::^V*",
+ "::::^::^a:::::V*",
+ "----|++|HHGGHH|*",
+ "CoSe|..|⌅~~~~⌅V*",
+ "Ciii|..|~~~~~~V*",
+ ".......|~~ddxdV*",
+ ".......|~~~~~dV*",
+ "bb...bb|~~~~~~V*",
+ "tt...tt|-=----|*",
+ "tt...tt|......|*",
+ "bb.å.bb|FFFFFF|*",
+ "-HHHHH-|------|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "b": "t_linoleum_white",
+ "t": "t_linoleum_white",
+ "å": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "~": "t_carpet_purple",
+ "d": "t_carpet_purple",
+ "x": "t_carpet_purple",
+ "⌅": "t_carpet_purple"
+ },
+ "furniture": { "å": "f_trashcan", "⌅": [ "f_indoor_plant", "f_indoor_plant_y" ] },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 9, 12 ], "y": [ 7, 8 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".............aV*",
+ ".............YV*",
+ "..............V*",
+ "..xdddxdddxddd|*",
+ "...h.d.h.d...dV*",
+ "............h.V*",
+ "..xdddxdddxdddV*",
+ "....hdh..d.h.d|*",
+ "..............V*",
+ "..xdddxdddxdddV*",
+ ".....d.h.d...dV*",
+ "...h.......h..|*",
+ "-HHH-HHHH-HHH-|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_glass_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "::::::::::::::V*",
+ "::::::::::::::V*",
+ "^::::FFFF:::::V*",
+ "-HGGH----HHHH-|*",
+ "^.....h.d...hdV*",
+ ".....ddxd.xdddV*",
+ "..............V*",
+ ".............Y|*",
+ ".............aV*",
+ "..............V*",
+ "dddx.dddx.ddddV*",
+ "d..h.d.h...h.x|*",
+ "-HHH-HHHH-HHH-|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "F": "t_linoleum_gray",
+ "h": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "a": "t_linoleum_white",
+ "d": "t_linoleum_white",
+ "x": "t_linoleum_white"
+ },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_slide_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".............aV*",
+ ".............YV*",
+ "..............V*",
+ "...FFF..FFF...|*",
+ "-..-|-..-|-...V*",
+ "...d|dx.d|dx.dV*",
+ "...d|dh.d|d.hdV*",
+ "..hc|d.hd|dh.d|*",
+ "..xc|d.xd|d.xdV*",
+ "...-|-..-|-...V*",
+ "d.h.|.h.d|.h.dV*",
+ "dddx|ddxd|xddd|*",
+ "-HHH-HHHH-HHH-|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_private_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "..............V*",
+ "..............V*",
+ ".....^FFFF^...V*",
+ "..xd|----|----|*",
+ "...d|dddd|dxddV*",
+ "..hd|dhhc|dhhdV*",
+ "...d|x..x|d..xV*",
+ "..............|*",
+ "..............V*",
+ "d.hd|x.hd|dh.dV*",
+ "dh.d|dh.d|d.hdV*",
+ "dxxd|dddx|xddx|*",
+ "-HHH-HHHH-HHH-|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_crowded_dr",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "..............V*",
+ "..............V*",
+ "......h.x..h.dV*",
+ "..FF.dddd.ddxd|*",
+ "..dd.ddxd.ddddV*",
+ "..x...h.d..h.xV*",
+ "..dh.d.h..d.h.V*",
+ "..d..dxdd.dxdd|*",
+ "..dd.dddd.dddxV*",
+ "..d..xh...d.h.V*",
+ "..dh...hd..h.dV*",
+ "..x..ddxd.ddxd|*",
+ "-HHH-HHHH-HHH-|*",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_register_ol",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "ddddx",
+ "....d",
+ "....d",
+ "FFF.."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 0, 3 ], "y": [ 2, 3 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_office1_ol",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "xddd.",
+ "..h..",
+ ".h...",
+ "dddx."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_office2_ol",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "ddxd.",
+ ".h.d.",
+ "d.h..",
+ "dddx^"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_ol",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "^:M::",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ ":": "t_carpet_yellow",
+ "?": "t_carpet_yellow",
+ "^": "t_carpet_yellow",
+ "M": "t_carpet_yellow",
+ "n": "t_carpet_yellow"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_ol",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "^:M::",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ ":": "t_carpet_red",
+ "M": "t_carpet_red",
+ "^": "t_carpet_red",
+ "?": "t_carpet_red",
+ "n": "t_carpet_red"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_ol",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "^:M::",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ ":": "t_carpet_green",
+ "M": "t_carpet_green",
+ "^": "t_carpet_green",
+ "?": "t_carpet_green",
+ "n": "t_carpet_green"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_ol",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "^:M::",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ "^": "t_carpet_purple",
+ "?": "t_carpet_purple",
+ ":": "t_carpet_purple",
+ "M": "t_carpet_purple",
+ "n": "t_carpet_purple"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_slide_al",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "*|-HHH-HHHH-HHH-",
+ "*|dddx|dxdd|xddd",
+ "*Vd.h.|d.h.|..hd",
+ "*V...-|-..-|-...",
+ "*Vdx.d|dx.d|dx..",
+ "*|dh.d|d.hd|d...",
+ "*Vd.hc|dh.d|dh..",
+ "*Vd.xc|d.xd|d...",
+ "*V...-|-..-|-..a",
+ "*|...FFF..FFF..Y",
+ "*V..............",
+ "*V..............",
+ "*V.............."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_crowded_al",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "*|-HHH-HHHH-HHH-",
+ "*|dddd.dddd.dda.",
+ "*V..hx..h.x..d..",
+ "*V..........hd..",
+ "*V.h.d..h.d..x..",
+ "*|xddd.ddxd.dd..",
+ "*Vxddd.dddd.hd..",
+ "*V..hd..h.x..d..",
+ "*Vxh...d.h...x..",
+ "*|dddd.dddx.FF..",
+ "*VY..^.^........",
+ "*V..............",
+ "*V.............."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_al",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "*|-HHH-HHHH-HHH-",
+ "*|......h......F",
+ "*Vd.h.d...d.h..F",
+ "*Vdddxdddxdddx..",
+ "*V.......h......",
+ "*|dh..d...dh...a",
+ "*Vdddxdddxdddx..",
+ "*V..h...........",
+ "*Vd...d.h.d..h.F",
+ "*|dddxdddxdddx.F",
+ "*V...........Y..",
+ "*V..............",
+ "*V.............."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_private_al",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "*|-HHH-HHHH-HHH-",
+ "*|dddd|dddx|dddd",
+ "*Vd.hd|xh.d|x.h.",
+ "*Vxh.x|d.hd|....",
+ "*V..............",
+ "*|..............",
+ "*Vx.hd|d..d|d...",
+ "*Vdh.d|dhhd|dh..",
+ "*Vdddx|dxxd|d...",
+ "*|----|----|dx..",
+ "*V.....^FFFY....",
+ "*V..............",
+ "*V.............."
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_glass_al",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "*|-HHH-HHHH-HHH-",
+ "*|d.h....hd..h.d",
+ "*Vdddx.xddd.ddxd",
+ "*V..............",
+ "*V..............",
+ "*|Y.............",
+ "*V..MM........h.",
+ "*V.Mtt.xddd.xddd",
+ "*V..MM..h.d.....",
+ "*|-HHHH----HGGH-",
+ "*Va::::FFFF:::::",
+ "*V::::::::::::::",
+ "*V::::::::::::::"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "a": "t_linoleum_gray",
+ "F": "t_linoleum_gray",
+ "h": "t_linoleum_white",
+ "d": "t_linoleum_white",
+ "x": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "M": "t_linoleum_white",
+ "t": "t_linoleum_white"
+ },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_slide_ar",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "-HHH-HHHH-HHH-|*",
+ "dddx|dxdd|xddd|*",
+ "d.h.|d.h.|..hdV*",
+ "...-|-..-|-...V*",
+ "...d|dx.d|dx.dV*",
+ "...d|d.hd|d.hd|*",
+ "..hd|dh.d|dh.dV*",
+ "..xd|d.xd|d.xdV*",
+ "...-|-..-|-..aV*",
+ "...FFF..FFF..Y|*",
+ "..............V*",
+ "..............V*",
+ "..............V*"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_crowded_ar",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "-HHH-HHHH-HHH-|*",
+ "..x..dddd.dddd|*",
+ "..dh...hx..h.xV*",
+ "..dh..........V*",
+ "..dd..h.d..h.dV*",
+ "..x..xddd.ddxd|*",
+ "..dh.xddd.ddddV*",
+ "..d....hd..h.xV*",
+ "..dd.xh...d.h.V*",
+ "..FF.dddd.dddx|*",
+ "Y.......^.^...V*",
+ "..............V*",
+ "..............V*"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_ar",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "-HHH-HHHH-HHH-|*",
+ "^.............|*",
+ "..d.h.d.h.d.h.V*",
+ "..dddxdddxdddxV*",
+ ".......h....h.V*",
+ "a.dh..d...dh..|*",
+ "..dddxdddxdddxV*",
+ "..h...........V*",
+ "..d...d.h.d..hV*",
+ "^.dddxdddxdddx|*",
+ "...FF..FF..FF.V*",
+ "..............V*",
+ "..............V*"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_private_ar",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "-HHH-HHHH-HHH-|*",
+ "dddd|dddx|dddd|*",
+ "..hx|xh.d|d.hdV*",
+ "....|d.hd|xh.xV*",
+ "..............V*",
+ "..............|*",
+ "...d|x.hd|d..dV*",
+ "..hd|dh.d|dhhdV*",
+ "a..d|dddx|dxxdV*",
+ "Y.xd|----|----|*",
+ "....^.FF.^.FF.V*",
+ "..............V*",
+ "..............V*"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_office_glass_ar",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "****************",
+ "****************",
+ "****************",
+ "-HHH-HHHH-HHH-|*",
+ "d.h....hd..h.d|*",
+ "dddx.xddd.ddxdV*",
+ ".............FV*",
+ ".............FV*",
+ ".............F|*",
+ ".............FV*",
+ ".....xddd.xdddV*",
+ "Y.....h.d..h.dV*",
+ "-HGGH----HHHH-|*",
+ "a::::^::^:::::V*",
+ "::::::::::::::V*",
+ "::::::::::::::V*"
+ ],
+ "terrain": {
+ ":": "t_linoleum_gray",
+ "a": "t_linoleum_gray",
+ "D": "t_linoleum_white",
+ "h": "t_linoleum_white",
+ "d": "t_linoleum_white",
+ "x": "t_linoleum_white",
+ "Y": "t_linoleum_white"
+ },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_register_or",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ ".....",
+ "ddxcc",
+ "d.h..",
+ "..FFF"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_office_or",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ ".....",
+ ".d.hd",
+ ".dh.d",
+ ".xccx"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_or",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "::M:^",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ "^": "t_carpet_purple",
+ "M": "t_carpet_purple",
+ ":": "t_carpet_purple",
+ "?": "t_carpet_purple",
+ "n": "t_carpet_purple"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_or",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "::M:^",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ "M": "t_carpet_green",
+ "^": "t_carpet_green",
+ ":": "t_carpet_green",
+ "?": "t_carpet_green",
+ "n": "t_carpet_green"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_or",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "::M:^",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ ":": "t_carpet_red",
+ "M": "t_carpet_red",
+ "^": "t_carpet_red",
+ "?": "t_carpet_red",
+ "n": "t_carpet_red"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_sofas_or",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ ".....",
+ "::M:^",
+ "?:::?",
+ "?:n:?",
+ "?:::?"
+ ],
+ "terrain": {
+ ".": "t_linoleum_gray",
+ "M": "t_carpet_yellow",
+ "^": "t_carpet_yellow",
+ ":": "t_carpet_yellow",
+ "?": "t_carpet_yellow",
+ "n": "t_carpet_yellow"
+ },
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_toilet_il",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "iiii+",
+ "TiSi|",
+ "----|",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_storage1_il",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "???.=",
+ "nnhh|",
+ "----|",
+ "*****",
+ "*****"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_storage2_il",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "MMnn=",
+ "hMnn|",
+ "----|",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_storage3_il",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "xcc.=",
+ "xx.h|",
+ "----|",
+ "*****",
+ "*****"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_cleaning1_il",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "iiii=",
+ "Syyy|",
+ "----|",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_cleaning2_il",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "iiii=",
+ "SCCy|",
+ "----|",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_toilet_ir",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "+iiii",
+ "|SiTi",
+ "|----",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_storage1_ir",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "=.???",
+ "|nnhh",
+ "|----",
+ "*****",
+ "*****"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_storage2_ir",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "=nnMM",
+ "|nnMh",
+ "|----",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_storage3_ir",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "=xc.c",
+ "|.xxh",
+ "|----",
+ "*****",
+ "*****"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_cleaning1_ir",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "=iiii",
+ "|Syyy",
+ "|----",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_5x5_cleaning2_ir",
+ "object": {
+ "mapgensize": [ 5, 5 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "=iiii",
+ "|yCCS",
+ "|----",
+ "*****",
+ "*****"
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_boss_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V...d|",
+ "**V...d|",
+ "**G.ddx|",
+ "**G..h.+",
+ "**V.h..|",
+ "**VFFFF|",
+ "**|----|"
+ ],
+ "terrain": {
+ "d": "t_carpet_yellow",
+ "x": "t_carpet_yellow",
+ "h": "t_carpet_yellow",
+ "F": "t_carpet_yellow",
+ ".": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 5 ], "y": [ 1, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_boss_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V...d|",
+ "**V...d|",
+ "**G.ddx|",
+ "**G..h.+",
+ "**V.h..|",
+ "**VFFFF|",
+ "**|----|"
+ ],
+ "terrain": { "d": "t_carpet_green", "x": "t_carpet_green", "h": "t_carpet_green", "F": "t_carpet_green", ".": "t_carpet_green" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 5 ], "y": [ 1, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_boss_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V...d|",
+ "**V...d|",
+ "**G.ddx|",
+ "**G..h.+",
+ "**V.h..|",
+ "**VFFFF|",
+ "**|----|"
+ ],
+ "terrain": { "d": "t_carpet_red", "x": "t_carpet_red", "h": "t_carpet_red", "F": "t_carpet_red", ".": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 5 ], "y": [ 1, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_boss_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V...d|",
+ "**V...d|",
+ "**G.ddx|",
+ "**G..h.+",
+ "**V.h..|",
+ "**VFFFF|",
+ "**|----|"
+ ],
+ "terrain": {
+ "d": "t_carpet_purple",
+ "x": "t_carpet_purple",
+ "h": "t_carpet_purple",
+ "F": "t_carpet_purple",
+ ".": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "place_vehicles": [ { "vehicle": "swivel_chair", "x": [ 3, 5 ], "y": [ 1, 2 ], "rotation": 90, "chance": 75, "repeat": [ 1, 2 ] } ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_eating_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**VCSoe|",
+ "**VCiii|",
+ "**G::tM|",
+ "**G::tM|",
+ "**Vtt:a|",
+ "**VMM89|",
+ "**|----|"
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**Vdddx|",
+ "**Vd.h.|",
+ "**G...F|",
+ "**G....|",
+ "**V.h.d|",
+ "**Vxddd|",
+ "**|----|"
+ ],
+ "terrain": {
+ ".": "t_carpet_purple",
+ "h": "t_carpet_purple",
+ "x": "t_carpet_purple",
+ "d": "t_carpet_purple",
+ "F": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**Vdccx|",
+ "**Vd:h:|",
+ "**G:::F|",
+ "**G::::|",
+ "**V:h:d|",
+ "**Vxccd|",
+ "**|----|"
+ ],
+ "terrain": { ":": "t_carpet_red", "h": "t_carpet_red", "x": "t_carpet_red", "d": "t_carpet_red", "F": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**Vdccx|",
+ "**Vd:h:|",
+ "**G:::F|",
+ "**G::::|",
+ "**V:h:d|",
+ "**Vxccd|",
+ "**|----|"
+ ],
+ "terrain": { ":": "t_carpet_green", "h": "t_carpet_green", "x": "t_carpet_green", "d": "t_carpet_green", "F": "t_carpet_green" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**Vdccx|",
+ "**Vd:h:|",
+ "**G:::F|",
+ "**G::::|",
+ "**V:h:d|",
+ "**Vxccd|",
+ "**|----|"
+ ],
+ "terrain": {
+ ":": "t_carpet_yellow",
+ "h": "t_carpet_yellow",
+ "x": "t_carpet_yellow",
+ "d": "t_carpet_yellow",
+ "F": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_meeting_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V^..B|",
+ "**V....+",
+ "**GMnnM|",
+ "**GMnnM|",
+ "**VMnnM|",
+ "**V....|",
+ "**|----|"
+ ],
+ "terrain": {
+ "M": "t_carpet_yellow",
+ "n": "t_carpet_yellow",
+ ".": "t_carpet_yellow",
+ "^": "t_carpet_yellow",
+ "B": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_meeting_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V^..B|",
+ "**V....+",
+ "**GMnnM|",
+ "**GMnnM|",
+ "**VMnnM|",
+ "**V....|",
+ "**|----|"
+ ],
+ "terrain": { "M": "t_carpet_red", "n": "t_carpet_red", ".": "t_carpet_red", "^": "t_carpet_red", "B": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_meeting_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V^..B|",
+ "**V....+",
+ "**GMnnM|",
+ "**GMnnM|",
+ "**VMnnM|",
+ "**V....|",
+ "**|----|"
+ ],
+ "terrain": { "M": "t_carpet_green", "n": "t_carpet_green", ".": "t_carpet_green", "^": "t_carpet_green", "B": "t_carpet_green" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_meeting_al",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|HHH-|",
+ "**V^..B|",
+ "**V....+",
+ "**GMnnM|",
+ "**GMnnM|",
+ "**VMnnM|",
+ "**V....|",
+ "**|----|"
+ ],
+ "terrain": {
+ "M": "t_carpet_purple",
+ "n": "t_carpet_purple",
+ ".": "t_carpet_purple",
+ "^": "t_carpet_purple",
+ "B": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "FdddxV**",
+ ".d.h.V**",
+ ".....G**",
+ ".....G**",
+ "..h.dV**",
+ "FxdddV**",
+ "-----|**"
+ ],
+ "terrain": {
+ ".": "t_carpet_purple",
+ "x": "t_carpet_purple",
+ "h": "t_carpet_purple",
+ "d": "t_carpet_purple",
+ "F": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "FdddxV**",
+ ".d.h.V**",
+ ".....G**",
+ ".....G**",
+ "..h.dV**",
+ "FxdddV**",
+ "-----|**"
+ ],
+ "terrain": { ".": "t_carpet_green", "x": "t_carpet_green", "h": "t_carpet_green", "d": "t_carpet_green", "F": "t_carpet_green" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "FdddxV**",
+ ".d.h.V**",
+ ".....G**",
+ ".....G**",
+ "..h.dV**",
+ "FxdddV**",
+ "-----|**"
+ ],
+ "terrain": { ".": "t_carpet_red", "x": "t_carpet_red", "h": "t_carpet_red", "d": "t_carpet_red", "F": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_office_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "FdddxV**",
+ ".d.h.V**",
+ ".....G**",
+ ".....G**",
+ "..h.dV**",
+ "FxdddV**",
+ "-----|**"
+ ],
+ "terrain": {
+ ".": "t_carpet_yellow",
+ "x": "t_carpet_yellow",
+ "h": "t_carpet_yellow",
+ "d": "t_carpet_yellow",
+ "F": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_boss_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "..M.dV**",
+ ".xdddV**",
+ ".h...G**",
+ "...h.G**",
+ ".....V**",
+ "^FFF^V**",
+ "-----|**"
+ ],
+ "terrain": { ".": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_sofas_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "^???.V**",
+ "....MV**",
+ "..n..G**",
+ ".....G**",
+ "....MV**",
+ "^???.V**",
+ "-----|**"
+ ],
+ "terrain": {
+ "M": "t_carpet_purple",
+ "n": "t_carpet_purple",
+ ".": "t_carpet_purple",
+ "^": "t_carpet_purple",
+ "?": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_sofas_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "^???.V**",
+ "....MV**",
+ "..n..G**",
+ ".....G**",
+ "....MV**",
+ "^???.V**",
+ "-----|**"
+ ],
+ "terrain": {
+ "M": "t_carpet_purple",
+ "n": "t_carpet_purple",
+ ".": "t_carpet_purple",
+ "^": "t_carpet_purple",
+ "?": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_sofas_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "^???.V**",
+ "....MV**",
+ "..n..G**",
+ ".....G**",
+ "....MV**",
+ "^???.V**",
+ "-----|**"
+ ],
+ "terrain": { "M": "t_carpet_green", "n": "t_carpet_green", ".": "t_carpet_green", "^": "t_carpet_green", "?": "t_carpet_green" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_sofas_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "^???.V**",
+ "....MV**",
+ "..n..G**",
+ ".....G**",
+ "....MV**",
+ "^???.V**",
+ "-----|**"
+ ],
+ "terrain": { "M": "t_carpet_red", "n": "t_carpet_red", ".": "t_carpet_red", "^": "t_carpet_red", "?": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_files_ar",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "--HHH|**",
+ "FFFF^|**",
+ ".....|**",
+ "cccc.+**",
+ "cccc.+**",
+ ".....|**",
+ "FFFF^|**",
+ "-----|**"
+ ],
+ "terrain": { ".": "t_linoleum_gray", "c": "t_linoleum_gray", "F": "t_linoleum_gray" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_4x4_cr1_r",
+ "object": {
+ "mapgensize": [ 4, 4 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "M..^",
+ ".d..",
+ "xd..",
+ "...."
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_4x4_cr2_r",
+ "object": {
+ "mapgensize": [ 4, 4 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "F...",
+ "M.x.",
+ "ddd.",
+ "...."
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_4x4_cr3_r",
+ "object": {
+ "mapgensize": [ 4, 4 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "ccx^",
+ "M...",
+ "ddd.",
+ "...."
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_4x4_cr1_l",
+ "object": {
+ "mapgensize": [ 4, 4 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "^d.F",
+ ".d..",
+ ".xcc",
+ "...."
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_4x4_cr2_l",
+ "object": {
+ "mapgensize": [ 4, 4 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "^..F",
+ ".d..",
+ ".dcc",
+ "...."
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_4x4_cr3_l",
+ "object": {
+ "mapgensize": [ 4, 4 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "^FFF",
+ "....",
+ ".acc",
+ "...."
+ ],
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|^....",
+ "**H.....",
+ "**HB.MMM",
+ "**G..nnn",
+ "**G..nnn",
+ "**HB.MMM",
+ "**H.....",
+ "**|^...."
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "B": "t_linoleum_white",
+ "M": "t_carpet_green",
+ "n": "t_carpet_green"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|^....",
+ "**H.....",
+ "**HB.MMM",
+ "**G..nnn",
+ "**G..nnn",
+ "**HB.MMM",
+ "**H.....",
+ "**|^...."
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "B": "t_linoleum_white",
+ "M": "t_carpet_purple",
+ "n": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|^....",
+ "**H.....",
+ "**HB.MMM",
+ "**G..nnn",
+ "**G..nnn",
+ "**HB.MMM",
+ "**H.....",
+ "**|^...."
+ ],
+ "terrain": { ".": "t_linoleum_white", "^": "t_linoleum_white", "B": "t_linoleum_white", "M": "t_carpet_red", "n": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|^....",
+ "**H.....",
+ "**HB.MMM",
+ "**G..nnn",
+ "**G..nnn",
+ "**HB.MMM",
+ "**H.....",
+ "**|^...."
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "B": "t_linoleum_white",
+ "M": "t_carpet_yellow",
+ "n": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr2_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|^....",
+ "**|.....",
+ "**|..c..",
+ "**|.hc..",
+ "**+..c..",
+ "**|B.c..",
+ "**|.....",
+ "**|....."
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "c": "t_linoleum_white",
+ "B": "t_linoleum_white",
+ "h": "t_linoleum_white"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|.B...",
+ "**H.....",
+ "**G.¢MM¢",
+ "**H.MnnM",
+ "**H.MnnM",
+ "**G.MnnM",
+ "**H.¢MM¢",
+ "**|^...."
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "B": "t_linoleum_white",
+ "M": "t_carpet_yellow",
+ "n": "t_carpet_yellow",
+ "¢": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|.B...",
+ "**H.....",
+ "**G.¢MM¢",
+ "**H.MnnM",
+ "**H.MnnM",
+ "**G.MnnM",
+ "**H.¢MM¢",
+ "**|^...."
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "B": "t_linoleum_white",
+ "M": "t_carpet_green",
+ "n": "t_carpet_green",
+ "¢": "t_carpet_green"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|.B...",
+ "**H.....",
+ "**G.¢MM¢",
+ "**H.MnnM",
+ "**H.MnnM",
+ "**G.MnnM",
+ "**H.¢MM¢",
+ "**|^...."
+ ],
+ "terrain": { ".": "t_linoleum_white", "M": "t_carpet_red", "n": "t_carpet_red", "¢": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_l",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "**|.B...",
+ "**H.....",
+ "**G.¢MM¢",
+ "**H.MnnM",
+ "**H.MnnM",
+ "**G.MnnM",
+ "**H.¢MM¢",
+ "**|^...."
+ ],
+ "terrain": { ".": "t_linoleum_white", "M": "t_carpet_purple", "n": "t_carpet_purple", "¢": "t_carpet_purple" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....Y|**",
+ ".....H**",
+ "MMM..H**",
+ "nnn..G**",
+ "nnn..G**",
+ "MMM..H**",
+ ".....H**",
+ "...FF|**"
+ ],
+ "terrain": { ".": "t_linoleum_white", "F": "t_linoleum_white", "Y": "t_linoleum_white", "M": "t_carpet_red", "n": "t_carpet_red" },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....Y|**",
+ ".....H**",
+ "MMM..H**",
+ "nnn..G**",
+ "nnn..G**",
+ "MMM..H**",
+ ".....H**",
+ "...FF|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "M": "t_carpet_purple",
+ "n": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....Y|**",
+ ".....H**",
+ "MMM..H**",
+ "nnn..G**",
+ "nnn..G**",
+ "MMM..H**",
+ ".....H**",
+ "...FF|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "M": "t_carpet_green",
+ "n": "t_carpet_green"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr1_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....Y|**",
+ ".....H**",
+ "MMM..H**",
+ "nnn..G**",
+ "nnn..G**",
+ "MMM..H**",
+ ".....H**",
+ "...FF|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "M": "t_carpet_yellow",
+ "n": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr2_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....^|**",
+ ".....|**",
+ "MMM.c|**",
+ "nnn.c|**",
+ "nnn.c|**",
+ "MMM.c|**",
+ ".....|**",
+ ".Y..a|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "a": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "M": "t_carpet_yellow",
+ "n": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....^|**",
+ "¢nn¢.H**",
+ "MnnM.H**",
+ "MnnM.G**",
+ "MnnM.G**",
+ "MnnM.H**",
+ "¢nn¢.H**",
+ "....Y|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "M": "t_carpet_yellow",
+ "n": "t_carpet_yellow",
+ "¢": "t_carpet_yellow"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....^|**",
+ "¢nn¢.H**",
+ "MnnM.H**",
+ "MnnM.G**",
+ "MnnM.G**",
+ "MnnM.H**",
+ "¢nn¢.H**",
+ "....Y|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "M": "t_carpet_green",
+ "n": "t_carpet_green",
+ "¢": "t_carpet_green"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....^|**",
+ "¢nn¢.H**",
+ "MnnM.H**",
+ "MnnM.G**",
+ "MnnM.G**",
+ "MnnM.H**",
+ "¢nn¢.H**",
+ "....Y|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "M": "t_carpet_red",
+ "n": "t_carpet_red",
+ "¢": "t_carpet_red"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr3_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....^|**",
+ "¢nn¢.H**",
+ "MnnM.H**",
+ "MnnM.G**",
+ "MnnM.G**",
+ "MnnM.H**",
+ "¢nn¢.H**",
+ "....Y|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "^": "t_linoleum_white",
+ "M": "t_carpet_purple",
+ "n": "t_carpet_purple",
+ "¢": "t_carpet_purple"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "skyscraper_8x8_mr4_r",
+ "object": {
+ "mapgensize": [ 8, 8 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "....^|**",
+ ".....H**",
+ ".h.h.H**",
+ ".h.h.G**",
+ ".h.h.G**",
+ ".h.h.H**",
+ ".....H**",
+ "FFF.Y|**"
+ ],
+ "terrain": {
+ ".": "t_linoleum_white",
+ "h": "t_linoleum_white",
+ "Y": "t_linoleum_white",
+ "F": "t_linoleum_white",
+ "^": "t_linoleum_white"
+ },
+ "palettes": [ "skyscraper_office_palette" ],
+ "flags": [ "ALLOW_TERRAIN_UNDER_OTHER_DATA" ]
+ }
+ }
+]
diff --git a/data/json/mapgen/office_skyscraper.json b/data/json/mapgen/office_skyscraper.json
new file mode 100644
index 0000000000000..d092117d99702
--- /dev/null
+++ b/data/json/mapgen/office_skyscraper.json
@@ -0,0 +1,812 @@
+[
+ {
+ "type": "mapgen",
+ "om_terrain": [ [ "office_skyscraper_1", "office_skyscraper_2" ], [ "office_skyscraper_3", "office_skyscraper_4" ] ],
+ "method": "json",
+ "weight": 250,
+ "object": {
+ "fill_ter": "t_soil",
+ "rows": [
+ " ",
+ " ",
+ " ########################################## ",
+ " #,_____,_____,_____,'',_____,_____,_____,# ",
+ " #,_____,_____,_____,'',_____,_____,_____,# ",
+ " #,_____,_____,_____,'',_____,_____,_____,# ",
+ " #,_____,_____,_____,'',_____,_____,_____,# ",
+ " #,_____,_____,_____,'',_____,_____,_____,# ",
+ " #,_____,_____,_____,'',_____,_____,_____,# ",
+ " #________________________________________# ",
+ " #________________________________________# ",
+ " #________________________________________# ",
+ " #________________________________________# ",
+ " #________________________________________# ",
+ " #________________________________________# ",
+ " #___,,___,____,____,'',____,____,________# ",
+ " #__,,,,__,____,____,'',____,____,________# ",
+ " #___,,___,____,____,'',____,____,________# ",
+ " #___,,___,____,____,'',____,____,________# ",
+ " #________,____,____,'',____,____,________# ",
+ " #________,____,____,'',____,____,________# ",
+ " #________#########HHGGHH#########________# ",
+ " #________#R<|EEE|::~~::|xEE|>R<|........|%ss",
+ "ss%|!-------|'R'|EEED::~~::DEEE|'R'|........|%ss",
+ "ss%|........|'''|EEED::~~::DEEE|'''|........|%ss",
+ "ss%|........|'''|EEx|::~~::|EEE|'''|........|%ss",
+ "ss%|........|-+-|---|^:~~:^|---|-+-|........|%ss",
+ "ss%|........|::::::::::~~::::::::::|........|%ss",
+ "ss%|........|::::::::::~~::::::::::|........|%ss",
+ "ss%|........|-------|^:~~:^|-------|........|%ss",
+ "ss%|........|.......|::~~::|.......|........|%ss",
+ "ss%|........|.......+::~~::+.......|........|%ss",
+ "ss%|........|.......|::~~::|.......|........|%ss",
+ "ss%|----------------|8:~~::|----------------|%ss",
+ "ss%|################|^:~~::|................|%ss",
+ "ss%|#±±±±±±##±±±±±±#|b:~~::|................|%ss",
+ "ss%|#ŦŦŦŦŦŦ##ŦŦŦŦŦŦ#|b:~~::|................|%ss",
+ "ss%|#______##______#|^:~~::|................|%ss",
+ "ss%|#__,,__##__,,__#|9:~~::|................|%ss",
+ "ss%|#_,,,,_##__,,__#|::~~::|................|%ss",
+ "ss%|#__,,__##_,,,,_#|::~~::|................|%ss",
+ "ss%|#__,,__##__,,__#|::::::|................|%ss",
+ "ss%|#______##______#|^::::^|................|%ss",
+ "ss%|#__,,__##__,,__#|HHGGHH|----------------|%ss",
+ "ss%I _,,,,_ss__,,__ IssssssI%%%%%%%%%%%%%%%%%Iss",
+ "ss __,,__ss_,,,,_ ssssss ss",
+ "sssss__,,__ss__,,__sssssssssssssssssssssssssssss",
+ "sssss______ss______sssssssssssssssssssssssssssss"
+ ],
+ "place_nested": [
+ { "chunks": [ "skyscraper_shopping_0_toilets_7x7_W" ], "x": 13, "y": 30 },
+ { "chunks": [ "skyscraper_shopping_0_toilets_7x7_E" ], "x": 28, "y": 30 },
+ { "chunks": [ "skyscraper_shopping_0_ul_store_1" ], "x": 0, "y": 0 },
+ { "chunks": [ "skyscraper_shopping_0_ml_upper_store_1" ], "x": 0, "y": 0 },
+ { "chunks": [ "skyscraper_shopping_0_ml_lower_store_1" ], "x": 0, "y": 24 },
+ { "chunks": [ "skyscraper_shopping_0_ur_store_1" ], "x": 24, "y": 0 },
+ { "chunks": [ "skyscraper_shopping_0_mr_upper_store" ], "x": 24, "y": 0 },
+ { "chunks": [ "skyscraper_shopping_0_mr_lower_store" ], "x": 24, "y": 24 },
+ { "chunks": [ "skyscraper_shopping_0_lr_entrance_store" ], "x": 24, "y": 24 }
+ ],
+ "place_monster": [
+ { "group": "GROUP_ZOMBIE", "x": [ 20, 23 ], "y": [ 5, 23 ], "chance": 50, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_ZOMBIE", "x": [ 24, 27 ], "y": [ 5, 23 ], "chance": 50, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_ZOMBIE", "x": [ 20, 23 ], "y": [ 24, 42 ], "chance": 50, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_ZOMBIE", "x": [ 24, 27 ], "y": [ 24, 42 ], "chance": 50, "repeat": [ 6, 12 ] }
+ ],
+ "palettes": [ "skyscraper_shopping_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "om_terrain": [
+ [ "office_skyscraper_apartments_111", "office_skyscraper_apartments_011" ],
+ [ "office_skyscraper_apartments_101", "office_skyscraper_apartments_001" ]
+ ],
+ "weight": 250,
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "///|||||||||||||ww||||WWWW||||ww|||||||||||||///",
+ "///|á.....+r-u+²....|^....^|³....+u-r+..ä...|///",
+ "///w......-----.....|......|.....-----......w///",
+ "///w......-STb-.....|..~~..|.....-bTS-......w///",
+ "///|......+iib-.....|..~~..|.....-bii+......|///",
+ "///|||||+|--+--.....|..~~..|.....--+--|+|||||///",
+ "///|hh..............|..~~..|..............hh|///",
+ "///wLL..............D..~~..D..............LLw///",
+ "///|BBB..~~~.µ......|p.~~.p|.._.....~~~..BBB|///",
+ "///||||..~~~.......B|..~~..|B.......~~~..||||///",
+ "///R,,+..~~~.......B|..~~..|B.......~~~..+,,R///",
+ "///R,,|..~~~.......B|..~~..|B.......~~~..|,,R///",
+ "///R,,w..~~~.......B|..~~..|B.......~~~..w,,R///",
+ "///R,,w.............|..~~..|.............w,,R///",
+ "///R,,|....-é....-+-|..~~..|-+-é....-....|,,R///",
+ "///R,,|....-.....-.U|..~~..|U.-.....-....|,,R///",
+ "///R,,w....-.....-YU|..~~..|UY-.....-....w,,R///",
+ "///R,,wÓ...||||||||||^.~~.^||||||||||.ó..w,,R///",
+ "///R,,|....||<*>|EEE|..~~..|xEE|<*>||....|,,R///",
+ "///R,Q|....||,*,|EEE=..~~..=EEE|,*,||....|Q,R///",
+ "///||||||||||,,,|EEE=..~~..=EEE|,,,||||||||||///",
+ "///|á.....+r|,,,|EEx|..~~..|EEE|,,,|r+..ä...|///",
+ "///w......--||+||||||^.~~.^||||||+||--......w///",
+ "///w......+i|..........~~..........|i+......w///",
+ "///|......-i|||||||||^.~~.^|||||||||i-......|///",
+ "///||||||+-iiT-²....|..~~..|³....-Tii-+||||||///",
+ "///|u.+...-iiS-.....|..~~..|.....-Sii-...+.u|///",
+ "///||||...-ibb-.....|..~~..|.....-bbi-...||||///",
+ "///|hh....-+---.....|..~~..|.....---+-....hh|///",
+ "///wLL..............|p.~~.p|..............LLw///",
+ "///|BBB..~~~.µ......D..~~..D.._.....~~~..BBB|///",
+ "///||||..~~~.......B|..~~..|B.......~~~..||||///",
+ "///R,,+..~~~.......B|..~~..|B.......~~~..+,,R///",
+ "///R,,|..~~~.......B|..~~..|B.......~~~..|,,R///",
+ "///R,,w..~~~.......B|..~~..|B.......~~~..w,,R///",
+ "///R,,w.............|..~~..|.............w,,R///",
+ "///R,,wÓ...-é....-+-|..~~..|-+-é....-.ó..w,,R///",
+ "///R,,|....-.....-.U|......|U.-.....-....|,,R///",
+ "///R,Q|....-.....-YU|^....^|UY-.....-....|Q,R///",
+ "///|RR||ww|||ww|||||||WWWW|||||||ww|||ww||RR|///",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////"
+ ],
+ "place_monster": [
+ { "group": "GROUP_VANILLA", "x": [ 5, 23 ], "y": [ 5, 23 ], "chance": 80, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_VANILLA", "x": [ 24, 42 ], "y": [ 5, 23 ], "chance": 80, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_VANILLA", "x": [ 5, 23 ], "y": [ 24, 42 ], "chance": 80, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_VANILLA", "x": [ 24, 42 ], "y": [ 24, 42 ], "chance": 80, "repeat": [ 6, 12 ] }
+ ],
+ "palettes": [ "skyscraper_apartment_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "method": "json",
+ "om_terrain": [
+ [ "office_skyscraper_apartments_112", "office_skyscraper_apartments_012" ],
+ [ "office_skyscraper_apartments_102", "office_skyscraper_apartments_002" ]
+ ],
+ "weight": 250,
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "///|||||||||||||ww||||WWWW||||ww|||||||||||||///",
+ "///|á.....+r-u+²....|^....^|³....+u-r+..ä...|///",
+ "///w......-----.....|......|.....-----......w///",
+ "///w......-STb-.....|..~~..|.....-bTS-......w///",
+ "///|......+iib-.....|..~~..|.....-bii+......|///",
+ "///|||||+|--+--.....|..~~..|.....--+--|+|||||///",
+ "///|hh..............|..~~..|..............hh|///",
+ "///wLL..............D..~~..D..............LLw///",
+ "///|BBB..~~~.µ......|p.~~.p|.._.....~~~..BBB|///",
+ "///||||..~~~.......B|..~~..|B.......~~~..||||///",
+ "///R,,+..~~~.......B|..~~..|B.......~~~..+,,R///",
+ "///R,,|..~~~.......B|..~~..|B.......~~~..|,,R///",
+ "///R,,w..~~~.......B|..~~..|B.......~~~..w,,R///",
+ "///R,,w.............|..~~..|.............w,,R///",
+ "///R,,|....-é....-+-|..~~..|-+-é....-....|,,R///",
+ "///R,,|....-.....-.U|..~~..|U.-.....-....|,,R///",
+ "///R,,w....-.....-YU|..~~..|UY-.....-....w,,R///",
+ "///R,,wÓ...||||||||||^.~~.^||||||||||.ó..w,,R///",
+ "///R,,|....||>*<|EEE|..~~..|xEE|>*<||....|,,R///",
+ "///R,Q|....||,*,|EEE=..~~..=EEE|,*,||....|Q,R///",
+ "///||||||||||,,,|EEE=..~~..=EEE|,,,||||||||||///",
+ "///|á.....+r|,,,|EEx|..~~..|EEE|,,,|r+..ä...|///",
+ "///w......--||+||||||^.~~.^||||||+||--......w///",
+ "///w......+i|..........~~..........|i+......w///",
+ "///|......-i|||||||||^.~~.^|||||||||i-......|///",
+ "///||||||+-iiT-²....|..~~..|³....-Tii-+||||||///",
+ "///|u.+...-iiS-.....|..~~..|.....-Sii-...+.u|///",
+ "///||||...-ibb-.....|..~~..|.....-bbi-...||||///",
+ "///|hh....-+---.....|..~~..|.....---+-....hh|///",
+ "///wLL..............|p.~~.p|..............LLw///",
+ "///|BBB..~~~.µ......D..~~..D.._.....~~~..BBB|///",
+ "///||||..~~~.......B|..~~..|B.......~~~..||||///",
+ "///R,,+..~~~.......B|..~~..|B.......~~~..+,,R///",
+ "///R,,|..~~~.......B|..~~..|B.......~~~..|,,R///",
+ "///R,,w..~~~.......B|..~~..|B.......~~~..w,,R///",
+ "///R,,w.............|..~~..|.............w,,R///",
+ "///R,,wÓ...-é....-+-|..~~..|-+-é....-.ó..w,,R///",
+ "///R,,|....-.....-.U|......|U.-.....-....|,,R///",
+ "///R,Q|....-.....-YU|^....^|UY-.....-....|Q,R///",
+ "///|RR||ww|||ww|||||||WWWW|||||||ww|||ww||RR|///",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////"
+ ],
+ "place_monster": [
+ { "group": "GROUP_VANILLA", "x": [ 5, 23 ], "y": [ 5, 23 ], "chance": 80, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_VANILLA", "x": [ 24, 42 ], "y": [ 5, 23 ], "chance": 80, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_VANILLA", "x": [ 5, 23 ], "y": [ 24, 42 ], "chance": 80, "repeat": [ 6, 12 ] },
+ { "group": "GROUP_VANILLA", "x": [ 24, 42 ], "y": [ 24, 42 ], "chance": 80, "repeat": [ 6, 12 ] }
+ ],
+ "palettes": [ "skyscraper_apartment_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "om_terrain": [ [ "office_skyscraper_9", "office_skyscraper_10" ], [ "office_skyscraper_11", "office_skyscraper_12" ] ],
+ "method": "json",
+ "weight": 250,
+ "object": {
+ "fill_ter": "t_linoleum_white",
+ "rows": [
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "///|-HHH-HHH-HHH--|HHH-|--HHH|--HHH-HHH-HHH-|///",
+ "///|::::::::::::::::::::::::::::::::::::::::|///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///|::::::::::::::::::::::::::::::::::::::::|///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::|----|-----|::::::::::::::V///",
+ "///V::::::::::::::|..........|::::::::::::::V///",
+ "///|::::::::::::::|..........|::::::::::::::|///",
+ "///V::::::::::::::H..........H::::::::::::::V///",
+ "///V::::::::::::::G..........G::::::::::::::V///",
+ "///V::::::::::::::H..........H::::::::::::::V///",
+ "///|::::::::|--|-|-|^......^|-|-|--|::::::::|///",
+ "///|::::::::|SS|T|T|^......^|T|T|SS|::::::::|///",
+ "///|----|:::+ii|+|+|^......^|+|+|ii+:::|----|///",
+ "///|rrrr|:::|iiiiii|^......^|iiiiii|:::|rrrr|///",
+ "///|''''+:::|---|--||......||--|---|:::+''''|///",
+ "///|rrrr|:::||EEE|......|xEE||:::|rrrr|///",
+ "///|----|:::|'R'|EEED......DEEE|'R'|:::|----|///",
+ "///|::::::::|'''|EEED......DEEE|'''|::::::::|///",
+ "///|::::::::+'''|EEx|......|EEE|'''+::::::::|///",
+ "///|::::::::|---|-|-|......|-|-|---|::::::::|///",
+ "///V::::::::::::::|^........^|:::::|::::::::V///",
+ "///V::::::::::::::|^........^|:::::|::::::::V///",
+ "///V::::::::::::::|^........^|:::::|::::::::V///",
+ "///|::::::::::::::|-HHHGGHHH-|:::::|::::::::|///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V:::::::::::::::a::::::::::::::::::::::::V///",
+ "///|::::::::::::::|-HHHGGHHH-|::::::::::::::|///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///|::::::::::::::::::::::::::::::::::::::::|///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///|::::::::::::::::::::::::::::::::::::::::|///",
+ "///|-HHH-HHHH-HHH-|-HHHHHHHH-|-HHH-HHHH-HHH-|///",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////"
+ ],
+ "terrain": { "a": "t_linoleum_gray" },
+ "place_nested": [
+ {
+ "chunks": [ [ "skyscraper_4x4_cr1_l", 20 ], [ "skyscraper_4x4_cr2_l", 20 ], [ "skyscraper_4x4_cr3_l", 20 ] ],
+ "x": [ 20, 20 ],
+ "y": [ 12, 12 ]
+ },
+ {
+ "chunks": [ [ "skyscraper_4x4_cr1_r", 20 ], [ "skyscraper_4x4_cr2_r", 20 ], [ "skyscraper_4x4_cr3_r", 20 ] ],
+ "x": [ 24, 24 ],
+ "y": [ 12, 12 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_5x5_toilet_il", 20 ],
+ [ "skyscraper_5x5_storage1_il", 10 ],
+ [ "skyscraper_5x5_storage2_il", 10 ],
+ [ "skyscraper_5x5_storage3_il", 10 ],
+ [ "skyscraper_5x5_cleaning1_il", 20 ],
+ [ "skyscraper_5x5_cleaning2_il", 20 ]
+ ],
+ "x": [ 4, 4 ],
+ "y": [ 24, 24 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_office_slide_dl", 20 ],
+ [ "skyscraper_office_glass_dl", 20 ],
+ [ "skyscraper_private_dl", 20 ],
+ [ "skyscraper_crowded_dl", 20 ],
+ [ "skyscraper_generic_dl", 20 ]
+ ],
+ "x": [ 2, 2 ],
+ "y": [ 31, 31 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_small1_ul", 20 ],
+ [ "skyscraper_small_office_ul", 20 ],
+ [ "skyscraper_small_sofa_ul", 20 ],
+ [ "skyscraper_small2_ul", 20 ]
+ ],
+ "x": [ 4, 4 ],
+ "y": [ 27, 27 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_small1_ul", 20 ],
+ [ "skyscraper_small_office_ul", 20 ],
+ [ "skyscraper_small_sofa_ul", 20 ],
+ [ "skyscraper_small2_ul", 20 ]
+ ],
+ "x": [ 30, 30 ],
+ "y": [ 27, 27 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_6x6_office_ur", 20 ],
+ [ "skyscraper_6x6_glass_ur", 20 ],
+ [ "skyscraper_6x6_computer_ur", 5 ],
+ [ "skyscraper_6x6_files_ur", 5 ]
+ ],
+ "x": [ 12, 12 ],
+ "y": [ 27, 27 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_office_slide_dr", 20 ],
+ [ "skyscraper_office_glass_dr", 20 ],
+ [ "skyscraper_boss_cafe_dr", 20 ],
+ [ "skyscraper_office_dr", 20 ],
+ [ "skyscraper_office_private_dr", 20 ],
+ [ "skyscraper_office_crowded_dr", 20 ]
+ ],
+ "x": [ 30, 30 ],
+ "y": [ 31, 31 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_5x5_toilet_ir", 20 ],
+ [ "skyscraper_5x5_storage1_ir", 10 ],
+ [ "skyscraper_5x5_storage2_ir", 10 ],
+ [ "skyscraper_5x5_storage3_ir", 10 ],
+ [ "skyscraper_5x5_cleaning1_ir", 20 ],
+ [ "skyscraper_5x5_cleaning2_ir", 20 ]
+ ],
+ "x": [ 39, 39 ],
+ "y": [ 24, 24 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_5x5_register_ur", 20 ],
+ [ "skyscraper_5x5_office_ur", 20 ],
+ [ "skyscraper_5x5_benches_ur", 10 ],
+ [ "skyscraper_5x5_sofa_ur", 10 ]
+ ],
+ "x": [ 39, 39 ],
+ "y": [ 27, 27 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_office_glass_al", 20 ],
+ [ "skyscraper_office_private_al", 20 ],
+ [ "skyscraper_office_al", 20 ],
+ [ "skyscraper_office_slide_al", 20 ],
+ [ "skyscraper_office_crowded_al", 20 ]
+ ],
+ "x": [ 2, 2 ],
+ "y": [ 1, 1 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_5x5_register_ol", 20 ],
+ [ "skyscraper_5x5_office1_ol", 10 ],
+ [ "skyscraper_5x5_office2_ol", 10 ],
+ [ "skyscraper_5x5_sofas_ol", 20 ]
+ ],
+ "x": [ 4, 4 ],
+ "y": [ 14, 14 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_office_glass_ar", 20 ],
+ [ "skyscraper_office_private_ar", 20 ],
+ [ "skyscraper_office_ar", 20 ],
+ [ "skyscraper_office_slide_ar", 20 ],
+ [ "skyscraper_office_crowded_ar", 20 ]
+ ],
+ "x": [ 30, 30 ],
+ "y": [ 1, 1 ]
+ },
+ {
+ "chunks": [ [ "skyscraper_5x5_register_or", 20 ], [ "skyscraper_5x5_office_or", 20 ], [ "skyscraper_5x5_sofas_or", 20 ] ],
+ "x": [ 39, 39 ],
+ "y": [ 14, 14 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_8x8_boss_al", 20 ],
+ [ "skyscraper_8x8_meeting_al", 20 ],
+ [ "skyscraper_8x8_office_al", 20 ],
+ [ "skyscraper_8x8_eating_al", 20 ]
+ ],
+ "x": [ 16, 16 ],
+ "y": [ 4, 4 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_8x8_boss_ar", 20 ],
+ [ "skyscraper_8x8_sofas_ar", 20 ],
+ [ "skyscraper_8x8_office_ar", 20 ],
+ [ "skyscraper_8x8_files_ar", 20 ]
+ ],
+ "x": [ 24, 24 ],
+ "y": [ 4, 4 ]
+ },
+ {
+ "chunks": [ [ "skyscraper_8x8_mr1_l", 20 ], [ "skyscraper_8x8_mr2_l", 20 ], [ "skyscraper_8x8_mr3_l", 20 ] ],
+ "x": [ 16, 16 ],
+ "y": [ 35, 35 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_8x8_mr1_r", 20 ],
+ [ "skyscraper_8x8_mr2_r", 20 ],
+ [ "skyscraper_8x8_mr3_r", 20 ],
+ [ "skyscraper_8x8_mr4_r", 20 ]
+ ],
+ "x": [ 24, 24 ],
+ "y": [ 35, 35 ]
+ }
+ ],
+ "place_monster": [
+ { "group": "GROUP_ZOMBIE", "x": [ 5, 23 ], "y": [ 6, 23 ], "chance": 80, "repeat": [ 10, 20 ] },
+ { "group": "GROUP_ZOMBIE", "x": [ 24, 43 ], "y": [ 6, 23 ], "chance": 80, "repeat": [ 10, 20 ] },
+ { "group": "GROUP_ZOMBIE", "x": [ 5, 23 ], "y": [ 24, 42 ], "chance": 80, "repeat": [ 10, 20 ] },
+ { "group": "GROUP_ZOMBIE", "x": [ 24, 43 ], "y": [ 24, 42 ], "chance": 80, "repeat": [ 10, 20 ] }
+ ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "om_terrain": [ [ "office_skyscraper_9b", "office_skyscraper_10b" ] ],
+ "method": "json",
+ "weight": 250,
+ "object": {
+ "fill_ter": "t_floor",
+ "rows": [
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "////////////////////////////////////////////////",
+ "///|-HHH-HHH-HHH--|HHH-|--HHH|--HHH-HHH-HHH-|///",
+ "///|::::::::::::::::::::::::::::::::::::::::|///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///|::::::::::::::::::::::::::::::::::::::::|///",
+ "///V::::::::::::::::::::::::::::::::::::::::V///",
+ "///V::::::::::::::|----|-----|::::::::::::::V///",
+ "///V::::::::::::::|..........|::::::::::::::V///",
+ "///|::::::::::::::|..........|::::::::::::::|///",
+ "///V::::::::::::::H..........H::::::::::::::V///",
+ "///V::::::::::::::G..........G::::::::::::::V///",
+ "///V::::::::::::::H..........H::::::::::::::V///",
+ "///|::::::::|--|-|-|^......^|-|-|--|::::::::|///",
+ "///|::::::::|SS|T|T|^......^|T|T|SS|::::::::|///",
+ "///|----|:::+ii|+|+|^......^|+|+|ii+:::|----|///",
+ "///|rrrr|:::|iiiiii|^......^|iiiiii|:::|rrrr|///",
+ "///|''''+:::|---|--||......||--|---|:::+''''|///",
+ "///|rrrr|:::|>R<|EEE|......|xEE|>R<|:::|rrrr|///",
+ "///|----|:::|'R'|EEED......DEEE|'R'|:::|----|///"
+ ],
+ "place_nested": [
+ {
+ "chunks": [ [ "skyscraper_4x4_cr1_l", 20 ], [ "skyscraper_4x4_cr2_l", 20 ], [ "skyscraper_4x4_cr3_l", 20 ] ],
+ "x": [ 20, 20 ],
+ "y": [ 12, 12 ]
+ },
+ {
+ "chunks": [ [ "skyscraper_4x4_cr1_r", 20 ], [ "skyscraper_4x4_cr2_r", 20 ], [ "skyscraper_4x4_cr3_r", 20 ] ],
+ "x": [ 24, 24 ],
+ "y": [ 12, 12 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_office_glass_al", 20 ],
+ [ "skyscraper_office_private_al", 20 ],
+ [ "skyscraper_office_al", 20 ],
+ [ "skyscraper_office_slide_al", 20 ],
+ [ "skyscraper_office_crowded_al", 20 ]
+ ],
+ "x": [ 2, 2 ],
+ "y": [ 1, 1 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_5x5_register_ol", 20 ],
+ [ "skyscraper_5x5_office1_ol", 10 ],
+ [ "skyscraper_5x5_office2_ol", 10 ],
+ [ "skyscraper_5x5_sofas_ol", 20 ]
+ ],
+ "x": [ 4, 4 ],
+ "y": [ 14, 14 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_office_glass_ar", 20 ],
+ [ "skyscraper_office_private_ar", 20 ],
+ [ "skyscraper_office_ar", 20 ],
+ [ "skyscraper_office_slide_ar", 20 ],
+ [ "skyscraper_office_crowded_ar", 20 ]
+ ],
+ "x": [ 30, 30 ],
+ "y": [ 1, 1 ]
+ },
+ {
+ "chunks": [ [ "skyscraper_5x5_register_or", 20 ], [ "skyscraper_5x5_office_or", 20 ], [ "skyscraper_5x5_sofas_or", 20 ] ],
+ "x": [ 39, 39 ],
+ "y": [ 14, 14 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_8x8_boss_al", 20 ],
+ [ "skyscraper_8x8_meeting_al", 20 ],
+ [ "skyscraper_8x8_office_al", 20 ],
+ [ "skyscraper_8x8_eating_al", 20 ]
+ ],
+ "x": [ 16, 16 ],
+ "y": [ 4, 4 ]
+ },
+ {
+ "chunks": [
+ [ "skyscraper_8x8_boss_ar", 20 ],
+ [ "skyscraper_8x8_sofas_ar", 20 ],
+ [ "skyscraper_8x8_office_ar", 20 ],
+ [ "skyscraper_8x8_files_ar", 20 ]
+ ],
+ "x": [ 24, 24 ],
+ "y": [ 4, 4 ]
+ }
+ ],
+ "place_monster": [
+ { "group": "GROUP_ZOMBIE", "x": [ 5, 23 ], "y": [ 6, 23 ], "chance": 80, "repeat": [ 10, 20 ] },
+ { "group": "GROUP_ZOMBIE", "x": [ 24, 43 ], "y": [ 6, 23 ], "chance": 80, "repeat": [ 10, 20 ] }
+ ],
+ "palettes": [ "skyscraper_office_palette" ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "om_terrain": [ [ "office_skyscraper_13", "office_skyscraper_14" ], [ "office_skyscraper_15", "office_skyscraper_16" ] ],
+ "method": "json",
+ "weight": 250,
+ "object": {
+ "fill_ter": "t_flat_roof",
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " 5----------------------------------------5 ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........#########......#########........- ",
+ " -........#'R>#XXX#......#XXX#'R>#........- ",
+ " -........#'R'#XXX#......#XXX#'R'#........- ",
+ " -........#'''#N''#......#''N#'''#........- ",
+ " -........#'''#N'x#......#x'N#'''#........- ",
+ " -........##+###+##......##+###+##........- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " -........................................- ",
+ " 5----------------------------------------5 ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "palettes": [ "roof_palette" ],
+ "terrain": { "#": "t_concrete_wall", "R": "t_glass_railing", "'": "t_thconc_floor" },
+ "furniture": { "x": "f_console_broken", "X": "f_generator_broken", "N": "f_machinery_heavy" },
+ "place_nested": [
+ { "chunks": [ [ "roof_16x16_help", 10 ], [ "null", 10 ] ], "x": [ 4, 8 ], "y": [ 30, 38 ] },
+ {
+ "chunks": [
+ [ "null", 20 ],
+ [ "roof_4x4_utility_1", 20 ],
+ [ "roof_4x4_utility", 20 ],
+ [ "roof_2x2_utilities", 20 ],
+ [ "roof_2x2_utilities_c", 20 ],
+ [ "roof_2x2_utilities_b", 20 ]
+ ],
+ "x": [ 13, 19 ],
+ "y": [ 6, 15 ]
+ },
+ {
+ "chunks": [
+ [ "null", 20 ],
+ [ "roof_4x4_utility_1", 20 ],
+ [ "roof_4x4_utility", 20 ],
+ [ "roof_2x2_utilities", 20 ],
+ [ "roof_2x2_utilities_c", 20 ],
+ [ "roof_2x2_utilities_b", 20 ]
+ ],
+ "x": [ 24, 40 ],
+ "y": [ 30, 38 ]
+ },
+ {
+ "chunks": [
+ [ "null", 20 ],
+ [ "roof_4x4_utility_1", 20 ],
+ [ "roof_4x4_utility", 20 ],
+ [ "roof_2x2_utilities", 20 ],
+ [ "roof_2x2_utilities_c", 20 ],
+ [ "roof_2x2_utilities_b", 20 ]
+ ],
+ "x": [ 24, 40 ],
+ "y": [ 6, 15 ]
+ }
+ ],
+ "place_monster": [
+ { "group": "GROUP_ROOF_ZOMBIE", "x": [ 5, 23 ], "y": [ 6, 23 ], "chance": 80, "repeat": [ 3, 8 ] },
+ { "group": "GROUP_ROOF_ZOMBIE", "x": [ 5, 23 ], "y": [ 24, 40 ], "chance": 80, "repeat": [ 3, 8 ] },
+ { "group": "GROUP_ROOF_ZOMBIE", "x": [ 24, 40 ], "y": [ 6, 23 ], "chance": 80, "repeat": [ 3, 8 ] },
+ { "group": "GROUP_ROOF_ZOMBIE", "x": [ 24, 40 ], "y": [ 24, 40 ], "chance": 80, "repeat": [ 3, 8 ] }
+ ]
+ }
+ },
+ {
+ "type": "mapgen",
+ "om_terrain": [ [ "office_skyscraper_17", "office_skyscraper_18" ], [ "office_skyscraper_19", "office_skyscraper_20" ] ],
+ "method": "json",
+ "weight": 250,
+ "object": {
+ "fill_ter": "t_flat_roof",
+ "rows": [
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ......... ......... ",
+ " ...:.:... ...X.X... ",
+ " ......... ......... ",
+ " ......... ......... ",
+ " ...:.:... ...X.X... ",
+ " ......... ......... ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " "
+ ],
+ "palettes": [ "roof_palette" ]
+ }
+ }
+]
diff --git a/data/json/mapgen_palettes/office_skyscraper.json b/data/json/mapgen_palettes/office_skyscraper.json
new file mode 100644
index 0000000000000..fd4235ebea266
--- /dev/null
+++ b/data/json/mapgen_palettes/office_skyscraper.json
@@ -0,0 +1,507 @@
+[
+ {
+ "type": "palette",
+ "id": "skyscraper_shopping_palette",
+ "parameters": {
+ "carpet_type": {
+ "type": "ter_str_id",
+ "default": {
+ "distribution": [ [ "t_carpet_yellow", 2 ], [ "t_carpet_green", 2 ], [ "t_carpet_purple", 1 ], [ "t_carpet_red", 2 ] ]
+ }
+ }
+ },
+ "terrain": {
+ "*": "t_null",
+ "~": { "param": "carpet_type", "fallback": "t_floor" },
+ "#": "t_concrete_wall",
+ ">": "t_stairs_down",
+ "<": "t_stairs_up",
+ "'": "t_thconc_floor",
+ ".": "t_floor",
+ ":": "t_floor",
+ " ": "t_region_groundcover_urban",
+ ",": "t_pavement_y",
+ "_": "t_pavement",
+ "%": [ [ "t_region_shrub_decorative", 16 ], [ "t_region_groundcover_forest", 5 ] ],
+ "I": "t_region_tree_shade",
+ "+": "t_door_c",
+ "D": "t_door_metal_c",
+ "!": "t_door_metal_locked",
+ "E": "t_elevator",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass",
+ "R": "t_railing_v",
+ "s": "t_sidewalk",
+ "-": "t_brick_wall",
+ "|": "t_brick_wall",
+ "Ŧ": "t_ramp_down_high",
+ "±": "t_ramp_down_low"
+ },
+ "furniture": { "b": "f_bench", "^": [ "f_indoor_plant", "f_indoor_plant_y" ], "x": "f_console_broken" },
+ "items": { "a": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] } },
+ "vendingmachines": { "8": { "item_group": "vending_drink" }, "9": { "item_group": "vending_food" } },
+ "toilets": { "T": { } }
+ },
+ {
+ "type": "palette",
+ "id": "skyscraper_apartment_palette",
+ "parameters": {
+ "i_wall_type": {
+ "type": "ter_str_id",
+ "default": {
+ "distribution": [
+ [ "t_wall_b", 1 ],
+ [ "t_wall_g", 1 ],
+ [ "t_wall_p", 1 ],
+ [ "t_wall_P", 1 ],
+ [ "t_wall_r", 1 ],
+ [ "t_wall_w", 6 ],
+ [ "t_wall_y", 1 ]
+ ]
+ }
+ },
+ "wall_type": { "type": "ter_str_id", "default": { "distribution": [ [ "t_strconc_wall", 2 ], [ "t_brick_wall", 5 ] ] } },
+ "railing_type": { "type": "ter_str_id", "default": { "distribution": [ [ "t_glass_railing", 4 ], [ "t_concrete_railing", 7 ] ] } },
+ "shrubbery_type": {
+ "type": "ter_str_id",
+ "default": { "distribution": [ [ "t_region_groundcover_urban", 3 ], [ "t_region_shrub_decorative", 2 ] ] }
+ },
+ "carpet_type": {
+ "type": "ter_str_id",
+ "default": {
+ "distribution": [ [ "t_carpet_yellow", 2 ], [ "t_carpet_green", 2 ], [ "t_carpet_purple", 1 ], [ "t_carpet_red", 2 ] ]
+ }
+ },
+ "window_type": { "type": "ter_str_id", "default": { "distribution": [ [ "t_window_domestic", 7 ], [ "t_wall_glass", 1 ] ] } }
+ },
+ "nested": {
+ "á": {
+ "chunks": [
+ [ "bedroom_4x4_adult_1_N", 20 ],
+ [ "bedroom_4x4_adult_1_S", 20 ],
+ [ "bedroom_4x4_adult_2_N", 20 ],
+ [ "bedroom_4x4_adult_2_W", 20 ],
+ [ "bedroom_4x4_adult_2_S", 20 ],
+ [ "bedroom_4x4_adult_3_S", 20 ],
+ [ "bedroom_4x4_adult_3_N", 20 ]
+ ]
+ },
+ "ä": {
+ "chunks": [
+ [ "bedroom_4x4_adult_1_N", 20 ],
+ [ "bedroom_4x4_adult_1_W", 20 ],
+ [ "bedroom_4x4_adult_1_S", 20 ],
+ [ "bedroom_4x4_adult_2_N", 20 ],
+ [ "bedroom_4x4_adult_2_E", 20 ],
+ [ "bedroom_4x4_adult_2_S", 20 ],
+ [ "bedroom_4x4_adult_3_S", 20 ],
+ [ "bedroom_4x4_adult_3_N", 20 ]
+ ]
+ },
+ "Á": {
+ "chunks": [
+ [ "bedroom_4x4_adult_1_N", 20 ],
+ [ "bedroom_4x4_adult_2_N", 20 ],
+ [ "bedroom_4x4_adult_2_W", 20 ],
+ [ "bedroom_4x4_adult_3_N", 20 ],
+ [ "bedroom_4x4_adult_3_W", 20 ],
+ [ "bedroom_5x5_adult_W_1", 20 ]
+ ]
+ },
+ "Ä": {
+ "chunks": [
+ [ "bedroom_4x4_adult_1_N", 20 ],
+ [ "bedroom_4x4_adult_2_N", 20 ],
+ [ "bedroom_4x4_adult_2_E", 20 ],
+ [ "bedroom_4x4_adult_3_N", 20 ],
+ [ "bedroom_4x4_adult_3_E", 20 ]
+ ]
+ },
+ "ő": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1A", 20 ],
+ [ "diningroom_6x6_E_W_1A", 20 ],
+ [ "diningroom_6x6_E_W_2A", 20 ],
+ [ "diningroom_6x6_N_S_2A", 20 ],
+ [ "livingroom_5x5_W_1", 20 ],
+ [ "livingroom_5x5_E_2", 20 ]
+ ]
+ },
+ "ö": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1B", 20 ],
+ [ "diningroom_6x6_E_W_1A", 20 ],
+ [ "diningroom_6x6_E_W_2", 20 ],
+ [ "diningroom_6x6_N_S_2", 20 ],
+ [ "livingroom_5x5_E_1", 20 ],
+ [ "livingroom_5x5_E_2", 20 ]
+ ]
+ },
+ "?": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1A", 20 ],
+ [ "diningroom_6x6_E_W_1A", 20 ],
+ [ "diningroom_6x6_E_W_2A", 20 ],
+ [ "diningroom_6x6_N_S_2A", 20 ]
+ ]
+ },
+ "!": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1B", 20 ],
+ [ "diningroom_6x6_E_W_1A", 20 ],
+ [ "diningroom_6x6_E_W_2", 20 ],
+ [ "diningroom_6x6_N_S_2", 20 ]
+ ]
+ },
+ "$": { "chunks": [ [ "livingroom_5x5_W_1", 20 ], [ "livingroom_5x5_E_2", 20 ] ] },
+ "§": { "chunks": [ [ "livingroom_5x5_E_1", 20 ], [ "livingroom_5x5_E_2", 20 ] ] },
+ "Ő": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1B", 20 ],
+ [ "diningroom_6x6_E_W_1", 20 ],
+ [ "diningroom_6x6_E_W_2A", 20 ],
+ [ "diningroom_6x6_N_S_2A", 20 ],
+ [ "livingroom_5x5_N_1", 10 ],
+ [ "livingroom_5x5_S_1", 10 ],
+ [ "livingroom_5x5_W_1", 10 ],
+ [ "livingroom_5x5_S_2", 10 ],
+ [ "livingroom_5x5_E_2", 10 ]
+ ]
+ },
+ "Ö": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1A", 20 ],
+ [ "diningroom_6x6_E_W_1", 20 ],
+ [ "diningroom_6x6_E_W_2", 20 ],
+ [ "diningroom_6x6_N_S_2", 20 ],
+ [ "livingroom_5x5_N_1", 10 ],
+ [ "livingroom_5x5_S_1", 10 ],
+ [ "livingroom_5x5_E_1", 10 ],
+ [ "livingroom_5x5_S_2", 10 ]
+ ]
+ },
+ "`": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1B", 20 ],
+ [ "diningroom_6x6_E_W_1", 20 ],
+ [ "diningroom_6x6_E_W_2A", 20 ],
+ [ "diningroom_6x6_N_S_2A", 20 ]
+ ]
+ },
+ "´": {
+ "chunks": [
+ [ "diningroom_6x6_N_S_1A", 20 ],
+ [ "diningroom_6x6_E_W_1", 20 ],
+ [ "diningroom_6x6_E_W_2", 20 ],
+ [ "diningroom_6x6_N_S_2", 20 ]
+ ]
+ },
+ "Ý": {
+ "chunks": [
+ [ "livingroom_5x5_N_1", 10 ],
+ [ "livingroom_5x5_S_1", 10 ],
+ [ "livingroom_5x5_E_1", 10 ],
+ [ "livingroom_5x5_S_2", 10 ]
+ ]
+ },
+ "ý": {
+ "chunks": [
+ [ "livingroom_5x5_N_1", 10 ],
+ [ "livingroom_5x5_S_1", 10 ],
+ [ "livingroom_5x5_W_1", 10 ],
+ [ "livingroom_5x5_S_2", 10 ],
+ [ "livingroom_5x5_E_2", 10 ]
+ ]
+ },
+ "ü": { "chunks": [ [ "livingroom_4x4_N_S_1", 100 ] ] },
+ "Ü": { "chunks": [ [ "livingroom_4x4_N_1", 20 ], [ "null", 1 ] ] },
+ "ű": { "chunks": [ [ "kitchen_5x5_N_1", 20 ], [ "kitchen_5x5_N_1A", 20 ] ] },
+ "é": { "chunks": [ [ "kitchen_5x5_N_1A", 20 ], [ "kitchen_5x5_N_1B", 10 ], [ "kitchen_5x5_N_1C", 10 ] ] },
+ "É": { "chunks": [ [ "kitchen_5x5_N_1A", 20 ], [ "kitchen_5x5_N_1B", 10 ] ] },
+ "e": { "chunks": [ [ "kitchen_5x5_N_1A", 20 ], [ "kitchen_5x5_N_1C", 10 ] ] },
+ "Ű": { "chunks": [ [ "kitchen_5x5_N_1", 20 ], [ "kitchen_5x5_N_2", 40 ], [ "kitchen_5x5_N_3", 20 ] ] },
+ "ó": {
+ "chunks": [
+ [ "bonus_room_3x3_1A", 20 ],
+ [ "bonus_room_3x3_S_5", 20 ],
+ [ "bonus_room_3x3_E_6", 20 ],
+ [ "bonus_room_3x3_S_6", 20 ],
+ [ "bonus_room_3x3_E_8", 20 ],
+ [ "bonus_room_3x3_S_8", 20 ],
+ [ "bonus_room_3x3_S_7", 20 ]
+ ]
+ },
+ "Ó": {
+ "chunks": [
+ [ "bonus_room_3x3_1", 20 ],
+ [ "bonus_room_3x3_S_5", 20 ],
+ [ "bonus_room_3x3_S_6", 20 ],
+ [ "bonus_room_3x3_W_6", 20 ],
+ [ "bonus_room_3x3_S_8", 20 ],
+ [ "bonus_room_3x3_W_8", 20 ],
+ [ "bonus_room_3x3_S_7", 20 ],
+ [ "bonus_room_3x3_E_7", 20 ]
+ ]
+ },
+ "o": {
+ "chunks": [
+ [ "bonus_room_3x3_1A", 20 ],
+ [ "bonus_room_3x3_2", 20 ],
+ [ "bonus_room_3x3_4", 20 ],
+ [ "bonus_room_3x3_N_6", 20 ],
+ [ "bonus_room_3x3_E_6", 20 ],
+ [ "bonus_room_3x3_N_8", 20 ],
+ [ "bonus_room_3x3_E_8", 20 ]
+ ]
+ },
+ "O": {
+ "chunks": [
+ [ "bonus_room_3x3_1", 20 ],
+ [ "bonus_room_3x3_2", 20 ],
+ [ "bonus_room_3x3_3", 20 ],
+ [ "bonus_room_3x3_4", 20 ],
+ [ "bonus_room_3x3_N_6", 20 ],
+ [ "bonus_room_3x3_W_6", 20 ],
+ [ "bonus_room_3x3_N_8", 20 ],
+ [ "bonus_room_3x3_W_8", 20 ]
+ ]
+ },
+ "í": {
+ "chunks": [
+ [ "livingroom_5x5_N_1", 20 ],
+ [ "livingroom_5x5_N_2", 20 ],
+ [ "livingroom_5x5_S_2", 20 ],
+ [ "livingroom_5x5_E_1", 20 ],
+ [ "livingroom_5x5_E_2", 20 ],
+ [ "diningroom_5x5_N_S", 50 ],
+ [ "diningroom_5x5_E_W", 50 ]
+ ]
+ },
+ "Í": {
+ "chunks": [
+ [ "livingroom_5x5_N_1", 20 ],
+ [ "livingroom_5x5_N_2", 20 ],
+ [ "livingroom_5x5_S_2", 20 ],
+ [ "livingroom_5x5_W_1", 20 ],
+ [ "livingroom_5x5_W_2", 20 ],
+ [ "diningroom_5x5_N_S", 50 ],
+ [ "diningroom_5x5_E_W", 50 ]
+ ]
+ },
+ "²": {
+ "chunks": [
+ [ "livingroom_5x5_N_1", 20 ],
+ [ "livingroom_5x5_N_2", 20 ],
+ [ "livingroom_5x5_S_2", 20 ],
+ [ "livingroom_5x5_E_1", 20 ],
+ [ "livingroom_5x5_E_2", 20 ]
+ ]
+ },
+ "³": {
+ "chunks": [
+ [ "livingroom_5x5_N_1", 20 ],
+ [ "livingroom_5x5_N_2", 20 ],
+ [ "livingroom_5x5_S_2", 20 ],
+ [ "livingroom_5x5_W_1", 20 ],
+ [ "livingroom_5x5_W_2", 20 ]
+ ]
+ },
+ "µ": { "chunks": [ [ "diningroom_5x5_N_S", 50 ], [ "diningroom_5x5_E_W", 50 ] ] },
+ "_": { "chunks": [ [ "diningroom_5x5_N_S", 50 ], [ "diningroom_5x5_E_W", 50 ] ] }
+ },
+ "terrain": {
+ "#": { "param": "shrubbery_type", "fallback": "t_region_groundcover_urban" },
+ " ": "t_region_groundcover_urban",
+ "+": [ [ "t_door_c", 12 ], "t_door_o" ],
+ "%": "t_rock",
+ "=": "t_door_metal_c",
+ "D": [ [ "t_door_locked_interior", 20 ], [ "t_door_boarded", 1 ] ],
+ "E": "t_elevator",
+ "~": { "param": "carpet_type", "fallback": "t_floor" },
+ "G": "t_door_glass_c",
+ "R": { "param": "railing_type", "fallback": "t_concrete_railing" },
+ "*": "t_railing_v",
+ "W": "t_window",
+ "s": "t_sidewalk",
+ "J": "t_sidewalk",
+ "w": { "param": "window_type", "fallback": "t_window_domestic" },
+ "|": { "param": "wall_type", "fallback": "t_brick_wall" },
+ "-": { "param": "i_wall_type", "fallback": "t_wall_w" },
+ "z": "t_flat_roof",
+ "Z": "t_glass_roof",
+ "(": "t_flat_roof",
+ "&": "t_flat_roof",
+ "a": "t_flat_roof",
+ "@": "t_flat_roof",
+ "Đ": "t_flat_roof",
+ ",": "t_thconc_floor",
+ "Q": "t_thconc_floor",
+ "4": "t_gutter_west",
+ "5": "t_gutter_south",
+ "6": "t_gutter_east",
+ "7": "t_gutter_drop",
+ "8": "t_gutter_north",
+ "i": "t_linoleum_white",
+ "S": "t_linoleum_white",
+ "T": "t_linoleum_white",
+ "b": "t_linoleum_white",
+ "f": "t_chainfence_v",
+ "g": "t_chaingate_c",
+ "<": "t_stairs_up",
+ ">": "t_stairs_down",
+ "¤": "t_open_air_rooved",
+ "/": "t_open_air"
+ },
+ "furniture": {
+ "a": "f_small_satelitte_dish",
+ "b": "f_bathtub",
+ "j": "f_trashcan",
+ "J": "f_dumpster",
+ "K": "f_generator_broken",
+ "M": "f_machinery_heavy",
+ "p": "f_mailbox",
+ "C": "f_desk",
+ "Q": "f_air_conditioner",
+ "r": [ "f_rack", "f_utility_shelf", [ "f_locker", 2 ] ],
+ "U": [ [ "f_cardboard_box", 8 ], "f_crate_o" ],
+ "S": "f_sink",
+ "x": "f_console_broken",
+ "Y": "f_rack_coat",
+ "h": "f_chair",
+ "L": "f_table",
+ "u": [ "f_rack", [ "f_rack_wood", 3 ] ],
+ "B": "f_bookcase",
+ "^": [ "f_indoor_plant", "f_indoor_plant_y", [ "f_null", 3 ] ],
+ "(": "f_solar_unit",
+ "&": "f_chimney",
+ "@": "f_TV_antenna"
+ },
+ "toilets": { "T": { } },
+ "items": {
+ "C": { "item": "SUS_office_desk", "chance": 33 },
+ "j": { "item": "trash", "chance": 65, "repeat": [ 1, 3 ] },
+ "J": { "item": "trash", "chance": 65, "repeat": [ 1, 6 ] },
+ "b": { "item": "shower", "chance": 20 },
+ "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] },
+ "B": { "item": "homebooks", "chance": 30, "repeat": [ 2, 4 ] },
+ "r": [
+ { "item": "tools_home", "chance": 40 },
+ { "item": "cleaning", "chance": 30, "repeat": [ 1, 2 ] },
+ { "item": "mechanics", "chance": 1, "repeat": [ 1, 2 ] },
+ { "item": "hardware", "chance": 5, "repeat": [ 1, 2 ] },
+ { "item": "bed", "chance": 30, "repeat": [ 1, 2 ] },
+ { "item": "games", "chance": 20, "repeat": [ 1, 2 ] },
+ { "item": "tools_survival", "chance": 5, "repeat": [ 1, 2 ] }
+ ],
+ "U": [
+ { "item": "art", "chance": 10 },
+ { "item": "stash_drugs", "chance": 1 },
+ { "item": "home_display_case", "chance": 1 },
+ { "item": "maps", "chance": 4 },
+ { "item": "allsporting", "chance": 40, "repeat": [ 1, 2 ] },
+ { "item": "toy_store", "chance": 10, "repeat": [ 1, 2 ] },
+ { "item": "chem_home", "chance": 50, "repeat": [ 1, 2 ] },
+ { "item": "camping", "chance": 10 }
+ ],
+ "T": { "item": "SUS_toilet", "chance": 50, "repeat": [ 1, 3 ] },
+ "S": [ { "item": "SUS_bathroom_sink", "chance": 50 }, { "item": "SUS_bathroom_medicine", "chance": 50 } ],
+ "Y": { "item": "unisex_coat_rack", "chance": 35, "repeat": [ 1, 4 ] },
+ "u": [ { "item": "SUS_pantry", "chance": 20 }, { "item": "cannedfood", "chance": 25, "repeat": [ 1, 2 ] } ]
+ }
+ },
+ {
+ "type": "palette",
+ "id": "skyscraper_office_palette",
+ "parameters": {
+ "carpet_type": {
+ "type": "ter_str_id",
+ "default": {
+ "distribution": [ [ "t_carpet_yellow", 2 ], [ "t_carpet_green", 2 ], [ "t_carpet_purple", 1 ], [ "t_carpet_red", 2 ] ]
+ }
+ }
+ },
+ "terrain": {
+ "*": "t_null",
+ "/": "t_open_air",
+ "#": "t_concrete_wall",
+ ">": "t_stairs_down",
+ "<": "t_stairs_up",
+ "'": "t_thconc_floor",
+ "r": "t_thconc_floor",
+ "Q": "t_thconc_floor",
+ "O": "t_thconc_floor",
+ ".": "t_linoleum_white",
+ ":": "t_linoleum_gray",
+ "i": "t_linoleum_white",
+ "S": "t_linoleum_white",
+ "T": "t_linoleum_white",
+ "e": "t_linoleum_white",
+ "o": "t_linoleum_white",
+ "C": "t_linoleum_white",
+ "y": "t_linoleum_white",
+ " ": "t_region_groundcover_urban",
+ ",": "t_pavement_y",
+ "_": "t_pavement",
+ "%": [ [ "t_region_shrub_decorative", 16 ], [ "t_region_groundcover_forest", 5 ] ],
+ "I": "t_region_tree_shade",
+ "+": "t_door_c",
+ "=": "t_door_locked",
+ "D": "t_door_metal_c",
+ "!": "t_door_metal_locked",
+ "E": "t_elevator",
+ "G": "t_door_glass_c",
+ "H": "t_wall_glass",
+ "R": "t_railing_v",
+ "s": "t_sidewalk",
+ "V": "t_wall_glass",
+ "w": "t_window",
+ "-": "t_brick_wall",
+ "|": "t_brick_wall",
+ "Δ": "t_ramp_up_low",
+ "Ʌ": "t_ramp_up_high",
+ "Ŧ": "t_ramp_down_high",
+ "±": "t_ramp_down_low"
+ },
+ "furniture": {
+ "?": "f_sofa",
+ "^": [ "f_indoor_plant", "f_indoor_plant_y" ],
+ "a": "f_trashcan",
+ "b": "f_bench",
+ "B": "f_bulletin",
+ "c": "f_counter",
+ "C": "f_counter",
+ "d": "f_desk",
+ "e": "f_fridge",
+ "F": "f_filing_cabinet",
+ "h": "f_chair",
+ "l": "f_locker",
+ "M": "f_armchair",
+ "n": "f_table",
+ "N": "f_machinery_heavy",
+ "o": "f_oven",
+ "O": [ [ "f_cardboard_box", 6 ], "f_crate_c" ],
+ "r": "f_rack",
+ "S": "f_sink",
+ "t": "f_table",
+ "T": "f_toilet",
+ "x": "f_console_broken",
+ "X": "f_generator_broken",
+ "y": "f_locker",
+ "Y": "f_rack_coat"
+ },
+ "items": {
+ "d": [ { "item": "SUS_office_desk", "chance": 50 }, { "item": "homebooks", "chance": 2 } ],
+ "e": [ { "item": "SUS_fridge_breakroom", "chance": 70 } ],
+ "o": { "item": "oven", "chance": 70 },
+ "r": [ { "item": "office_supplies", "chance": 65, "repeat": [ 1, 10 ] } ],
+ "y": { "item": "SUS_janitors_closet", "chance": 90 },
+ "Y": { "item": "coat_rack", "chance": 90 },
+ "a": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] },
+ "t": { "item": "dining", "chance": 40, "repeat": [ 1, 2 ] },
+ "F": { "item": "SUS_office_filing_cabinet", "chance": 70 },
+ ".": { "item": "office_mess", "chance": 1 }
+ },
+ "vendingmachines": { "8": { "item_group": "vending_drink" }, "9": { "item_group": "vending_food" } },
+ "toilets": { "T": { } }
+ }
+]
diff --git a/data/json/npcs/TALK_FACTION_CAMP.json b/data/json/npcs/TALK_FACTION_CAMP.json
index 864587aa5efd3..67a42bd7e6cd2 100644
--- a/data/json/npcs/TALK_FACTION_CAMP.json
+++ b/data/json/npcs/TALK_FACTION_CAMP.json
@@ -121,7 +121,7 @@
{
"id": "TALK_CAMP_TUTORIAL_BUILDING",
"type": "talk_topic",
- "dynamic_line": "Currently, there are three main types of camps that you can start building: bare bones camps, modular field camps, and established building camps which is a wide range of camps adapted to using specific buildings. The established building list includes fire lookout towers, helipads, lighthouses, light industry, mansions, military outposts, pottery cottages, radio towers, small sealabs, and fire stations. I may have forgotten something here, as my memory may not be completely up to date.\n The bare bones camp is the most flexible kind of camp as it can be built anywhere and doesn't mandate any construction. Modular field camps is the next most flexible kind of camp since you can build them on any field and can locate them to have plenty of space for expansions, but you start with nothing in a field and have to build every building, so they can require a lot of resources. Established building camps are faster to set up since you start in an existing building, but you have to establish them in a supported type of existing building and there may be limited or no space for expansions.\n Each camp location will have a variety of upgrade missions for it, except for the bare bones one where everything is up to you. The various missions have descriptions. In general, though, you'll need to establish housing if you want to expand, and some missions such as hunting or recruiting will require that you have some kind of kitchen or office that you can use to help schedule activities.\n Regardless of what kind of camp you make, you have to start it by asking a companion to build the camp. If there are more alternatives than just the bare bones camp you'll get a list of the available alternatives.",
+ "dynamic_line": "Currently, there are three main types of camps that you can start building: bare bones camps, modular field camps, and established building camps which is a wide range of camps adapted to using specific buildings. The established building list includes fire lookout towers, helipads, lighthouses, light industry, mansions, military outposts, pottery cottages, radio towers, small sealabs, and fire stations. I may have forgotten something here, as my memory may not be completely up to date.\n The bare bones camp is the most flexible kind of camp as it can be built anywhere and doesn't mandate any construction. Modular field camps is the next most flexible kind of camp since you can build them on any field and can locate them to have plenty of space for expansions, but you start with nothing in a field and have to build every building, so they can require a lot of resources. Established building camps are faster to set up since you start in an existing building, but you have to establish them in a supported type of existing building and there may be limited or no space for expansions.\n Each camp location will have a variety of upgrade missions for it, except for the bare bones one where everything is up to you. The various missions have descriptions. In general, though, you can expand your camp with expansions whenever you want, assuming there are expansions suitable to the adjacent terrains (the general expansions can only be established on fields), and some missions such as hunting or recruiting will require that you have some kind of kitchen or office that you can use to help schedule activities.\n Regardless of what kind of camp you make, you have to start it by asking a companion to build the camp. If there are more alternatives than just the bare bones camp you'll get a list of the available alternatives.",
"responses": [
{ "text": "Tell me about bare bones camps.", "topic": "TALK_CAMP_TUTORIAL_BARE_BONES" },
{ "text": "Tell me about modular field camps.", "topic": "TALK_CAMP_TUTORIAL_MFC" },
@@ -148,7 +148,7 @@
{
"id": "TALK_CAMP_TUTORIAL_BARE_BONES",
"type": "talk_topic",
- "dynamic_line": "The bare bones camp is the most flexible kind of camp as you can build them anywhere while still having access to almost all camp capabilities, leaving it completely up to you how you design them (the missed functionality is tied to the construction of a radio tower). You start by ordering the companion to build the camp, then construct a bulletin board within it yourself, after which you can use the board to order companions to execute camp missions without construction preconditions. The camp allows you to build all expansions without requiring any prior construction, but the expansions can still only be placed on suitable terrain, which probably remains restricted to fields. You still have to meet all the usual restrictions for companion crafting missions, such as access to fire, tools, etc, but facilities constructed by you or your companions should be available for crafting provided you have covered them with Camp: Supply zones. How you want to construct the camp in your chosen location is up to you, with construction zones available should you want to give the task to your companions.",
+ "dynamic_line": "The bare bones camp is the most flexible kind of camp as you can build them anywhere while still having access to almost all camp capabilities, leaving it completely up to you how you design them (the missed functionality is tied to the construction of a radio tower). You start by ordering the companion to build the camp, then construct a bulletin board within it yourself or by ordering your companion to make a zone construction for it, after which you can use the board to order companions to execute camp missions without construction preconditions. You still have to meet all the usual restrictions for companion crafting missions, such as access to fire, tools, etc, but facilities constructed by you or your companions should be available for crafting provided you have covered them with Camp: Supply zones. How you want to construct the camp in your chosen location is up to you, with construction zones available should you want to give the task to your companions.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -164,7 +164,7 @@
{
"id": "TALK_CAMP_TUTORIAL_MFC",
"type": "talk_topic",
- "dynamic_line": "The modular field camp is the second most flexible kind of camp, but they require a lot of time and resources to build. There are actually two different versions with slightly different layouts, so you will always have a choice when starting a field base camp. With both versions you start with an empty field - and it has to be a real empty field, not a field on a ranch or farm - and build up from nothing. You have a range of different building materials available from which buildings can be constructed, and different sections can be constructed from different materials to make the most of what you have available.\n You start by building a lean-to and a bed in the northeast corner of the central camp, and then add a cooking facility to it, and expand out until you have a small shelter for two people. When that is complete, you can expand the camp in a variety of ways:\n 1. Version 1 allows building up to 5 more rooms or shacks with a maximum of 3 on each side of the camp that increases to a total of 8 with version 2.\n 2. You can build a central building in the south half of the camp, between the rooms in version 1, with version 2 having the central building in the center, shaping the camp into an 'H'. The central building will act as a command center, allowing your camp to perform hunting, recruiting, and combat patrol missions.\n 3. In version 1 only you can dig trenches on all sides of the camp, which can possibly connect to the rooms on the sides to minimize the amount of trenching you need to do.\n 4. You can build various small features such as root cellars to preserve food or a radio tower to make it easier to recruit more companions.\n With each new construction in a modular camp can being able to be made from a different material you aren't constrained by what you start with. If limited by resources, tents are a fast alternative way to provide shelter, but fragile and likely to get destroyed by the first zombie stumbling in, however the central building must still be made from a 'real' building material. A final difference between version 1 and version 2 is that version 1 requires you to have at least one bed for the first expansion, and an additional two beds for each of the following expansions, while version 2 allows you to survey all expansions immediately. Since version 1 constructs only 16 beds, this means it's restricted to have at most 6 expansions.",
+ "dynamic_line": "The modular field camp is the second most flexible kind of camp, but they require a lot of time and resources to build. There are actually two different versions with slightly different layouts. With both versions you start with an empty field - and it has to be a real empty field, not a field on a ranch or farm - and build up from nothing. You have a range of different building materials available from which buildings can be constructed, and different sections can be constructed from different materials to make the most of what you have available.\n You start by building a lean-to and a bed in the northeast corner of the central camp, and then typically add a cooking facility to it, and expand out until you have a small shelter for two people. When the first building is complete, you can expand the camp in a variety of ways:\n 1. Version 1 allows building up to 5 more rooms or shacks with a maximum of 3 on each side of the camp that increases to a total of 8 with version 2.\n 2. You can build a central building in the south half of the camp, between the rooms in version 1, with version 2 having the central building in the center, shaping the camp into an 'H'. The central building will act as a command center, allowing your camp to perform hunting, recruiting, and combat patrol missions.\n 3. In version 1 only you can dig trenches on all sides of the camp, which can possibly connect to the rooms on the sides to minimize the amount of trenching you need to do.\n 4. You can build various small features such as root cellars to preserve food or a radio tower to make it easier to recruit more companions.\n With each new construction in a modular camp can being able to be made from a different material you aren't constrained by what you start with. If limited by resources, tents are a fast alternative way to provide shelter, but fragile and likely to get destroyed by the first zombie stumbling in, however the central building must still be made from a 'real' building material.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -180,7 +180,7 @@
{
"id": "TALK_CAMP_TUTORIAL_FIRE_STATION",
"type": "talk_topic",
- "dynamic_line": "Fire stations make good basecamps. You start with a brick building with secure metal doors, so you're not going to see your efforts destroyed by zombies. On the downside, you can't build expansions from a fire station.\n Fire station camps are also very compact. There isn't much living space, but you can build a small pottery or blacksmithy, a chop shop in one of the garage bays, and even tear up some of the pavement to create a garden. The existing kitchen makes it easy to cook from the start, though you may need to spruce it up a bit.",
+ "dynamic_line": "Fire stations make good basecamps. You start with a brick building with secure metal doors, so you're not going to see your efforts destroyed by zombies. On the downside, you generally can't build expansions from a fire station.\n Fire station camps are also very compact. There isn't much living space, but you can build a small pottery or blacksmithy, a chop shop in one of the garage bays, and even tear up some of the pavement to create a garden. The existing kitchen makes it easy to cook from the start, though you may need to spruce it up a bit.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -212,7 +212,7 @@
{
"id": "TALK_CAMP_TUTORIAL_FIRE_LOOKOUT_TOWER",
"type": "talk_topic",
- "dynamic_line": "You can build a faction camp in a fire lookout tower. Fire lookout towers often have fields surrounding them, although they support only two expansions.\n The base camp starts in an established building, and provides a full set of base camp missions, but the number of construction upgrades is limited to a pair of dual bed rooms, a well, a root cellar, and a radio tower. This makes it a camp that allows you to get the camp setup done with quickly so you can focus on other things.",
+ "dynamic_line": "You can build a faction camp in a fire lookout tower. Fire lookout towers often have fields surrounding them.\n The base camp starts in an established building, and provides a full set of base camp missions, but the number of construction upgrades is limited to a pair of dual bed rooms, a well, a root cellar, and a radio tower. This makes it a camp that allows you to get the camp setup done with quickly so you can focus on other things.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -228,7 +228,7 @@
{
"id": "TALK_CAMP_TUTORIAL_HELIPAD",
"type": "talk_topic",
- "dynamic_line": "You can build a faction camp in a helipad facility, where you're provided with water purification and cooking facilities from the beginning and can expand with a root cellar, butchering rack, a radio tower, and 4 beds which allows you to add two expansions to the base. One of the expansions can be into the garage, where you're given access to the available appliances.",
+ "dynamic_line": "You can build a faction camp in a helipad facility, where you're provided with water purification and cooking facilities from the beginning and can expand with a root cellar, butchering rack, a radio tower, and 4 beds. A site specific expansion is into the garage, where you're given access to the available appliances.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -260,7 +260,7 @@
{
"id": "TALK_CAMP_TUTORIAL_LIGHTINDUSTRY",
"type": "talk_topic",
- "dynamic_line": "You can build a faction camp in a light industry facility, where you're provided with cooking facilities from the beginning and can expand with a root cellar, butchering rack, well, a radio tower, and beds which allows you to add a full set of expansions to the base (assuming suitable expansions exist). One expansion that's always available is the workshop, where you're given access to the available appliances and can add a drop hammer for companion crafting.",
+ "dynamic_line": "You can build a faction camp in a light industry facility, where you're provided with cooking facilities from the beginning and can expand with a root cellar, butchering rack, well, a radio tower, and beds. One site specific expansion that's always available is the workshop, where you're given access to the available appliances and can add a drop hammer for companion crafting.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -276,7 +276,7 @@
{
"id": "TALK_CAMP_TUTORIAL_MANSION",
"type": "talk_topic",
- "dynamic_line": "You can build a faction camp in a mansion. You have four different starting positions available, namely the Fountain Garden, Dance Floor Room, Basketball Room, and Garden with Columns. Unlike most base camps, the Mansion allows you to immediately survey expansions, which makes sense as you're making use of more of an existing building. Depending on where you set up your base, the following expansions may become available: Entrance 1, Entrance 2, Swimming Pool 1, Bedrooms 1, Unidentified Room, Kitchen 2, Library, Bedrooms 2, Swimming Pool 2, Bar, Living Rooms, Bedroom 3, and Kitchen 2. The Entrances and Swimming Pool 1 provide farming, the Library a limited set of cooking, the Bar a different set, and the Kitchens an extended set of cooking recipes.",
+ "dynamic_line": "You can build a faction camp in a mansion. You have four different starting positions available, namely the Fountain Garden, Dance Floor Room, Basketball Room, and Garden with Columns. Depending on where you set up your base, the following site specific expansions may become available: Entrance 1, Entrance 2, Swimming Pool 1, Bedrooms 1, Unidentified Room, Kitchen 2, Library, Bedrooms 2, Swimming Pool 2, Bar, Living Rooms, Bedroom 3, and Kitchen 2. The Entrances and Swimming Pool 1 provide farming, the Library a limited set of cooking, the Bar a different set, and the Kitchens an extended set of cooking recipes.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -292,7 +292,7 @@
{
"id": "TALK_CAMP_TUTORIAL_OUTPOST",
"type": "talk_topic",
- "dynamic_line": "You can build a faction camp in a military outpost, of which there are two versions, 'normal' and 'cross'. They differ in that the normal version can be expanded with two beds, while the cross version can be expanded with four, resulting in a maximum of 1 and two expansions respectively. Apart from that, they provide you with the ability to build a root cellar, a butchery rack, a water well, farm plots, a radio tower, and repair the reactor's controller.",
+ "dynamic_line": "You can build a faction camp in a military outpost, of which there are two versions, 'normal' and 'cross'. They differ in that the normal version can be expanded with two beds, while the cross version can be expanded with four. Apart from that, they provide you with the ability to build a root cellar, a butchery rack, a water well, farm plots, a radio tower, and repair the reactor's controller.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -324,7 +324,7 @@
{
"id": "TALK_CAMP_TUTORIAL_RADIO_TOWER",
"type": "talk_topic",
- "dynamic_line": "You can build a faction camp in a radio tower, both the version with and the one without an adjacent building on the ground. Bedroom shacks can be built to host your companions and provide you with a full set of expansions. You can build a root cellar, a water well, hook yourself up to the radio tower, and fix the tower to get access to extended capabilities.",
+ "dynamic_line": "You can build a faction camp in a radio tower, both the version with and the one without an adjacent building on the ground. Bedroom shacks can be built to host your companions. You can build a root cellar, a water well, hook yourself up to the radio tower, and fix the tower to get access to extended capabilities.",
"responses": [
{ "text": "I want to go back to the list of possible camps.", "topic": "TALK_CAMP_TUTORIAL_BUILDING" },
{ "text": "Got it. Tell me about expansions.", "topic": "TALK_CAMP_TUTORIAL_EXPANSIONS" },
@@ -356,7 +356,7 @@
{
"id": "TALK_CAMP_TUTORIAL_EXPANSIONS",
"type": "talk_topic",
- "dynamic_line": "A camp can have up to 8 expansions (one for each of the 8 adjacent overmap tiles). Most base camps restrict the number of available expansions to one per two beds, while a few bypass that expansion (this is noted in their descriptions). Expansions add to the capabilities of your camp, such as adding a farm field or a manufactory for crafting all kinds of things.\n Expansion missions show up in separate tabs in the bulletin board, one set of missions per location, and you'll need to hit 'tab' to see them. Some base camps have dedicated expansions tailored to their specific facilities, and while these might be accessible from other base camps should those be constructed adjacent to one of these, the set of reasonably general expansions are currently all limited to field locations. The currently available general expansions are:\n -- Farm: This is a full tile of plowed fields that you can maintain or send companions on missions to maintain. Plants grow here normally. This expansion exists in two versions.\n -- Garage: This is a large building that currently doesn't provide any functionality, and so is of limited use (it used to provide disassembly before that was supported via zones). This expansion exists in two versions.\n -- Canteen: This is an expanded kitchen, dining area, and pantry that provides an expanded set of companion cooking recipes. This expansion exists in two versions.\n -- Livestock Area: This is a modular set of buildings for holding livestock such as cows, horses, or chickens. Animals are not included! This expansion exists in two versions.\n -- Saltworks Area: This is a small expansion for processing salt. This expansion creates a local mini swamp for salt extraction and exists in only one version.\n -- Fabrication Workshop: This is a large expansion for doing all kinds of crafts. Companions can use some of the furniture in this expansion to craft some items much faster than you can do by yourself by hand. This expansion exists in two versions.\n -- Central Storage Building: This is a large building for storing goods. This expansion exists in two versions, the second of which allows the construction of storage furniture with a larger capacity than storage on the ground.\n Note that there is nothing stopping you from constructing more than one instance of an expansion, such as multiple farms for more farming, or a second Livestock expansion if you have a lot of animals. In most cases there is not much value in having more than one of an expansion, though.",
+ "dynamic_line": "A camp can have up to 8 expansions (one for each of the 8 adjacent overmap tiles). Expansions add to the capabilities of your camp, such as adding a farm field or a manufactory for crafting all kinds of things.\n Expansion missions show up in separate tabs in the bulletin board, one set of missions per location, and you'll need to hit 'tab' to see them. Some base camps have dedicated expansions tailored to their specific facilities, and while these might be accessible from other base camps should those be constructed adjacent to one of these, the set of reasonably general expansions are currently all limited to field locations. The currently available general expansions are:\n -- Farm: This is a full tile of plowed fields that you can maintain or send companions on missions to maintain. Plants grow here normally. This expansion exists in two versions.\n -- Garage: This is a large building that currently doesn't provide any functionality, and so is of limited use (it used to provide disassembly before that was supported via zones, which can still be placed inside the garage). This expansion exists in two versions.\n -- Canteen: This is an expanded kitchen, dining area, and pantry that provides an expanded set of companion cooking recipes. This expansion exists in two versions.\n -- Livestock Area: This is a modular set of buildings for holding livestock such as cows, horses, or chickens. Animals are not included! This expansion exists in two versions.\n -- Saltworks Area: This is a small expansion for processing salt. This expansion creates a local mini swamp for salt extraction and exists in only one version.\n -- Fabrication Workshop: This is a large expansion for doing all kinds of crafts. Companions can use some of the furniture in this expansion to craft some items much faster than you can do by yourself by hand. This expansion exists in two versions.\n -- Central Storage Building: This is a large building for storing goods. This expansion exists in two versions, the second of which allows the construction of storage furniture with a larger capacity than storage on the ground.\n Note that there is nothing stopping you from constructing more than one instance of an expansion, such as multiple farms for more farming, or a second Livestock expansion if you have a lot of animals. In most cases there is not much value in having more than one of an expansion, though.",
"responses": [
{ "text": "Got it. Give me some advice on building a camp.", "topic": "TALK_CAMP_TUTORIAL_ADVICE" },
{ "text": "I know the basics. Just tell me what changed.", "topic": "TALK_CAMP_TUTORIAL_CHANGES" },
@@ -385,7 +385,7 @@
{
"id": "TALK_CAMP_TUTORIAL_CHANGES",
"type": "talk_topic",
- "dynamic_line": "\n1. Faction camps used to require a second companion to act as overseer and camp manager, but that's been replaced by the bulletin board and two-way radio.\n2. It used to be impossible to upgrade faction camps if there was a vehicle, even a cart, on the same map. You can now upgrade camps even if there is a vehicle on the map, as long as the upgrade doesn't change the area under the vehicle.\n3. Faction camps used to upgrade by completely redrawing the map. Damage to the camp would be replaced when the camp was upgraded. Now upgrades only change the actual area being upgraded, and you will have to repair damage to the camp yourself.\n4. There used to be a single path for upgrading the main camp. Now, after you have completed the first tent, you will have many options for your next upgrade, and you can have different companions working on different upgrades of the main camp at the same time.\n5. Companions who are near a camp will feed themselves from the camp's food stores, and if the camp has a well, they'll use it to quench their thirst.\n6. You can now set up faction camps in select buildings. The list of available buildings is constantly growing, so you'll have to experiment.\n7. The oldest type of camp, known as the primitive field camp or \"Old Camp\", is no longer supported and will be removed entirely in the future.",
+ "dynamic_line": "\n1. Faction camps used to require a second companion to act as overseer and camp manager, but that's been replaced by the bulletin board and two-way radio.\n2. It used to be impossible to upgrade faction camps if there was a vehicle, even a cart, on the same map. You can now upgrade camps even if there is a vehicle on the map, as long as the upgrade doesn't change the area under the vehicle.\n3. Faction camps used to upgrade by completely redrawing the map. Damage to the camp would be replaced when the camp was upgraded. Now upgrades only change the actual area being upgraded, and you will have to repair damage to the camp yourself.\n4. There used to be a single path for upgrading the main camp. Now, after you have completed the first tent, you will have many options for your next upgrade, and you can have different companions working on different upgrades of the main camp at the same time.\n5. Companions who are near a camp will feed themselves from the camp's food stores, and if the camp has a well, they'll use it to quench their thirst.\n6. You can now set up faction camps in select buildings. The list of available buildings is constantly growing, so you'll have to experiment.\n7. The oldest type of camp, known as the primitive field camp or \"Old Camp\", is no longer supported and will be removed entirely in the future.\n8. Most camps abided by a restriction that allowed them to add expansions to the camps only when camp constructions had added a sufficient number of beds to the camp (2 per expansion), but this restriction has been removed from all camps.",
"responses": [
{ "text": "Wait, let's go back over from the start.", "topic": "TALK_CAMP_TUTORIAL_INTRO" },
{ "text": "Give me an overview of how camps work.", "topic": "TALK_CAMP_TUTORIAL_OVERVIEW" },
diff --git a/data/json/overmap/multitile_city_buildings.json b/data/json/overmap/multitile_city_buildings.json
index 5869859c52e0e..d13845fdd522f 100644
--- a/data/json/overmap/multitile_city_buildings.json
+++ b/data/json/overmap/multitile_city_buildings.json
@@ -3544,6 +3544,57 @@
{ "point": [ 2, 2, 1 ], "overmap": "movietheater_roof_2_2_north" }
]
},
+ {
+ "type": "city_building",
+ "id": "office_skyscraper",
+ "locations": [ "land" ],
+ "overmaps": [
+ { "point": [ 1, 1, 0 ], "overmap": "office_skyscraper_5_south" },
+ { "point": [ 0, 1, 0 ], "overmap": "office_skyscraper_6_south" },
+ { "point": [ 1, 0, 0 ], "overmap": "office_skyscraper_7_south" },
+ { "point": [ 0, 0, 0 ], "overmap": "office_skyscraper_8_south" },
+ { "point": [ 1, 1, -1 ], "overmap": "office_skyscraper_1_south" },
+ { "point": [ 0, 1, -1 ], "overmap": "office_skyscraper_2_south" },
+ { "point": [ 1, 0, -1 ], "overmap": "office_skyscraper_3_south" },
+ { "point": [ 0, 0, -1 ], "overmap": "office_skyscraper_4_south" },
+ { "point": [ 1, 1, 1 ], "overmap": "office_skyscraper_apartments_111_south" },
+ { "point": [ 0, 1, 1 ], "overmap": "office_skyscraper_apartments_011_south" },
+ { "point": [ 1, 0, 1 ], "overmap": "office_skyscraper_apartments_101_south" },
+ { "point": [ 0, 0, 1 ], "overmap": "office_skyscraper_apartments_001_south" },
+ { "point": [ 1, 1, 2 ], "overmap": "office_skyscraper_apartments_112_south" },
+ { "point": [ 0, 1, 2 ], "overmap": "office_skyscraper_apartments_012_south" },
+ { "point": [ 1, 0, 2 ], "overmap": "office_skyscraper_apartments_102_south" },
+ { "point": [ 0, 0, 2 ], "overmap": "office_skyscraper_apartments_002_south" },
+ { "point": [ 1, 1, 3 ], "overmap": "office_skyscraper_9_south" },
+ { "point": [ 0, 1, 3 ], "overmap": "office_skyscraper_10_south" },
+ { "point": [ 1, 0, 3 ], "overmap": "office_skyscraper_11_south" },
+ { "point": [ 0, 0, 3 ], "overmap": "office_skyscraper_12_south" },
+ { "point": [ 1, 1, 4 ], "overmap": "office_skyscraper_9b_south" },
+ { "point": [ 0, 1, 4 ], "overmap": "office_skyscraper_10b_south" },
+ { "point": [ 1, 0, 4 ], "overmap": "office_skyscraper_11_south" },
+ { "point": [ 0, 0, 4 ], "overmap": "office_skyscraper_12_south" },
+ { "point": [ 1, 1, 5 ], "overmap": "office_skyscraper_9_south" },
+ { "point": [ 0, 1, 5 ], "overmap": "office_skyscraper_10_south" },
+ { "point": [ 1, 0, 5 ], "overmap": "office_skyscraper_11_south" },
+ { "point": [ 0, 0, 5 ], "overmap": "office_skyscraper_12_south" },
+ { "point": [ 1, 1, 6 ], "overmap": "office_skyscraper_9b_south" },
+ { "point": [ 0, 1, 6 ], "overmap": "office_skyscraper_10b_south" },
+ { "point": [ 1, 0, 6 ], "overmap": "office_skyscraper_11_south" },
+ { "point": [ 0, 0, 6 ], "overmap": "office_skyscraper_12_south" },
+ { "point": [ 1, 1, 7 ], "overmap": "office_skyscraper_9_south" },
+ { "point": [ 0, 1, 7 ], "overmap": "office_skyscraper_10_south" },
+ { "point": [ 1, 0, 7 ], "overmap": "office_skyscraper_11_south" },
+ { "point": [ 0, 0, 7 ], "overmap": "office_skyscraper_12_south" },
+ { "point": [ 1, 1, 8 ], "overmap": "office_skyscraper_13_south" },
+ { "point": [ 0, 1, 8 ], "overmap": "office_skyscraper_14_south" },
+ { "point": [ 1, 0, 8 ], "overmap": "office_skyscraper_15_south" },
+ { "point": [ 0, 0, 8 ], "overmap": "office_skyscraper_16_south" },
+ { "point": [ 1, 1, 9 ], "overmap": "office_skyscraper_17_south" },
+ { "point": [ 0, 1, 9 ], "overmap": "office_skyscraper_18_south" },
+ { "point": [ 1, 0, 9 ], "overmap": "office_skyscraper_19_south" },
+ { "point": [ 0, 0, 9 ], "overmap": "office_skyscraper_20_south" }
+ ]
+ },
{
"type": "city_building",
"id": "town_hall",
diff --git a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json
index 9b711cebb0070..0550fe78043c3 100644
--- a/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json
+++ b/data/json/overmap/overmap_terrain/overmap_terrain_commercial.json
@@ -1252,6 +1252,14 @@
"sym": "T",
"color": "white"
},
+ {
+ "type": "overmap_terrain",
+ "abstract": "generic_office_skyscraper",
+ "name": "office skyscraper",
+ "copy-from": "generic_city_building",
+ "sym": "S",
+ "color": "white"
+ },
{
"type": "overmap_terrain",
"id": "home_improvement",
@@ -1298,6 +1306,45 @@
"sym": ".",
"color": "blue"
},
+ {
+ "type": "overmap_terrain",
+ "id": [
+ "office_skyscraper_1",
+ "office_skyscraper_2",
+ "office_skyscraper_3",
+ "office_skyscraper_4",
+ "office_skyscraper_5",
+ "office_skyscraper_6",
+ "office_skyscraper_7",
+ "office_skyscraper_8",
+ "office_skyscraper_apartments_111",
+ "office_skyscraper_apartments_011",
+ "office_skyscraper_apartments_101",
+ "office_skyscraper_apartments_001",
+ "office_skyscraper_apartments_112",
+ "office_skyscraper_apartments_012",
+ "office_skyscraper_apartments_102",
+ "office_skyscraper_apartments_002",
+ "office_skyscraper_9",
+ "office_skyscraper_9b",
+ "office_skyscraper_10",
+ "office_skyscraper_10b",
+ "office_skyscraper_11",
+ "office_skyscraper_12",
+ "office_skyscraper_13",
+ "office_skyscraper_14",
+ "office_skyscraper_15",
+ "office_skyscraper_16"
+ ],
+ "copy-from": "generic_office_skyscraper"
+ },
+ {
+ "type": "overmap_terrain",
+ "id": [ "office_skyscraper_17", "office_skyscraper_18", "office_skyscraper_19", "office_skyscraper_20" ],
+ "name": "open air",
+ "sym": ".",
+ "color": "blue"
+ },
{
"type": "overmap_terrain",
"id": "s_antique",
diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json
index 5b77a91266f4a..fabea78ce3abc 100644
--- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json
+++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_common.json
@@ -98,7 +98,7 @@
"fbmh_2_bed_palette": "Bed"
}
},
- "blueprint_requires": [ { "id": "fbmh_2_room_1_2" } ],
+ "blueprint_requires": [ { "id": "fbmh_2_room_NE", "amount": 2 } ],
"blueprint_provides": [ { "id": "fbmh_2_bed_NE_2" } ],
"blueprint_excludes": [ { "id": "fbmh_2_bed_NE_2" } ]
},
diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_construction.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_construction.json
index 1deeef0b53cea..2e18b8fc5b548 100644
--- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_construction.json
+++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_construction.json
@@ -103,7 +103,7 @@
"fbmh_2_wood_palette": "Wooden walls and wooden roof"
}
},
- "blueprint_requires": [ { "id": "fbmh_2_room_1_3" } ],
+ "blueprint_requires": [ { "id": "fbmh_2_room_NE", "amount": 4 } ],
"blueprint_provides": [ { "id": "fbmh_2_room_ENE", "amount": 4 } ],
"blueprint_excludes": [ { "id": "fbmh_2_room_ENE" } ]
},
diff --git a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json
index 0887c9f437b4b..d14fa8aab205f 100644
--- a/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json
+++ b/data/json/recipes/basecamps/base/recipe_modular_hub/version_2/recipe_modular_field_tent.json
@@ -29,7 +29,7 @@
"time": "3 h",
"construction_blueprint": "fbmh_2_tent_room_ENE",
"blueprint_name": "east north east tent",
- "blueprint_requires": [ { "id": "fbmh_2_room_NE", "amount": 4 }, { "id": "fbmh_2_fire_NE" }, { "id": "fbmh_2_bed_NE_2" } ],
+ "blueprint_requires": [ { "id": "fbmh_2_room_NE", "amount": 4 } ],
"blueprint_provides": [ { "id": "fbmh_2_room_ENE", "amount": 4 } ],
"blueprint_excludes": [ { "id": "fbmh_2_room_ENE" } ],
"components": [ [ [ "large_tent_kit", 1 ], [ "broketent", 4 ], [ "tent_kit", 3 ], [ "shelter_kit", 4 ] ] ],
diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json
index 236007f673223..69cc81cae086a 100644
--- a/data/json/regional_map_settings.json
+++ b/data/json/regional_map_settings.json
@@ -1279,7 +1279,8 @@
"public_works": 200,
"office_tower": 150,
"office_tower_2": 150,
- "office_tower_large": 500,
+ "office_skyscraper": 300,
+ "office_tower_large": 300,
"office_tower_hiddenlab": 50,
"mall": 100,
"home_improvement_superstore_new": 150,
diff --git a/data/json/vehicle_groups.json b/data/json/vehicle_groups.json
index 25b20f44458dd..9688f6fa729d0 100644
--- a/data/json/vehicle_groups.json
+++ b/data/json/vehicle_groups.json
@@ -3,15 +3,63 @@
"type": "vehicle_group",
"id": "city_vehicles",
"vehicles": [
- [ "car", 2000 ],
- [ "car_diesel", 1000 ],
+ [ "car", 700 ],
+ [ "car_diesel", 350 ],
[ "car_anmlcmpt", 250 ],
[ "car_hatch", 1000 ],
[ "car_hatch_diesel", 500 ],
- [ "car_luxury", 400 ],
- [ "electric_car", 500 ],
- [ "car_sports", 300 ],
- [ "car_sports_electric", 60 ],
+ [ "car_luxury", 200 ],
+ [ "electric_car", 175 ],
+ [ "car_micro", 300 ],
+ [ "car_micro_hybrid", 300 ],
+ [ "car_micro_electric", 300 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 150 ],
+ [ "scompact_tandem_hboard", 150 ],
+ [ "scompact_tandem_electric_stow", 150 ],
+ [ "scompact_tandem_electric_hboard", 150 ],
+ [ "scompact_tandem_2wheel_stow", 150 ],
+ [ "scompact_tandem_2wheel_hboard", 150 ],
+ [ "scompact_tandem_electric_2wheel_stow", 150 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 150 ],
+ [ "scompact_tandem_3wheel_stow", 150 ],
+ [ "scompact_tandem_3wheel_hboard", 150 ],
+ [ "scompact_tandem_electric_3wheel_stow", 150 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 150 ],
+ [ "car_shootingbrake_v8", 150 ],
+ [ "car_shootingbrake_v12", 150 ],
+ [ "car_shootingbrake_electric", 150 ],
+ [ "car_shootingbrake_long_v8", 150 ],
+ [ "car_shootingbrake_long_v12", 150 ],
+ [ "car_shootingbrake_long_electric", 150 ],
+ [ "car_sedan", 1300 ],
+ [ "car_sedan_diesel_i4", 1300 ],
+ [ "car_sedan_diesel_v6", 1300 ],
+ [ "car_sedan_v8", 1300 ],
+ [ "car_sedan_sports_v12", 1300 ],
+ [ "car_sedan_sports_v6", 1300 ],
+ [ "car_sedan_luxury_v6", 1300 ],
+ [ "car_sedan_electric", 1300 ],
+ [ "car_sedan_luxury_electric", 1300 ],
+ [ "car_sedan_sports_electric", 1300 ],
+ [ "car_town", 500 ],
+ [ "car_town_diesel", 500 ],
+ [ "car_town_budget", 500 ],
+ [ "car_town_budget_superior", 500 ],
+ [ "car_town_diesel_budget", 500 ],
+ [ "car_coupe", 1300 ],
+ [ "car_coupe_diesel_i4", 1300 ],
+ [ "car_coupe_diesel_v6", 1300 ],
+ [ "car_coupe_muscle", 1300 ],
+ [ "car_coupe_sports_v12", 1300 ],
+ [ "car_coupe_sports_v6", 1300 ],
+ [ "car_coupe_luxury_v6", 1300 ],
+ [ "car_coupe_electric", 1300 ],
+ [ "car_coupe_luxury_electric", 1300 ],
+ [ "car_coupe_sports_electric", 1300 ],
+ [ "car_super_v12", 150 ],
[ "suv", 800 ],
[ "suv_electric", 120 ],
[ "car_mini", 400 ],
@@ -24,6 +72,8 @@
[ "motorcycle_cross", 20 ],
[ "motorcycle_enduro", 50 ],
[ "superbike", 50 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "motorcycle_sidecart", 100 ],
[ "scooter", 200 ],
[ "scooter_electric", 300 ],
@@ -119,14 +169,63 @@
"type": "vehicle_group",
"id": "city_pileup",
"vehicles": [
- [ "car", 7000 ],
- [ "car_diesel", 3500 ],
+ [ "car", 2350 ],
+ [ "car_diesel", 1175 ],
[ "car_anmlcmpt", 600 ],
[ "car_hatch", 3500 ],
[ "car_hatch_diesel", 1400 ],
- [ "car_luxury", 1400 ],
- [ "electric_car", 1000 ],
- [ "car_sports", 500 ],
+ [ "car_luxury", 650 ],
+ [ "electric_car", 350 ],
+ [ "car_micro", 450 ],
+ [ "car_micro_hybrid", 450 ],
+ [ "car_micro_electric", 450 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 200 ],
+ [ "scompact_tandem_hboard", 200 ],
+ [ "scompact_tandem_electric_stow", 200 ],
+ [ "scompact_tandem_electric_hboard", 200 ],
+ [ "scompact_tandem_2wheel_stow", 200 ],
+ [ "scompact_tandem_2wheel_hboard", 200 ],
+ [ "scompact_tandem_electric_2wheel_stow", 200 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 200 ],
+ [ "scompact_tandem_3wheel_stow", 200 ],
+ [ "scompact_tandem_3wheel_hboard", 200 ],
+ [ "scompact_tandem_electric_3wheel_stow", 200 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 200 ],
+ [ "car_shootingbrake_v8", 200 ],
+ [ "car_shootingbrake_v12", 200 ],
+ [ "car_shootingbrake_electric", 200 ],
+ [ "car_shootingbrake_long_v8", 200 ],
+ [ "car_shootingbrake_long_v12", 200 ],
+ [ "car_shootingbrake_long_electric", 200 ],
+ [ "car_sedan", 2000 ],
+ [ "car_sedan_diesel_i4", 2000 ],
+ [ "car_sedan_diesel_v6", 2000 ],
+ [ "car_sedan_v8", 2000 ],
+ [ "car_sedan_sports_v12", 2000 ],
+ [ "car_sedan_sports_v6", 2000 ],
+ [ "car_sedan_luxury_v6", 2000 ],
+ [ "car_sedan_electric", 2000 ],
+ [ "car_sedan_luxury_electric", 2000 ],
+ [ "car_sedan_sports_electric", 2000 ],
+ [ "car_town", 700 ],
+ [ "car_town_diesel", 700 ],
+ [ "car_town_budget", 700 ],
+ [ "car_town_budget_superior", 700 ],
+ [ "car_town_diesel_budget", 700 ],
+ [ "car_coupe", 2000 ],
+ [ "car_coupe_diesel_i4", 2000 ],
+ [ "car_coupe_diesel_v6", 2000 ],
+ [ "car_coupe_muscle", 2000 ],
+ [ "car_coupe_sports_v12", 2000 ],
+ [ "car_coupe_sports_v6", 2000 ],
+ [ "car_coupe_luxury_v6", 2000 ],
+ [ "car_coupe_electric", 2000 ],
+ [ "car_coupe_luxury_electric", 2000 ],
+ [ "car_coupe_sports_electric", 2000 ],
+ [ "car_super_v12", 100 ],
[ "suv", 1000 ],
[ "suv_electric", 150 ],
[ "car_mini", 500 ],
@@ -156,16 +255,46 @@
"type": "vehicle_group",
"id": "highway",
"vehicles": [
- [ "car", 3000 ],
- [ "car_diesel", 1500 ],
+ [ "car", 1000 ],
+ [ "car_diesel", 500 ],
[ "car_anmlcmpt", 250 ],
[ "car_hatch", 1000 ],
[ "car_hatch_diesel", 500 ],
- [ "car_luxury", 600 ],
- [ "electric_car", 500 ],
+ [ "car_luxury", 200 ],
+ [ "electric_car", 175 ],
[ "car_hybrid", 500 ],
- [ "car_sports", 1000 ],
- [ "car_sports_electric", 300 ],
+ [ "car_shootingbrake_v8", 500 ],
+ [ "car_shootingbrake_v12", 500 ],
+ [ "car_shootingbrake_electric", 500 ],
+ [ "car_shootingbrake_long_v8", 500 ],
+ [ "car_shootingbrake_long_v12", 500 ],
+ [ "car_shootingbrake_long_electric", 500 ],
+ [ "car_sedan", 1200 ],
+ [ "car_sedan_diesel_i4", 1200 ],
+ [ "car_sedan_diesel_v6", 1200 ],
+ [ "car_sedan_v8", 1200 ],
+ [ "car_sedan_sports_v12", 1200 ],
+ [ "car_sedan_sports_v6", 1200 ],
+ [ "car_sedan_luxury_v6", 1200 ],
+ [ "car_sedan_electric", 1200 ],
+ [ "car_sedan_luxury_electric", 1200 ],
+ [ "car_sedan_sports_electric", 1200 ],
+ [ "car_town", 600 ],
+ [ "car_town_diesel", 600 ],
+ [ "car_town_budget", 600 ],
+ [ "car_town_budget_superior", 600 ],
+ [ "car_town_diesel_budget", 600 ],
+ [ "car_coupe", 1200 ],
+ [ "car_coupe_diesel_i4", 1200 ],
+ [ "car_coupe_diesel_v6", 1200 ],
+ [ "car_coupe_muscle", 1200 ],
+ [ "car_coupe_sports_v12", 1200 ],
+ [ "car_coupe_sports_v6", 1200 ],
+ [ "car_coupe_luxury_v6", 1200 ],
+ [ "car_coupe_electric", 1200 ],
+ [ "car_coupe_luxury_electric", 1200 ],
+ [ "car_coupe_sports_electric", 1200 ],
+ [ "car_super_v12", 800 ],
[ "pickup", 600 ],
[ "flatbed_truck", 500 ],
[ "semi_truck", 600 ],
@@ -198,6 +327,8 @@
[ "meth_lab", 300 ],
[ "armored_car", 300 ],
[ "superbike", 50 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "surv_car", 2 ],
[ "wienermobile", 5 ],
[ "tatra_truck", 300 ],
@@ -212,23 +343,67 @@
"id": "suburban_home",
"//": "Do not add vehicles over 8 tiles long or 4 wide. This is for indoor garages/spaces",
"vehicles": [
- [ "car", 1000 ],
- [ "car_diesel", 500 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
[ "car_rack", 700 ],
[ "car_anmlcmpt", 150 ],
[ "car_hatch", 500 ],
[ "car_hatch_diesel", 250 ],
[ "car_hatch_rack", 500 ],
- [ "car_luxury", 300 ],
+ [ "car_luxury", 150 ],
[ "car_mini", 250 ],
- [ "electric_car", 500 ],
+ [ "electric_car", 175 ],
[ "car_hybrid", 400 ],
[ "car_hybrid_rack", 400 ],
[ "beetle", 300 ],
- [ "car_sports", 100 ],
- [ "car_sports_electric", 50 ],
- [ "car_racing_electric", 5 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 200 ],
+ [ "car_shootingbrake_v12", 200 ],
+ [ "car_shootingbrake_electric", 200 ],
+ [ "car_shootingbrake_long_v8", 200 ],
+ [ "car_shootingbrake_long_v12", 200 ],
+ [ "car_shootingbrake_long_electric", 200 ],
+ [ "car_sedan", 1000 ],
+ [ "car_sedan_diesel_i4", 1000 ],
+ [ "car_sedan_diesel_v6", 1000 ],
+ [ "car_sedan_v8", 1000 ],
+ [ "car_sedan_sports_v12", 1000 ],
+ [ "car_sedan_sports_v6", 1000 ],
+ [ "car_sedan_luxury_v6", 1000 ],
+ [ "car_sedan_electric", 1000 ],
+ [ "car_sedan_luxury_electric", 1000 ],
+ [ "car_sedan_sports_electric", 1000 ],
+ [ "car_coupe", 1000 ],
+ [ "car_coupe_diesel_i4", 1000 ],
+ [ "car_coupe_diesel_v6", 1000 ],
+ [ "car_coupe_muscle", 1000 ],
+ [ "car_coupe_sports_v12", 1000 ],
+ [ "car_coupe_sports_v6", 1000 ],
+ [ "car_coupe_luxury_v6", 1000 ],
+ [ "car_coupe_electric", 1000 ],
+ [ "car_coupe_luxury_electric", 1000 ],
+ [ "car_coupe_sports_electric", 1000 ],
+ [ "car_super_v12", 100 ],
[ "superbike", 50 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "motorcycle", 200 ],
[ "motorcycle_cross", 25 ],
[ "motorcycle_enduro", 50 ],
@@ -261,10 +436,31 @@
[ "car_hatch_rack", 500 ],
[ "car_mini", 250 ],
[ "beetle", 300 ],
- [ "car_sports", 100 ],
- [ "car_sports_electric", 50 ],
- [ "car_racing_electric", 5 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 100 ],
+ [ "car_shootingbrake_v12", 100 ],
+ [ "car_shootingbrake_electric", 100 ],
+ [ "car_super_v12", 100 ],
[ "superbike", 50 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "motorcycle", 200 ],
[ "motorcycle_cross", 25 ],
[ "motorcycle_enduro", 50 ],
@@ -284,6 +480,8 @@
"type": "vehicle_group",
"id": "dirtlot",
"vehicles": [
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "quad_bike", 100 ],
[ "pickup", 300 ],
[ "bicycle_dirt", 100 ],
@@ -307,7 +505,8 @@
[ "policecar_k9", 1 ],
[ "policesuv", 100 ],
[ "policesuv_k9", 1 ],
- [ "car_sports_electric", 100 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "quad_bike", 100 ],
[ "semi_truck", 500 ],
[ "cube_van", 1000 ],
@@ -315,14 +514,64 @@
[ "flatbed_truck", 1000 ],
[ "car_mini", 375 ],
[ "beetle", 750 ],
- [ "car", 1000 ],
- [ "car_diesel", 500 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
[ "car_anmlcmpt", 100 ],
[ "car_hatch", 500 ],
[ "car_hatch_diesel", 250 ],
- [ "car_luxury", 200 ],
- [ "electric_car", 750 ],
- [ "car_hybrid", 500 ],
+ [ "car_luxury", 100 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 200 ],
+ [ "car_shootingbrake_v12", 200 ],
+ [ "car_shootingbrake_electric", 200 ],
+ [ "car_shootingbrake_long_v8", 200 ],
+ [ "car_shootingbrake_long_v12", 200 ],
+ [ "car_shootingbrake_long_electric", 200 ],
+ [ "car_sedan", 1000 ],
+ [ "car_sedan_diesel_i4", 1000 ],
+ [ "car_sedan_diesel_v6", 1000 ],
+ [ "car_sedan_v8", 1000 ],
+ [ "car_sedan_sports_v12", 1000 ],
+ [ "car_sedan_sports_v6", 1000 ],
+ [ "car_sedan_luxury_v6", 1000 ],
+ [ "car_sedan_electric", 1000 ],
+ [ "car_sedan_luxury_electric", 1000 ],
+ [ "car_sedan_sports_electric", 1000 ],
+ [ "car_town", 500 ],
+ [ "car_town_diesel", 500 ],
+ [ "car_town_budget", 500 ],
+ [ "car_town_budget_superior", 500 ],
+ [ "car_town_diesel_budget", 500 ],
+ [ "car_coupe", 1000 ],
+ [ "car_coupe_diesel_i4", 1000 ],
+ [ "car_coupe_diesel_v6", 1000 ],
+ [ "car_coupe_muscle", 1000 ],
+ [ "car_coupe_sports_v12", 1000 ],
+ [ "car_coupe_sports_v6", 1000 ],
+ [ "car_coupe_luxury_v6", 1000 ],
+ [ "car_coupe_electric", 1000 ],
+ [ "car_coupe_luxury_electric", 1000 ],
+ [ "car_coupe_sports_electric", 1000 ],
+ [ "car_super_v12", 100 ],
+ [ "electric_car", 350 ],
+ [ "car_hybrid", 250 ],
[ "extended_pickup", 95 ],
[ "4seat_pickup", 125 ],
[ "hippie_van", 750 ],
@@ -337,6 +586,8 @@
[ "bicycle_electric", 200 ],
[ "motorcycle", 500 ],
[ "superbike", 50 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "motorcycle_sidecart", 300 ],
[ "shopping_cart", 1000 ],
[ "icecream_truck", 50 ],
@@ -356,11 +607,39 @@
[ "car_diesel", 2 ],
[ "car_hatch", 2 ],
[ "car_hatch_diesel", 1 ],
+ [ "car_sedan", 5 ],
+ [ "car_sedan_diesel_i4", 5 ],
+ [ "car_sedan_diesel_v6", 5 ],
+ [ "car_sedan_v8", 5 ],
+ [ "car_sedan_sports_v12", 5 ],
+ [ "car_sedan_sports_v6", 5 ],
+ [ "car_sedan_luxury_v6", 5 ],
+ [ "car_sedan_electric", 5 ],
+ [ "car_sedan_luxury_electric", 5 ],
+ [ "car_sedan_sports_electric", 5 ],
+ [ "car_town", 1 ],
+ [ "car_town_diesel", 1 ],
+ [ "car_town_budget", 1 ],
+ [ "car_town_budget_superior", 1 ],
+ [ "car_town_diesel_budget", 1 ],
+ [ "car_coupe", 5 ],
+ [ "car_coupe_diesel_i4", 5 ],
+ [ "car_coupe_diesel_v6", 5 ],
+ [ "car_coupe_muscle", 5 ],
+ [ "car_coupe_sports_v12", 5 ],
+ [ "car_coupe_sports_v6", 5 ],
+ [ "car_coupe_luxury_v6", 5 ],
+ [ "car_coupe_electric", 5 ],
+ [ "car_coupe_luxury_electric", 5 ],
+ [ "car_coupe_sports_electric", 5 ],
+ [ "car_super_v12", 1 ],
[ "car_chassis", 20 ],
[ "engine_crane", 40 ],
[ "motorcycle", 10 ],
[ "motorcycle_chassis", 20 ],
[ "portable_generator", 20 ],
+ [ "motorcycle_3wheel", 5 ],
+ [ "motorcycle_3wheel_super", 5 ],
[ "quad_bike", 10 ],
[ "quad_bike_chassis", 20 ],
[ "car_racing_electric", 5 ],
@@ -442,23 +721,76 @@
"id": "bandit_vehicles",
"type": "vehicle_group",
"//": "Vehicles used by Hell's Raiders for scouting and assaults",
- "vehicles": [ [ "pickup_technical", 150 ], [ "quad_bike", 150 ], [ "motorcycle", 300 ] ]
+ "vehicles": [
+ [ "pickup_technical", 150 ],
+ [ "quad_bike", 150 ],
+ [ "motorcycle", 300 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ]
+ ]
},
{
"type": "vehicle_group",
"id": "junkyard_vehicles",
"vehicles": [
- [ "car", 1500 ],
- [ "car_diesel", 750 ],
+ [ "car", 750 ],
+ [ "car_diesel", 350 ],
[ "car_hatch", 750 ],
[ "car_hatch_diesel", 400 ],
[ "car_luxury", 100 ],
[ "car_chassis", 2000 ],
- [ "electric_car", 400 ],
+ [ "electric_car", 200 ],
[ "car_hybrid", 400 ],
- [ "car_sports", 400 ],
- [ "car_sports_electric", 100 ],
- [ "car_racing_electric", 5 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 200 ],
+ [ "car_shootingbrake_v12", 200 ],
+ [ "car_shootingbrake_electric", 200 ],
+ [ "car_shootingbrake_long_v8", 200 ],
+ [ "car_shootingbrake_long_v12", 200 ],
+ [ "car_shootingbrake_long_electric", 200 ],
+ [ "car_sedan", 1000 ],
+ [ "car_sedan_diesel_i4", 1000 ],
+ [ "car_sedan_diesel_v6", 1000 ],
+ [ "car_sedan_v8", 1000 ],
+ [ "car_sedan_sports_v12", 1000 ],
+ [ "car_sedan_sports_v6", 1000 ],
+ [ "car_sedan_luxury_v6", 1000 ],
+ [ "car_sedan_electric", 1000 ],
+ [ "car_sedan_luxury_electric", 1000 ],
+ [ "car_sedan_sports_electric", 1000 ],
+ [ "car_town", 500 ],
+ [ "car_town_diesel", 500 ],
+ [ "car_town_budget", 500 ],
+ [ "car_town_budget_superior", 500 ],
+ [ "car_town_diesel_budget", 500 ],
+ [ "car_coupe", 1000 ],
+ [ "car_coupe_diesel_i4", 1000 ],
+ [ "car_coupe_diesel_v6", 1000 ],
+ [ "car_coupe_muscle", 1000 ],
+ [ "car_coupe_sports_v12", 1000 ],
+ [ "car_coupe_sports_v6", 1000 ],
+ [ "car_coupe_luxury_v6", 1000 ],
+ [ "car_coupe_electric", 1000 ],
+ [ "car_coupe_luxury_electric", 1000 ],
+ [ "car_coupe_sports_electric", 1000 ],
+ [ "car_super_v12", 100 ],
[ "extended_pickup", 25 ],
[ "4seat_pickup", 50 ],
[ "suv", 500 ],
@@ -477,13 +809,62 @@
"type": "vehicle_group",
"id": "dumpsite_vehicles",
"vehicles": [
- [ "car", 1000 ],
- [ "car_diesel", 500 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
[ "car_hatch", 500 ],
[ "car_hatch_diesel", 250 ],
[ "car_luxury", 100 ],
[ "car_chassis", 1200 ],
- [ "car_sports", 200 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 200 ],
+ [ "car_shootingbrake_v12", 200 ],
+ [ "car_shootingbrake_electric", 200 ],
+ [ "car_shootingbrake_long_v8", 200 ],
+ [ "car_shootingbrake_long_v12", 200 ],
+ [ "car_shootingbrake_long_electric", 200 ],
+ [ "car_sedan", 1000 ],
+ [ "car_sedan_diesel_i4", 1000 ],
+ [ "car_sedan_diesel_v6", 1000 ],
+ [ "car_sedan_v8", 1000 ],
+ [ "car_sedan_sports_v12", 1000 ],
+ [ "car_sedan_sports_v6", 1000 ],
+ [ "car_sedan_luxury_v6", 1000 ],
+ [ "car_sedan_electric", 1000 ],
+ [ "car_sedan_luxury_electric", 1000 ],
+ [ "car_sedan_sports_electric", 1000 ],
+ [ "car_town", 500 ],
+ [ "car_town_diesel", 500 ],
+ [ "car_town_budget", 500 ],
+ [ "car_town_budget_superior", 500 ],
+ [ "car_town_diesel_budget", 500 ],
+ [ "car_coupe", 1000 ],
+ [ "car_coupe_diesel_i4", 1000 ],
+ [ "car_coupe_diesel_v6", 1000 ],
+ [ "car_coupe_muscle", 1000 ],
+ [ "car_coupe_sports_v12", 1000 ],
+ [ "car_coupe_sports_v6", 1000 ],
+ [ "car_coupe_luxury_v6", 1000 ],
+ [ "car_coupe_electric", 1000 ],
+ [ "car_coupe_luxury_electric", 1000 ],
+ [ "car_coupe_sports_electric", 1000 ],
+ [ "car_super_v12", 100 ],
[ "suv", 400 ],
[ "car_mini", 250 ],
[ "car_hybrid", 200 ],
@@ -503,14 +884,45 @@
"type": "vehicle_group",
"id": "campground_vehicles",
"vehicles": [
- [ "car", 950 ],
- [ "car_diesel", 475 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
[ "car_hatch", 475 ],
[ "car_hatch_diesel", 225 ],
[ "car_anmlcmpt", 150 ],
[ "electric_car", 100 ],
[ "car_hybrid", 100 ],
[ "car_luxury", 50 ],
+ [ "car_shootingbrake_v8", 50 ],
+ [ "car_shootingbrake_v12", 50 ],
+ [ "car_shootingbrake_electric", 50 ],
+ [ "car_shootingbrake_long_v8", 50 ],
+ [ "car_shootingbrake_long_v12", 50 ],
+ [ "car_shootingbrake_long_electric", 50 ],
+ [ "car_sedan", 750 ],
+ [ "car_sedan_diesel_i4", 750 ],
+ [ "car_sedan_diesel_v6", 750 ],
+ [ "car_sedan_v8", 750 ],
+ [ "car_sedan_sports_v12", 750 ],
+ [ "car_sedan_sports_v6", 750 ],
+ [ "car_sedan_luxury_v6", 750 ],
+ [ "car_sedan_electric", 750 ],
+ [ "car_sedan_luxury_electric", 750 ],
+ [ "car_sedan_sports_electric", 750 ],
+ [ "car_town", 750 ],
+ [ "car_town_diesel", 750 ],
+ [ "car_town_budget", 750 ],
+ [ "car_town_budget_superior", 750 ],
+ [ "car_town_diesel_budget", 750 ],
+ [ "car_coupe", 750 ],
+ [ "car_coupe_diesel_i4", 750 ],
+ [ "car_coupe_diesel_v6", 750 ],
+ [ "car_coupe_muscle", 750 ],
+ [ "car_coupe_sports_v12", 750 ],
+ [ "car_coupe_sports_v6", 750 ],
+ [ "car_coupe_luxury_v6", 750 ],
+ [ "car_coupe_electric", 750 ],
+ [ "car_coupe_luxury_electric", 750 ],
+ [ "car_coupe_sports_electric", 750 ],
[ "suv", 800 ],
[ "suv_electric", 100 ],
[ "suv_electric_rack", 100 ],
@@ -533,16 +945,47 @@
"type": "vehicle_group",
"id": "forgotten_vehicles",
"vehicles": [
- [ "car", 1000 ],
- [ "car_diesel", 500 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
[ "car_hatch", 500 ],
[ "car_hatch_diesel", 250 ],
[ "car_luxury", 100 ],
+ [ "car_shootingbrake_v8", 50 ],
+ [ "car_shootingbrake_v12", 50 ],
+ [ "car_shootingbrake_electric", 50 ],
+ [ "car_shootingbrake_long_v8", 50 ],
+ [ "car_shootingbrake_long_v12", 50 ],
+ [ "car_shootingbrake_long_electric", 50 ],
+ [ "car_sedan", 750 ],
+ [ "car_sedan_diesel_i4", 750 ],
+ [ "car_sedan_diesel_v6", 750 ],
+ [ "car_sedan_v8", 750 ],
+ [ "car_sedan_sports_v12", 750 ],
+ [ "car_sedan_sports_v6", 750 ],
+ [ "car_sedan_luxury_v6", 750 ],
+ [ "car_sedan_electric", 750 ],
+ [ "car_sedan_luxury_electric", 750 ],
+ [ "car_sedan_sports_electric", 750 ],
+ [ "car_town", 500 ],
+ [ "car_town_diesel", 500 ],
+ [ "car_town_budget", 500 ],
+ [ "car_town_budget_superior", 500 ],
+ [ "car_town_diesel_budget", 500 ],
+ [ "car_coupe", 750 ],
+ [ "car_coupe_diesel_i4", 750 ],
+ [ "car_coupe_diesel_v6", 750 ],
+ [ "car_coupe_muscle", 750 ],
+ [ "car_coupe_sports_v12", 750 ],
+ [ "car_coupe_sports_v6", 750 ],
+ [ "car_coupe_luxury_v6", 750 ],
+ [ "car_coupe_electric", 750 ],
+ [ "car_coupe_luxury_electric", 750 ],
+ [ "car_coupe_sports_electric", 750 ],
+ [ "car_super_v12", 100 ],
[ "car_anmlcmpt", 100 ],
[ "suv", 400 ],
[ "rv", 200 ],
[ "van_motorhome", 50 ],
- [ "car_sports", 300 ],
[ "car_hybrid", 200 ],
[ "cube_van_cheap", 200 ],
[ "pickup", 500 ],
@@ -553,18 +996,67 @@
"type": "vehicle_group",
"id": "parkinglotbasic",
"vehicles": [
- [ "car_sports_electric", 100 ],
[ "cube_van", 1000 ],
[ "fridge_van", 750 ],
[ "car_mini", 375 ],
[ "beetle", 750 ],
- [ "car", 1000 ],
- [ "car_diesel", 500 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
[ "car_hatch", 500 ],
[ "car_hatch_diesel", 250 ],
[ "car_luxury", 200 ],
[ "car_anmlcmpt", 150 ],
- [ "electric_car", 750 ],
+ [ "electric_car", 250 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 200 ],
+ [ "car_shootingbrake_v12", 200 ],
+ [ "car_shootingbrake_electric", 200 ],
+ [ "car_shootingbrake_long_v8", 200 ],
+ [ "car_shootingbrake_long_v12", 200 ],
+ [ "car_shootingbrake_long_electric", 200 ],
+ [ "car_sedan", 1000 ],
+ [ "car_sedan_diesel_i4", 1000 ],
+ [ "car_sedan_diesel_v6", 1000 ],
+ [ "car_sedan_v8", 1000 ],
+ [ "car_sedan_sports_v12", 1000 ],
+ [ "car_sedan_sports_v6", 1000 ],
+ [ "car_sedan_luxury_v6", 1000 ],
+ [ "car_sedan_electric", 1000 ],
+ [ "car_sedan_luxury_electric", 1000 ],
+ [ "car_sedan_sports_electric", 1000 ],
+ [ "car_town", 500 ],
+ [ "car_town_diesel", 500 ],
+ [ "car_town_budget", 500 ],
+ [ "car_town_budget_superior", 500 ],
+ [ "car_town_diesel_budget", 500 ],
+ [ "car_coupe", 1000 ],
+ [ "car_coupe_diesel_i4", 1000 ],
+ [ "car_coupe_diesel_v6", 1000 ],
+ [ "car_coupe_muscle", 1000 ],
+ [ "car_coupe_sports_v12", 1000 ],
+ [ "car_coupe_sports_v6", 1000 ],
+ [ "car_coupe_luxury_v6", 1000 ],
+ [ "car_coupe_electric", 1000 ],
+ [ "car_coupe_luxury_electric", 1000 ],
+ [ "car_coupe_sports_electric", 1000 ],
+ [ "car_super_v12", 100 ],
[ "car_hybrid", 500 ],
[ "hippie_van", 750 ],
[ "pickup", 25 ],
@@ -572,6 +1064,8 @@
[ "van_mini", 300 ],
[ "motorcycle", 500 ],
[ "superbike", 50 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "motorcycle_sidecart", 300 ],
[ "underlift_tow_truck", 250 ]
]
@@ -713,6 +1207,21 @@
[ "autosweeper", 100 ],
[ "bicycle_electric", 600 ],
[ "bicycle_dirt", 750 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 50 ],
+ [ "scompact_tandem_hboard", 50 ],
+ [ "scompact_tandem_electric_stow", 50 ],
+ [ "scompact_tandem_electric_hboard", 50 ],
+ [ "scompact_tandem_2wheel_stow", 50 ],
+ [ "scompact_tandem_2wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_2wheel_stow", 50 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 50 ],
+ [ "scompact_tandem_3wheel_stow", 50 ],
+ [ "scompact_tandem_3wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_3wheel_stow", 50 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 50 ],
[ "unicycle", 50 ],
[ "scooter", 100 ],
[ "scooter_electric", 50 ],
@@ -723,6 +1232,8 @@
[ "motorcycle_enduro", 100 ],
[ "superbike", 100 ],
[ "skateboard", 75 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
[ "motorcycle_sidecart", 100 ],
[ "golf_cart", 10 ],
[ "golf_cart_4seat", 10 ]
@@ -736,9 +1247,26 @@
[ "electric_car", 100 ],
[ "suv_electric", 70 ],
[ "rara_x", 40 ],
- [ "car_sports", 30 ],
[ "car_luxury", 40 ],
- [ "car_sports_electric", 20 ]
+ [ "car_micro", 40 ],
+ [ "car_micro_hybrid", 40 ],
+ [ "car_micro_electric", 40 ],
+ [ "scompact", 40 ],
+ [ "scompact_hybrid", 40 ],
+ [ "scompact_electric", 40 ],
+ [ "scompact_tandem_stow", 40 ],
+ [ "scompact_tandem_hboard", 40 ],
+ [ "scompact_tandem_electric_stow", 40 ],
+ [ "scompact_tandem_electric_hboard", 40 ],
+ [ "scompact_tandem_2wheel_stow", 40 ],
+ [ "scompact_tandem_2wheel_hboard", 40 ],
+ [ "scompact_tandem_electric_2wheel_stow", 40 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 40 ],
+ [ "scompact_tandem_3wheel_stow", 40 ],
+ [ "scompact_tandem_3wheel_hboard", 40 ],
+ [ "scompact_tandem_electric_3wheel_stow", 40 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 40 ],
+ [ "car_super_v12", 50 ]
]
},
{
@@ -750,6 +1278,8 @@
[ "motorcycle_cross", 150 ],
[ "motorcycle_enduro", 100 ],
[ "superbike", 100 ],
+ [ "motorcycle_3wheel", 100 ],
+ [ "motorcycle_3wheel_super", 100 ],
[ "motorcycle_sidecart", 100 ],
[ "scooter", 200 ],
[ "scooter_electric", 200 ],
@@ -778,13 +1308,56 @@
"id": "oa_vg_cd_vehicles",
"//": "for cs_car_dealership",
"vehicles": [
- [ "car", 2000 ],
- [ "car_diesel", 1000 ],
+ [ "car", 1000 ],
+ [ "car_diesel", 500 ],
[ "car_hatch", 1000 ],
[ "car_hatch_diesel", 500 ],
[ "car_luxury", 1000 ],
[ "electric_car", 500 ],
[ "car_hybrid", 500 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 100 ],
+ [ "scompact_hybrid", 100 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_sedan", 1000 ],
+ [ "car_sedan_diesel_i4", 1000 ],
+ [ "car_sedan_diesel_v6", 1000 ],
+ [ "car_sedan_v8", 1000 ],
+ [ "car_sedan_sports_v12", 1000 ],
+ [ "car_sedan_sports_v6", 1000 ],
+ [ "car_sedan_luxury_v6", 1000 ],
+ [ "car_sedan_electric", 1000 ],
+ [ "car_sedan_luxury_electric", 1000 ],
+ [ "car_sedan_sports_electric", 1000 ],
+ [ "car_town", 500 ],
+ [ "car_town_diesel", 500 ],
+ [ "car_town_budget", 500 ],
+ [ "car_town_budget_superior", 500 ],
+ [ "car_town_diesel_budget", 500 ],
+ [ "car_coupe", 1000 ],
+ [ "car_coupe_diesel_i4", 1000 ],
+ [ "car_coupe_diesel_v6", 1000 ],
+ [ "car_coupe_muscle", 1000 ],
+ [ "car_coupe_sports_v12", 1000 ],
+ [ "car_coupe_sports_v6", 1000 ],
+ [ "car_coupe_luxury_v6", 1000 ],
+ [ "car_coupe_electric", 1000 ],
+ [ "car_coupe_luxury_electric", 1000 ],
+ [ "car_coupe_sports_electric", 1000 ],
[ "suv", 800 ],
[ "suv_electric", 200 ],
[ "car_mini", 400 ],
@@ -818,11 +1391,56 @@
[ "car_mini", 375 ],
[ "car_hybrid", 200 ],
[ "beetle", 750 ],
- [ "car", 1500 ],
- [ "car_diesel", 750 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
+ [ "car_micro", 100 ],
+ [ "car_micro_hybrid", 100 ],
+ [ "car_micro_electric", 100 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 50 ],
+ [ "scompact_electric", 50 ],
+ [ "scompact_tandem_stow", 50 ],
+ [ "scompact_tandem_hboard", 50 ],
+ [ "scompact_tandem_electric_stow", 50 ],
+ [ "scompact_tandem_electric_hboard", 50 ],
+ [ "scompact_tandem_2wheel_stow", 50 ],
+ [ "scompact_tandem_2wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_2wheel_stow", 50 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 50 ],
+ [ "scompact_tandem_3wheel_stow", 50 ],
+ [ "scompact_tandem_3wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_3wheel_stow", 50 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 50 ],
+ [ "car_shootingbrake_v8", 50 ],
+ [ "car_shootingbrake_v12", 50 ],
+ [ "car_shootingbrake_electric", 50 ],
+ [ "car_shootingbrake_long_v8", 50 ],
+ [ "car_shootingbrake_long_v12", 50 ],
+ [ "car_shootingbrake_long_electric", 50 ],
+ [ "car_sedan", 900 ],
+ [ "car_sedan_diesel_i4", 900 ],
+ [ "car_sedan_diesel_v6", 900 ],
+ [ "car_sedan_v8", 900 ],
+ [ "car_sedan_sports_v12", 900 ],
+ [ "car_sedan_sports_v6", 900 ],
+ [ "car_sedan_luxury_v6", 900 ],
+ [ "car_sedan_electric", 900 ],
+ [ "car_sedan_luxury_electric", 900 ],
+ [ "car_sedan_sports_electric", 900 ],
+ [ "car_coupe", 900 ],
+ [ "car_coupe_diesel_i4", 900 ],
+ [ "car_coupe_diesel_v6", 900 ],
+ [ "car_coupe_muscle", 900 ],
+ [ "car_coupe_sports_v12", 900 ],
+ [ "car_coupe_sports_v6", 900 ],
+ [ "car_coupe_luxury_v6", 900 ],
+ [ "car_coupe_electric", 900 ],
+ [ "car_coupe_luxury_electric", 900 ],
+ [ "car_coupe_sports_electric", 900 ],
+ [ "car_super_v12", 50 ],
[ "car_hatch", 750 ],
[ "car_hatch_diesel", 400 ],
- [ "car_luxury", 500 ],
+ [ "car_luxury", 175 ],
[ "suv", 800 ],
[ "suv_electric", 100 ],
[ "suv_electric_rack", 100 ],
@@ -830,13 +1448,14 @@
[ "4seat_pickup", 25 ],
[ "extended_pickup", 15 ],
[ "car_anmlcmpt", 150 ],
- [ "electric_car", 750 ],
+ [ "electric_car", 250 ],
[ "hippie_van", 750 ],
[ "motorcycle", 500 ],
[ "motorcycle_enduro", 50 ],
[ "superbike", 50 ],
- [ "motorcycle_sidecart", 50 ],
- [ "car_sports", 30 ]
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
+ [ "motorcycle_sidecart", 50 ]
]
},
{
@@ -848,18 +1467,64 @@
[ "car_mini", 375 ],
[ "car_hybrid", 200 ],
[ "beetle", 750 ],
- [ "car", 1500 ],
- [ "car_diesel", 750 ],
+ [ "car", 500 ],
+ [ "car_diesel", 250 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 100 ],
+ [ "scompact_hybrid", 100 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 50 ],
+ [ "car_shootingbrake_v12", 50 ],
+ [ "car_shootingbrake_electric", 50 ],
+ [ "car_shootingbrake_long_v8", 50 ],
+ [ "car_shootingbrake_long_v12", 50 ],
+ [ "car_shootingbrake_long_electric", 50 ],
+ [ "car_sedan", 750 ],
+ [ "car_sedan_diesel_i4", 750 ],
+ [ "car_sedan_diesel_v6", 750 ],
+ [ "car_sedan_v8", 750 ],
+ [ "car_sedan_sports_v12", 750 ],
+ [ "car_sedan_sports_v6", 750 ],
+ [ "car_sedan_luxury_v6", 750 ],
+ [ "car_sedan_electric", 750 ],
+ [ "car_sedan_luxury_electric", 750 ],
+ [ "car_sedan_sports_electric", 750 ],
+ [ "car_coupe", 750 ],
+ [ "car_coupe_diesel_i4", 750 ],
+ [ "car_coupe_diesel_v6", 750 ],
+ [ "car_coupe_muscle", 750 ],
+ [ "car_coupe_sports_v12", 750 ],
+ [ "car_coupe_sports_v6", 750 ],
+ [ "car_coupe_luxury_v6", 750 ],
+ [ "car_coupe_electric", 750 ],
+ [ "car_coupe_luxury_electric", 750 ],
+ [ "car_coupe_sports_electric", 750 ],
+ [ "car_super_v12", 50 ],
[ "car_hatch", 750 ],
[ "car_hatch_diesel", 400 ],
- [ "car_luxury", 500 ],
+ [ "car_luxury", 175 ],
[ "car_anmlcmpt", 150 ],
- [ "electric_car", 750 ],
+ [ "electric_car", 250 ],
[ "motorcycle", 500 ],
[ "motorcycle_enduro", 50 ],
[ "superbike", 50 ],
- [ "motorcycle_sidecart", 50 ],
- [ "car_sports", 30 ]
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
+ [ "motorcycle_sidecart", 50 ]
]
},
{
@@ -879,6 +1544,49 @@
[ "car_luxury", 100 ],
[ "electric_car", 500 ],
[ "car_hybrid", 400 ],
+ [ "car_micro", 100 ],
+ [ "car_micro_hybrid", 100 ],
+ [ "car_micro_electric", 100 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 50 ],
+ [ "scompact_electric", 50 ],
+ [ "scompact_tandem_stow", 50 ],
+ [ "scompact_tandem_hboard", 50 ],
+ [ "scompact_tandem_electric_stow", 50 ],
+ [ "scompact_tandem_electric_hboard", 50 ],
+ [ "scompact_tandem_2wheel_stow", 50 ],
+ [ "scompact_tandem_2wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_2wheel_stow", 50 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 50 ],
+ [ "scompact_tandem_3wheel_stow", 50 ],
+ [ "scompact_tandem_3wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_3wheel_stow", 50 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 50 ],
+ [ "car_sedan", 900 ],
+ [ "car_sedan_diesel_i4", 900 ],
+ [ "car_sedan_diesel_v6", 900 ],
+ [ "car_sedan_v8", 900 ],
+ [ "car_sedan_sports_v12", 900 ],
+ [ "car_sedan_sports_v6", 900 ],
+ [ "car_sedan_luxury_v6", 900 ],
+ [ "car_sedan_electric", 900 ],
+ [ "car_sedan_luxury_electric", 900 ],
+ [ "car_sedan_sports_electric", 900 ],
+ [ "car_town", 200 ],
+ [ "car_town_diesel", 200 ],
+ [ "car_town_budget", 200 ],
+ [ "car_town_budget_superior", 200 ],
+ [ "car_town_diesel_budget", 200 ],
+ [ "car_coupe", 900 ],
+ [ "car_coupe_diesel_i4", 900 ],
+ [ "car_coupe_diesel_v6", 900 ],
+ [ "car_coupe_muscle", 900 ],
+ [ "car_coupe_sports_v12", 900 ],
+ [ "car_coupe_sports_v6", 900 ],
+ [ "car_coupe_luxury_v6", 900 ],
+ [ "car_coupe_electric", 900 ],
+ [ "car_coupe_luxury_electric", 900 ],
+ [ "car_coupe_sports_electric", 900 ],
[ "suv", 800 ],
[ "suv_electric", 200 ],
[ "car_mini", 400 ],
@@ -943,13 +1651,56 @@
"id": "pump_station_vehicles",
"type": "vehicle_group",
"vehicles": [
- [ "car", 2000 ],
- [ "car_diesel", 1000 ],
- [ "car_luxury", 400 ],
+ [ "car", 750 ],
+ [ "car_diesel", 350 ],
+ [ "car_luxury", 150 ],
[ "car_hatch", 1000 ],
[ "car_hatch_diesel", 500 ],
- [ "electric_car", 500 ],
- [ "car_hybrid", 400 ],
+ [ "electric_car", 175 ],
+ [ "car_micro", 100 ],
+ [ "car_micro_hybrid", 100 ],
+ [ "car_micro_electric", 100 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 50 ],
+ [ "scompact_electric", 50 ],
+ [ "scompact_tandem_stow", 50 ],
+ [ "scompact_tandem_hboard", 50 ],
+ [ "scompact_tandem_electric_stow", 50 ],
+ [ "scompact_tandem_electric_hboard", 50 ],
+ [ "scompact_tandem_2wheel_stow", 50 ],
+ [ "scompact_tandem_2wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_2wheel_stow", 50 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 50 ],
+ [ "scompact_tandem_3wheel_stow", 50 ],
+ [ "scompact_tandem_3wheel_hboard", 50 ],
+ [ "scompact_tandem_electric_3wheel_stow", 50 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 50 ],
+ [ "car_sedan", 750 ],
+ [ "car_sedan_diesel_i4", 750 ],
+ [ "car_sedan_diesel_v6", 750 ],
+ [ "car_sedan_v8", 750 ],
+ [ "car_sedan_sports_v12", 750 ],
+ [ "car_sedan_sports_v6", 750 ],
+ [ "car_sedan_luxury_v6", 750 ],
+ [ "car_sedan_electric", 750 ],
+ [ "car_sedan_luxury_electric", 750 ],
+ [ "car_sedan_sports_electric", 750 ],
+ [ "car_town", 200 ],
+ [ "car_town_diesel", 200 ],
+ [ "car_town_budget", 200 ],
+ [ "car_town_budget_superior", 200 ],
+ [ "car_town_diesel_budget", 200 ],
+ [ "car_coupe", 750 ],
+ [ "car_coupe_diesel_i4", 750 ],
+ [ "car_coupe_diesel_v6", 750 ],
+ [ "car_coupe_muscle", 750 ],
+ [ "car_coupe_sports_v12", 750 ],
+ [ "car_coupe_sports_v6", 750 ],
+ [ "car_coupe_luxury_v6", 750 ],
+ [ "car_coupe_electric", 750 ],
+ [ "car_coupe_luxury_electric", 750 ],
+ [ "car_coupe_sports_electric", 750 ],
+ [ "car_hybrid", 150 ],
[ "car_mini", 250 ],
[ "suv", 800 ],
[ "suv_electric", 200 ],
@@ -973,14 +1724,64 @@
[ "car_luxury", 500 ],
[ "electric_car", 100 ],
[ "car_hybrid", 100 ],
- [ "car_sports", 300 ],
- [ "car_sports_electric", 300 ],
+ [ "car_micro", 200 ],
+ [ "car_micro_hybrid", 200 ],
+ [ "car_micro_electric", 200 ],
+ [ "scompact", 100 ],
+ [ "scompact_hybrid", 100 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 100 ],
+ [ "scompact_tandem_hboard", 100 ],
+ [ "scompact_tandem_electric_stow", 100 ],
+ [ "scompact_tandem_electric_hboard", 100 ],
+ [ "scompact_tandem_2wheel_stow", 100 ],
+ [ "scompact_tandem_2wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_2wheel_stow", 100 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 100 ],
+ [ "scompact_tandem_3wheel_stow", 100 ],
+ [ "scompact_tandem_3wheel_hboard", 100 ],
+ [ "scompact_tandem_electric_3wheel_stow", 100 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 100 ],
+ [ "car_shootingbrake_v8", 50 ],
+ [ "car_shootingbrake_v12", 50 ],
+ [ "car_shootingbrake_electric", 50 ],
+ [ "car_shootingbrake_long_v8", 50 ],
+ [ "car_shootingbrake_long_v12", 50 ],
+ [ "car_shootingbrake_long_electric", 50 ],
+ [ "car_sedan", 750 ],
+ [ "car_sedan_diesel_i4", 750 ],
+ [ "car_sedan_diesel_v6", 750 ],
+ [ "car_sedan_v8", 750 ],
+ [ "car_sedan_sports_v12", 750 ],
+ [ "car_sedan_sports_v6", 750 ],
+ [ "car_sedan_luxury_v6", 750 ],
+ [ "car_sedan_electric", 750 ],
+ [ "car_sedan_luxury_electric", 750 ],
+ [ "car_sedan_sports_electric", 750 ],
+ [ "car_town", 250 ],
+ [ "car_town_diesel", 250 ],
+ [ "car_town_budget", 250 ],
+ [ "car_town_budget_superior", 250 ],
+ [ "car_town_diesel_budget", 250 ],
+ [ "car_coupe", 750 ],
+ [ "car_coupe_diesel_i4", 750 ],
+ [ "car_coupe_diesel_v6", 750 ],
+ [ "car_coupe_muscle", 750 ],
+ [ "car_coupe_sports_v12", 750 ],
+ [ "car_coupe_sports_v6", 750 ],
+ [ "car_coupe_luxury_v6", 750 ],
+ [ "car_coupe_electric", 750 ],
+ [ "car_coupe_luxury_electric", 750 ],
+ [ "car_coupe_sports_electric", 750 ],
+ [ "car_super_v12", 400 ],
[ "suv", 500 ],
[ "suv_electric", 500 ],
[ "car_mini", 500 ],
[ "beetle", 500 ],
[ "motorcycle", 200 ],
[ "superbike", 200 ],
+ [ "motorcycle_3wheel", 150 ],
+ [ "motorcycle_3wheel_super", 150 ],
[ "motorcycle_sidecart", 100 ],
[ "scooter", 100 ],
[ "scooter_electric", 150 ],
@@ -1057,7 +1858,27 @@
[ "car_hatch", 750 ],
[ "car_hatch_diesel", 400 ],
[ "car_hatch_rack", 200 ],
- [ "car_sports", 50 ]
+ [ "car_sports", 50 ],
+ [ "motorcycle_3wheel", 50 ],
+ [ "motorcycle_3wheel_super", 50 ],
+ [ "car_micro", 300 ],
+ [ "car_micro_hybrid", 300 ],
+ [ "car_micro_electric", 300 ],
+ [ "scompact", 50 ],
+ [ "scompact_hybrid", 150 ],
+ [ "scompact_electric", 100 ],
+ [ "scompact_tandem_stow", 150 ],
+ [ "scompact_tandem_hboard", 150 ],
+ [ "scompact_tandem_electric_stow", 150 ],
+ [ "scompact_tandem_electric_hboard", 150 ],
+ [ "scompact_tandem_2wheel_stow", 150 ],
+ [ "scompact_tandem_2wheel_hboard", 150 ],
+ [ "scompact_tandem_electric_2wheel_stow", 150 ],
+ [ "scompact_tandem_electric_2wheel_hboard", 150 ],
+ [ "scompact_tandem_3wheel_stow", 150 ],
+ [ "scompact_tandem_3wheel_hboard", 150 ],
+ [ "scompact_tandem_electric_3wheel_stow", 150 ],
+ [ "scompact_tandem_electric_3wheel_hboard", 150 ]
]
}
]
diff --git a/data/json/vehicleparts/doors.json b/data/json/vehicleparts/doors.json
index 2be1e537ff515..c6e67a23586e4 100644
--- a/data/json/vehicleparts/doors.json
+++ b/data/json/vehicleparts/doors.json
@@ -128,17 +128,17 @@
"requirements": {
"install": {
"skills": [ [ "mechanics", 2 ] ],
- "time": "60 m",
+ "time": "70 m",
"using": [ [ "welding_standard", 120 ], [ "vehicle_bolt_install", 1 ] ]
},
"removal": {
"skills": [ [ "mechanics", 2 ] ],
- "time": "15 m",
+ "time": "40 m",
"using": [ [ "vehicle_weld_removal", 1 ], [ "vehicle_wrench_2", 1 ] ]
},
"repair": { "skills": [ [ "mechanics", 3 ] ], "time": "5 m", "using": [ [ "repair_welding_standard", 3 ] ] }
},
- "size": "37500 ml",
+ "size": "200 L",
"extend": { "flags": [ "LOCKABLE_CARGO", "MULTISQUARE", "COVERED" ] },
"type": "vehicle_part"
},
@@ -171,11 +171,12 @@
},
"removal": {
"skills": [ [ "mechanics", 2 ] ],
- "time": "30 m",
+ "time": "50 m",
"using": [ [ "vehicle_weld_removal", 1 ], [ "vehicle_wrench_2", 1 ] ]
},
"repair": { "skills": [ [ "mechanics", 4 ] ], "time": "8 m", "using": [ [ "repair_welding_standard", 4 ] ] }
},
+ "size": "100 L",
"type": "vehicle_part"
},
{
diff --git a/data/json/vehicleparts/vehicle_parts.json b/data/json/vehicleparts/vehicle_parts.json
index fc424794b1d38..cb1d8c08f4b21 100644
--- a/data/json/vehicleparts/vehicle_parts.json
+++ b/data/json/vehicleparts/vehicle_parts.json
@@ -794,6 +794,39 @@
"broken_color": "brown",
"damage_modifier": 80,
"durability": 350,
+ "size": "300 L",
+ "//": "300 L storage based on an average station wagon trunk being around 600 L, and our cars having two tiles.",
+ "item": "frame",
+ "//1": "120cm weld to install, 30cm per damage quadrant for repair",
+ "location": "center",
+ "requirements": {
+ "install": {
+ "skills": [ [ "mechanics", 1 ] ],
+ "time": "20 m",
+ "using": [ [ "welding_standard", 120 ], [ "vehicle_bolt_install", 1 ] ]
+ },
+ "removal": {
+ "skills": [ [ "mechanics", 2 ] ],
+ "time": "20 m",
+ "using": [ [ "vehicle_weld_removal", 1 ], [ "vehicle_wrench_2", 1 ] ]
+ },
+ "repair": { "skills": [ [ "mechanics", 2 ] ], "time": "5 m", "using": [ [ "repair_welding_standard", 3 ] ] }
+ },
+ "flags": [ "CARGO", "LOCKABLE_CARGO", "COVERED", "BOARDABLE", "SIMPLE_PART" ],
+ "breaks_into": "ig_vp_frame",
+ "damage_reduction": { "all": 30 },
+ "variants": [ { "symbols": "H", "symbols_broken": "#" } ]
+ },
+ {
+ "type": "vehicle_part",
+ "id": "trunk_sedan",
+ "name": { "str": "sedan trunk" },
+ "looks_like": "trunk",
+ "categories": [ "cargo" ],
+ "color": "brown",
+ "broken_color": "brown",
+ "damage_modifier": 80,
+ "durability": 350,
"size": "200 L",
"//": "200 L storage based on an average sedan trunk being around 400 L, and our cars having two tiles. We should get a taller trunk for SUVs and similar.",
"item": "frame",
@@ -812,7 +845,7 @@
},
"repair": { "skills": [ [ "mechanics", 2 ] ], "time": "5 m", "using": [ [ "repair_welding_standard", 3 ] ] }
},
- "flags": [ "CARGO", "LOCKABLE_CARGO", "COVERED", "BOARDABLE", "SIMPLE_PART" ],
+ "flags": [ "CARGO", "LOCKABLE_CARGO", "COVERED", "SIMPLE_PART", "HALF_BOARD" ],
"breaks_into": "ig_vp_frame",
"damage_reduction": { "all": 30 },
"variants": [ { "symbols": "H", "symbols_broken": "#" } ]
diff --git a/data/json/vehicles/bikes.json b/data/json/vehicles/bikes.json
index 42ff2cd5b966e..2e36cd3eea34b 100644
--- a/data/json/vehicles/bikes.json
+++ b/data/json/vehicles/bikes.json
@@ -123,6 +123,41 @@
{ "x": 0, "y": 1, "chance": 33, "items": [ "helmet_motor" ] }
]
},
+ {
+ "abstract": "motorcycle_3wheel_abstract",
+ "type": "vehicle",
+ "name": "Three-Wheel Motorcycle",
+ "//": "Based on CanAm three-wheelers",
+ "blueprint": [
+ [ " O" ],
+ [ "o#>o" ],
+ [ " O" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#vertical_2", "saddle#motor" ] },
+ { "x": 0, "y": 0, "parts": [ "controls", "controls_electronic", "vehicle_alarm" ] },
+ { "x": 1, "y": 0, "parts": [ "frame_handle", { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": 1, "y": 0, "parts": [ "motorcycle_headlight", "battery_motorbike" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#cover", "box" ] },
+ { "x": 2, "y": 0, "parts": [ "horn_car" ] },
+ { "x": 2, "y": -1, "parts": [ "frame#horizontal", "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#horizontal", "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#vertical", "wheel_mount_medium", "wheel" ] },
+ { "x": -1, "y": 0, "parts": [ "muffler", "box" ] }
+ ]
+ },
+ {
+ "id": "motorcycle_3wheel",
+ "type": "vehicle",
+ "copy-from": "motorcycle_3wheel_abstract",
+ "parts": [ { "x": 2, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] } ]
+ },
+ {
+ "id": "motorcycle_3wheel_super",
+ "type": "vehicle",
+ "copy-from": "motorcycle_3wheel_abstract",
+ "parts": [ { "x": 2, "y": 0, "parts": [ "engine_inline4", "alternator_motorbike" ] } ]
+ },
{
"id": "quad_bike",
"type": "vehicle",
@@ -140,7 +175,7 @@
"y": 0,
"parts": [ "motorcycle_headlight", { "part": "tank_small", "fuel": "gasoline" }, "plating_steel" ]
},
- { "x": -1, "y": 0, "parts": [ "frame#horizontal", "muffler", "trunk" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#horizontal", "muffler", "box" ] },
{ "x": 1, "y": 1, "parts": [ "frame#horizontal", "wheel_mount_light_steerable", "wheel_motorbike_or" ] },
{ "x": 1, "y": -1, "parts": [ "frame#horizontal", "wheel_mount_light_steerable", "wheel_motorbike_or" ] },
{ "x": -1, "y": -1, "parts": [ "frame#horizontal", "wheel_mount_light", "wheel_motorbike_or#rear" ] },
diff --git a/data/json/vehicles/cars.json b/data/json/vehicles/cars.json
index ce380b2532427..1216abddde35c 100644
--- a/data/json/vehicles/cars.json
+++ b/data/json/vehicles/cars.json
@@ -102,8 +102,8 @@
{ "x": 1, "y": 2, "parts": [ "frame#vertical_right", "windshield#wheel_right" ] },
{ "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
{ "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] },
- { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "trunk" ] },
- { "x": 2, "y": 1, "parts": [ "frame#horizontal_front", "trunk" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "trunk_sedan" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#horizontal_front", "trunk_sedan" ] },
{ "x": 2, "y": 1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
{ "x": 2, "y": 2, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] },
{ "x": -1, "y": -1, "parts": [ "frame#sw", "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
@@ -170,7 +170,7 @@
{
"abstract": "car_abstract_no_items_1_missing_wheel",
"type": "vehicle",
- "name": "Car",
+ "name": "Station Wagon",
"blueprint": [
[ "-o++o-" ],
[ "+=##'|" ],
@@ -261,7 +261,7 @@
"id": "car_rack",
"type": "vehicle",
"copy-from": "car",
- "name": "Car with Bike Rack",
+ "name": "Station Wagon with Bike Rack",
"parts": [
{ "x": -3, "y": -1, "parts": [ "bike_rack" ] },
{ "x": -3, "y": 0, "parts": [ "bike_rack" ] },
@@ -272,7 +272,7 @@
{
"id": "car_luxury",
"type": "vehicle",
- "name": "Luxury Car",
+ "name": "Luxury Station Wagon",
"blueprint": [
[ "-o++o-" ],
[ "+=##'|" ],
@@ -329,7 +329,7 @@
"id": "car_anmlcmpt",
"type": "vehicle",
"//": "animal compartment version",
- "name": "Car",
+ "name": "Station Wagon",
"blueprint": [
[ "-o++o-" ],
[ "+=##'|" ],
@@ -525,6 +525,354 @@
{ "x": -1, "y": 0, "chance": 5, "items": [ "mag_glam" ] }
]
},
+ {
+ "abstract": "car_micro_abstract",
+ "type": "vehicle",
+ "name": "Microcar",
+ "blueprint": [
+ [ "o+o" ],
+ [ "+#'" ],
+ [ "+#'" ],
+ [ "o+o" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#cross", "seat#windshield_front", "seatbelt", "controls", "stereo" ] },
+ { "x": 0, "y": 0, "parts": [ "dashboard", "vehicle_alarm", "horn_car" ] },
+ { "x": 0, "y": 0, "parts": [ "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#cross", "seat#windshield_front", "seatbelt", "roof" ] },
+ { "x": 0, "y": 2, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left", "headlight" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal_2", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#horizontal_2", "windshield#cover_right" ] },
+ { "x": 1, "y": 2, "parts": [ "frame#vertical_T_right", "windshield#wheel_right", "headlight" ] },
+ { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#sw" ] },
+ { "x": -1, "y": -1, "parts": [ "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#horizontal_rear", "hatch" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#horizontal_rear", "hatch" ] },
+ { "x": -1, "y": 2, "parts": [ "frame#se" ] },
+ { "x": -1, "y": 2, "parts": [ "halfboard#hatch_wheel_right", "wheel_mount_medium", "wheel" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 50, "item_groups": [ "car_misc" ] },
+ { "x": -1, "y": 0, "chance": 5, "items": [ "mag_glam" ] }
+ ]
+ },
+ {
+ "id": "car_micro",
+ "type": "vehicle",
+ "copy-from": "car_micro_abstract",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_inline4", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "muffler" ] }
+ ]
+ },
+ {
+ "id": "car_micro_hybrid",
+ "type": "vehicle",
+ "copy-from": "car_micro_abstract",
+ "name": "Hybrid Microcar",
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "smart_engine_controller" ] },
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_truck" ] },
+ { "x": 1, "y": 1, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 2, "parts": [ "medium_storage_battery" ] },
+ { "x": -1, "y": 0, "parts": [ "muffler" ] }
+ ]
+ },
+ {
+ "id": "car_micro_electric",
+ "type": "vehicle",
+ "copy-from": "car_micro_abstract",
+ "name": "Electric Microcar",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 2, "parts": [ "storage_battery" ] }
+ ]
+ },
+ {
+ "abstract": "scompact_abstract",
+ "type": "vehicle",
+ "name": "Supercompact Car",
+ "blueprint": [
+ [ "o+o" ],
+ [ "+#'" ],
+ [ "o+o" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#cross", "seat#windshield_front", "seatbelt", "controls", "stereo" ] },
+ { "x": 0, "y": 0, "parts": [ "dashboard", "vehicle_alarm", "horn_car" ] },
+ { "x": 0, "y": 0, "parts": [ "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left", "headlight" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal_2", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#vertical_T_right", "windshield#wheel_right", "headlight" ] },
+ { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#sw" ] },
+ { "x": -1, "y": -1, "parts": [ "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#horizontal_rear", "hatch" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#se" ] },
+ { "x": -1, "y": 1, "parts": [ "halfboard#hatch_wheel_right", "wheel_mount_medium", "wheel" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 50, "item_groups": [ "car_misc" ] },
+ { "x": -1, "y": 0, "chance": 5, "items": [ "mag_glam" ] }
+ ]
+ },
+ {
+ "id": "scompact",
+ "type": "vehicle",
+ "copy-from": "car_micro_abstract",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "muffler" ] }
+ ]
+ },
+ {
+ "id": "scompact_hybrid",
+ "type": "vehicle",
+ "copy-from": "car_micro_abstract",
+ "name": "Hybrid Supercompact Car",
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "smart_engine_controller" ] },
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_truck" ] },
+ { "x": -1, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "muffler" ] },
+ { "x": -1, "y": 1, "parts": [ "medium_storage_battery" ] }
+ ]
+ },
+ {
+ "id": "scompact_electric",
+ "type": "vehicle",
+ "copy-from": "car_micro_abstract",
+ "name": "Electric Supercompact Car",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] }
+ ]
+ },
+ {
+ "abstract": "scompact_tandem_abstract",
+ "type": "vehicle",
+ "name": "Supercompact Tandem Car",
+ "blueprint": [
+ [ "o-+o" ],
+ [ "+##'" ],
+ [ "o-+o" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#cross", "seat#windshield_front", "seatbelt", "controls", "stereo" ] },
+ { "x": 0, "y": 0, "parts": [ "dashboard", "vehicle_alarm", "horn_car" ] },
+ { "x": 0, "y": 0, "parts": [ "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left", "headlight" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal_2", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#vertical_T_right", "windshield#wheel_right", "headlight" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#cross", "seat#rear", "seatbelt", "roof" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#vertical_left", "halfboard#vertical_left" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#vertical_right", "halfboard#vertical_right" ] },
+ { "x": -2, "y": -1, "parts": [ "frame#sw" ] },
+ { "x": -2, "y": 0, "parts": [ "frame#horizontal_rear" ] },
+ { "x": -2, "y": 1, "parts": [ "frame#se" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 50, "item_groups": [ "car_misc" ] },
+ { "x": -1, "y": 0, "chance": 5, "items": [ "mag_glam" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_stow",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "muffler" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "stowboard#horizontal_rear" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_hboard",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "muffler" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "halfboard#horizontal" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_electric_stow",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Electric Supercompact Tandem Car",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "stowboard#horizontal_rear" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_electric_hboard",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Electric Supercompact Tandem Car",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "halfboard#horizontal" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_2wheel_stow",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Tandem Cabin Motorcycle",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": 0, "parts": [ "wheel_mount_light", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#sw", "muffler" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#se" ] },
+ { "x": -2, "y": 0, "parts": [ "stowboard#horizontal_rear" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_2wheel_hboard",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Tandem Cabin Motorcycle",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": 0, "parts": [ "wheel_mount_light", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#sw", "muffler" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#se" ] },
+ { "x": -2, "y": 0, "parts": [ "halfboard#horizontal" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_electric_2wheel_stow",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Electric Tandem Cabin Motorcycle",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": 0, "parts": [ "wheel_mount_light", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#sw" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#se" ] },
+ { "x": -2, "y": 0, "parts": [ "stowboard#horizontal_rear" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_electric_2wheel_hboard",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Electric Tandem Cabin Motorcycle",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": 0, "parts": [ "wheel_mount_light", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#sw" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#se" ] },
+ { "x": -2, "y": 0, "parts": [ "halfboard#horizontal" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_3wheel_stow",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Tandem Three-Wheeled Supercompact Car",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#hatch_wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "stowboard#horizontal_rear" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_3wheel_hboard",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Tandem Three-Wheeled Supercompact Car",
+ "parts": [
+ { "x": 1, "y": 0, "parts": [ "engine_vtwin", "alternator_motorbike" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank_medium", "fuel": "gasoline" } ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#hatch_wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "halfboard#horizontal" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_electric_3wheel_stow",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Electric Tandem Three-Wheeled Supercompact Car",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#hatch_wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "stowboard#horizontal_rear" ] }
+ ]
+ },
+ {
+ "id": "scompact_tandem_electric_3wheel_hboard",
+ "type": "vehicle",
+ "copy-from": "scompact_tandem_abstract",
+ "name": "Electric Tandem Three-Wheeled Supercompact Car",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric" ] },
+ { "x": -1, "y": -1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 1, "y": 0, "parts": [ "wheel_mount_light_steerable", "wheel_motorbike" ] },
+ { "x": -2, "y": -1, "parts": [ "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 1, "parts": [ "halfboard#hatch_wheel_right", "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "halfboard#horizontal" ] }
+ ]
+ },
{
"abstract": "car_hatch_abstract",
"type": "vehicle",
@@ -641,7 +989,7 @@
{ "x": -2, "y": -1, "parts": [ "frame#sw", "halfboard#hatch_wheel_left", "wheel_mount_medium" ] },
{ "x": -2, "y": -1, "parts": [ "wheel_slick" ] },
{ "x": -2, "y": 0, "parts": [ "frame#horizontal_rear", "door_trunk#wheel_left" ] },
- { "x": -2, "y": 1, "parts": [ "frame#horizontal_rear", "door_trunk#wheel_left" ] },
+ { "x": -2, "y": 1, "parts": [ "frame#horizontal_rear", "door_trunk#wheel_right" ] },
{ "x": -2, "y": 2, "parts": [ "frame#se", "halfboard#hatch_wheel_right", "wheel_mount_medium" ] },
{ "x": -2, "y": 2, "parts": [ "wheel_slick" ] }
],
@@ -652,6 +1000,827 @@
{ "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
]
},
+ {
+ "abstract": "car_shootingbrake_abstract",
+ "type": "vehicle",
+ "name": "Shooting Brake",
+ "blueprint": [
+ [ "o-+o-" ],
+ [ "+=#'|" ],
+ [ "+=#'|" ],
+ [ "o-+o-" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#cross", "seat_leather#windshield_front", "seatbelt", "controls" ] },
+ { "x": 0, "y": 0, "parts": [ "dashboard", "stereo", "vehicle_alarm", "horn_car", "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#cross", "seat_leather#windshield_front", "seatbelt", "roof" ] },
+ { "x": 0, "y": 2, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal_2", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#horizontal_2", "windshield#cover_right" ] },
+ { "x": 1, "y": 2, "parts": [ "frame#vertical_T_right", "windshield#wheel_right" ] },
+ { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "halfboard#cover_left" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#horizontal_front", "halfboard#cover_right" ] },
+ { "x": 2, "y": 2, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#vertical_left", "halfboard#vertical_left" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#cross", "trunk", "muffler", "roof" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#cross", "trunk", "roof" ] },
+ { "x": -1, "y": 2, "parts": [ "frame#vertical_right", "halfboard#vertical_right" ] },
+ { "x": -2, "y": -1, "parts": [ "frame#sw", "halfboard#hatch_wheel_left", "wheel_mount_medium" ] },
+ { "x": -2, "y": -1, "parts": [ "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "frame#horizontal_rear", "door_trunk" ] },
+ { "x": -2, "y": 1, "parts": [ "frame#horizontal_rear", "door_trunk" ] },
+ { "x": -2, "y": 2, "parts": [ "frame#se", "halfboard#hatch_wheel_right", "wheel_mount_medium" ] },
+ { "x": -2, "y": 2, "parts": [ "wheel" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 1, "chance": 90, "item_groups": [ "car_kit" ] },
+ { "x": -1, "y": 1, "chance": 10, "item_groups": [ "spare_tire_kit_small_jack" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_shootingbrake_v8",
+ "type": "vehicle",
+ "copy-from": "car_shootingbrake_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v8", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] }
+ ],
+ "items": [ { "x": -1, "y": 0, "chance": 2, "item_groups": [ "hunting_lodge_weapons" ] } ]
+ },
+ {
+ "id": "car_shootingbrake_v12",
+ "type": "vehicle",
+ "copy-from": "car_shootingbrake_abstract",
+ "name": "Premium Shooting Brake",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v12", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] }
+ ],
+ "items": [ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "hunting_lodge_weapons" ] } ]
+ },
+ {
+ "id": "car_shootingbrake_electric",
+ "type": "vehicle",
+ "copy-from": "car_shootingbrake_abstract",
+ "name": "Electric Shooting Brake",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric_enhanced" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "hunting_lodge_weapons" ] } ]
+ },
+ {
+ "abstract": "car_shootingbrake_long_abstract",
+ "type": "vehicle",
+ "name": "Shooting Brake",
+ "blueprint": [
+ [ "o-+o-" ],
+ [ "+=#'|" ],
+ [ "+=#'|" ],
+ [ "o-+o-" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#cross", "seat_leather#windshield_front", "seatbelt", "controls" ] },
+ { "x": 0, "y": 0, "parts": [ "dashboard", "stereo", "vehicle_alarm", "horn_car", "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#cross", "seat_leather#windshield_front", "seatbelt", "roof" ] },
+ { "x": 0, "y": 2, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal_2", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#horizontal_2", "windshield#cover_right" ] },
+ { "x": 1, "y": 2, "parts": [ "frame#vertical_T_right", "windshield#wheel_right" ] },
+ { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "halfboard#cover_left" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#horizontal_front", "halfboard#cover_right" ] },
+ { "x": 2, "y": 2, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#vertical_left", "halfboard#vertical_left" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#vertical", "roof" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#vertical", "roof" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#right", "seatbelt" ] },
+ { "x": -1, "y": 2, "parts": [ "frame#vertical_right", "halfboard#vertical_right" ] },
+ { "x": -2, "y": -1, "parts": [ "frame#vertical_left", "halfboard#vertical_left" ] },
+ { "x": -2, "y": 0, "parts": [ "frame#cross", "trunk", "muffler", "roof" ] },
+ { "x": -2, "y": 1, "parts": [ "frame#cross", "trunk", "roof" ] },
+ { "x": -2, "y": 2, "parts": [ "frame#vertical_right", "halfboard#vertical_right" ] },
+ { "x": -3, "y": -1, "parts": [ "frame#sw", "halfboard#hatch_wheel_left", "wheel_mount_medium" ] },
+ { "x": -3, "y": -1, "parts": [ "wheel" ] },
+ { "x": -3, "y": 0, "parts": [ "frame#horizontal_rear", "door_trunk" ] },
+ { "x": -3, "y": 1, "parts": [ "frame#horizontal_rear", "door_trunk" ] },
+ { "x": -3, "y": 2, "parts": [ "frame#se", "halfboard#hatch_wheel_right", "wheel_mount_medium" ] },
+ { "x": -3, "y": 2, "parts": [ "wheel" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 1, "chance": 90, "item_groups": [ "car_kit" ] },
+ { "x": -1, "y": 1, "chance": 10, "item_groups": [ "spare_tire_kit_small_jack" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_shootingbrake_long_v8",
+ "type": "vehicle",
+ "copy-from": "car_shootingbrake_long_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v8", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] }
+ ],
+ "items": [ { "x": -1, "y": 0, "chance": 2, "item_groups": [ "hunting_lodge_weapons" ] } ]
+ },
+ {
+ "id": "car_shootingbrake_long_v12",
+ "type": "vehicle",
+ "copy-from": "car_shootingbrake_long_abstract",
+ "name": "Premium Shooting Brake",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v12", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] }
+ ],
+ "items": [ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "hunting_lodge_weapons" ] } ]
+ },
+ {
+ "id": "car_shootingbrake_long_electric",
+ "type": "vehicle",
+ "copy-from": "car_shootingbrake_long_abstract",
+ "name": "Electric Shooting Brake",
+ "parts": [
+ { "x": -3, "y": 0, "parts": [ "engine_electric_enhanced" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "hunting_lodge_weapons" ] } ]
+ },
+ {
+ "abstract": "car_sedan_abstract",
+ "type": "vehicle",
+ "name": "Sedan",
+ "blueprint": [
+ [ "-o++o-" ],
+ [ "='##'|" ],
+ [ "='##'|" ],
+ [ "-o++o-" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#vertical_2" ] },
+ { "x": 0, "y": 0, "parts": [ "controls", "dashboard", "vehicle_alarm" ] },
+ { "x": 0, "y": 0, "parts": [ "stereo", "horn_car", "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": 0, "y": 2, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#horizontal", "windshield#cover_right" ] },
+ { "x": 1, "y": 2, "parts": [ "frame#vertical_T_right", "windshield#wheel_right" ] },
+ { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "halfboard#cover_left" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#horizontal_front", "halfboard#cover_right" ] },
+ { "x": 2, "y": 2, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#vertical_left", "door#sw" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": -1, "y": 2, "parts": [ "frame#vertical_right", "door#se" ] },
+ { "x": -2, "y": -1, "parts": [ "frame#vertical_left", "windshield#wheel_left" ] },
+ { "x": -2, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "frame#cross", "windshield#horizontal_rear" ] },
+ { "x": -2, "y": 1, "parts": [ "frame#cross", "windshield#horizontal_rear" ] },
+ { "x": -2, "y": 2, "parts": [ "frame#vertical_right", "windshield#wheel_right" ] },
+ { "x": -2, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] },
+ { "x": -3, "y": -1, "parts": [ "frame#horizontal_rear", "halfboard#sw" ] },
+ { "x": -3, "y": 0, "parts": [ "frame#horizontal_rear", "muffler", "trunk_sedan" ] },
+ { "x": -3, "y": 1, "parts": [ "frame#horizontal_rear", "trunk_sedan" ] },
+ { "x": -3, "y": 2, "parts": [ "frame#horizontal_rear", "halfboard#se" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 90, "item_groups": [ "car_misc" ] },
+ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] },
+ { "x": -3, "y": 1, "chance": 90, "item_groups": [ "car_kit" ] },
+ { "x": -3, "y": 1, "chance": 40, "item_groups": [ "spare_tire_kit_small_jack" ] }
+ ]
+ },
+ {
+ "id": "car_sedan",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_inline4", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] },
+ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] }
+ ]
+ },
+ {
+ "id": "car_sedan_diesel_i4",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "diesel_engine_inline4", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "diesel" } ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] } ]
+ },
+ {
+ "id": "car_sedan_diesel_v6",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "diesel_engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "diesel" } ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] } ]
+ },
+ {
+ "id": "car_sedan_v8",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "name": "V8 Sports Sedan",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v8", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 1, "chance": 5, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_sedan_sports_v12",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "name": "V12 Sports Sedan",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v12", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 1, "chance": 5, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_sedan_sports_v6",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "name": "V6 Sports Sedan",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 1, "chance": 5, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_sedan_luxury_v6",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "name": "Luxury Sedan",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "suits" ] } ]
+ },
+ {
+ "id": "car_sedan_electric",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "name": "Electric Sedan",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric_large" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] } ]
+ },
+ {
+ "id": "car_sedan_luxury_electric",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "name": "Luxury Electric Sedan",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric_large" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "suits" ] } ]
+ },
+ {
+ "id": "car_sedan_sports_electric",
+ "type": "vehicle",
+ "copy-from": "car_sedan_abstract",
+ "name": "Electric Sports Sedan",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric_enhanced" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#right", "seatbelt" ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 0, "chance": 5, "item_groups": [ "snacks_fancy" ] },
+ { "x": -1, "y": 1, "chance": 5, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "abstract": "car_town_abstract",
+ "type": "vehicle",
+ "name": "Town Car",
+ "blueprint": [
+ [ "-o++o-" ],
+ [ "='##'|" ],
+ [ "='#o'>" ],
+ [ "='##'|" ],
+ [ "-o++o-" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#vertical_2" ] },
+ { "x": 0, "y": 0, "parts": [ "controls", "dashboard", "vehicle_alarm" ] },
+ { "x": 0, "y": 0, "parts": [ "horn_car", "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#cross", "stereo", "box", "roof" ] },
+ { "x": 0, "y": 2, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": 0, "y": 3, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#horizontal_2", "windshield#horizontal_front" ] },
+ { "x": 1, "y": 2, "parts": [ "frame#horizontal", "windshield#cover_right" ] },
+ { "x": 1, "y": 3, "parts": [ "frame#vertical_T_right", "windshield#wheel_right" ] },
+ { "x": 1, "y": 3, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "halfboard#cover_left" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#cover", "halfboard#cover" ] },
+ { "x": 2, "y": 2, "parts": [ "frame#horizontal_front", "halfboard#cover_right" ] },
+ { "x": 2, "y": 3, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#vertical_left", "door#sw" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": -1, "y": 2, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": -1, "y": 3, "parts": [ "frame#vertical_right", "door#se" ] },
+ { "x": -2, "y": -1, "parts": [ "frame#vertical_left", "windshield#wheel_left" ] },
+ { "x": -2, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": 0, "parts": [ "frame#cross", "windshield#horizontal_rear" ] },
+ { "x": -2, "y": 1, "parts": [ "frame#cross", "windshield#horizontal_rear" ] },
+ { "x": -2, "y": 2, "parts": [ "frame#cross", "windshield#horizontal_rear" ] },
+ { "x": -2, "y": 3, "parts": [ "frame#vertical_right", "windshield#wheel_right" ] },
+ { "x": -2, "y": 3, "parts": [ "wheel_mount_medium", "wheel" ] },
+ { "x": -3, "y": -1, "parts": [ "frame#horizontal_rear", "halfboard#sw" ] },
+ { "x": -3, "y": 0, "parts": [ "frame#horizontal_rear", "muffler", "trunk_sedan" ] },
+ { "x": -3, "y": 1, "parts": [ "frame#horizontal_rear", "trunk_sedan" ] },
+ { "x": -3, "y": 2, "parts": [ "frame#horizontal_rear", "trunk_sedan" ] },
+ { "x": -3, "y": 3, "parts": [ "frame#horizontal_rear", "halfboard#se" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 90, "item_groups": [ "car_misc" ] },
+ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] },
+ { "x": 0, "y": 2, "chance": 2, "item_groups": [ "fast_food" ] },
+ { "x": -1, "y": 2, "chance": 1, "item_groups": [ "fast_food" ] },
+ { "x": -1, "y": 2, "chance": 1, "item_groups": [ "fast_food" ] },
+ { "x": -1, "y": 2, "chance": 1, "item_groups": [ "fast_food" ] },
+ { "x": -3, "y": 1, "chance": 90, "item_groups": [ "car_kit" ] },
+ { "x": -3, "y": 1, "chance": 40, "item_groups": [ "spare_tire_kit_small_jack" ] }
+ ]
+ },
+ {
+ "id": "car_town",
+ "type": "vehicle",
+ "copy-from": "car_town_abstract",
+ "parts": [
+ { "x": 2, "y": 1, "parts": [ "engine_v8", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 2, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#rear", "seatbelt" ] },
+ { "x": -1, "y": 2, "parts": [ "seat_back_leather#right", "seatbelt" ] }
+ ]
+ },
+ {
+ "id": "car_town_diesel",
+ "type": "vehicle",
+ "copy-from": "car_town_abstract",
+ "parts": [
+ { "x": 2, "y": 1, "parts": [ "diesel_engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "diesel" } ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 2, "parts": [ "reclining_seat_leather#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back_leather#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back_leather#rear", "seatbelt" ] },
+ { "x": -1, "y": 2, "parts": [ "seat_back_leather#right", "seatbelt" ] }
+ ]
+ },
+ {
+ "id": "car_town_budget",
+ "type": "vehicle",
+ "copy-from": "car_town_abstract",
+ "name": "Budget Town Car",
+ "parts": [
+ { "x": 2, "y": 1, "parts": [ "diesel_engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 2, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#rear", "seatbelt" ] },
+ { "x": -1, "y": 2, "parts": [ "seat_back#left", "seatbelt" ] }
+ ]
+ },
+ {
+ "id": "car_town_budget_superior",
+ "type": "vehicle",
+ "copy-from": "car_town_abstract",
+ "name": "Budget Town Car",
+ "parts": [
+ { "x": 2, "y": 1, "parts": [ "engine_v8", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 2, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#rear", "seatbelt" ] },
+ { "x": -1, "y": 2, "parts": [ "seat_back#left", "seatbelt" ] }
+ ]
+ },
+ {
+ "id": "car_town_diesel_budget",
+ "type": "vehicle",
+ "copy-from": "car_town_abstract",
+ "parts": [
+ { "x": 2, "y": 1, "parts": [ "diesel_engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -2, "y": -1, "parts": [ { "part": "tank", "fuel": "diesel" } ] },
+ { "x": 0, "y": 0, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 2, "parts": [ "reclining_seat#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "seat_back#left", "seatbelt" ] },
+ { "x": -1, "y": 1, "parts": [ "seat_back#rear", "seatbelt" ] },
+ { "x": -1, "y": 2, "parts": [ "seat_back#left", "seatbelt" ] }
+ ]
+ },
+ {
+ "abstract": "car_coupe_abstract",
+ "type": "vehicle",
+ "name": "Coupe",
+ "blueprint": [
+ [ "-o+o-" ],
+ [ "='#'|" ],
+ [ "='#'|" ],
+ [ "-o+o-" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#vertical_2" ] },
+ { "x": 0, "y": 0, "parts": [ "controls", "dashboard", "vehicle_alarm" ] },
+ { "x": 0, "y": 0, "parts": [ "stereo", "horn_car", "roof" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#vertical_2", "roof" ] },
+ { "x": 0, "y": 2, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_T_left", "windshield#wheel_left" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#horizontal", "windshield#cover_right" ] },
+ { "x": 1, "y": 2, "parts": [ "frame#vertical_T_right", "windshield#wheel_right" ] },
+ { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "halfboard#cover_left" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#horizontal_front", "halfboard#cover_right" ] },
+ { "x": 2, "y": 2, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#vertical_left", "windshield#wheel_left" ] },
+ { "x": -1, "y": -1, "parts": [ "wheel_mount_medium", "wheel" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#cross", "windshield#horizontal_rear" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#cross", "windshield#horizontal_rear" ] },
+ { "x": -1, "y": 2, "parts": [ "frame#vertical_right", "windshield#wheel_right" ] },
+ { "x": -1, "y": 2, "parts": [ "wheel_mount_medium", "wheel" ] },
+ { "x": -2, "y": -1, "parts": [ "frame#horizontal_rear", "halfboard#sw" ] },
+ { "x": -2, "y": 0, "parts": [ "frame#horizontal_rear", "muffler", "trunk_sedan" ] },
+ { "x": -2, "y": 1, "parts": [ "frame#horizontal_rear", "trunk_sedan" ] },
+ { "x": -2, "y": 2, "parts": [ "frame#horizontal_rear", "halfboard#se" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 90, "item_groups": [ "car_misc" ] },
+ { "x": -2, "y": 1, "chance": 90, "item_groups": [ "car_kit" ] },
+ { "x": -2, "y": 1, "chance": 40, "item_groups": [ "spare_tire_kit_small_jack" ] }
+ ]
+ },
+ {
+ "id": "car_coupe",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_inline4", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] },
+ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] }
+ ]
+ },
+ {
+ "id": "car_coupe_diesel_i4",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "diesel_engine_inline4", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "diesel" } ] },
+ { "x": 0, "y": 0, "parts": [ "seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] },
+ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] }
+ ]
+ },
+ {
+ "id": "car_coupe_diesel_v6",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "diesel_engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "diesel" } ] },
+ { "x": 0, "y": 0, "parts": [ "seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] },
+ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] }
+ ]
+ },
+ {
+ "id": "car_coupe_muscle",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "name": "Muscle Car",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v8", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat_leather#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_coupe_sports_v12",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "name": "V12 Sports Coupe",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v12", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat_leather#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_coupe_sports_v6",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "name": "V6 Sports Coupe",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat#windshield_front", "seatbelt" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 5, "item_groups": [ "snacks" ] },
+ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] }
+ ]
+ },
+ {
+ "id": "car_coupe_luxury_v6",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "name": "Luxury Coupe",
+ "parts": [
+ { "x": 2, "y": 0, "parts": [ "engine_v6", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 0, "y": 0, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat_leather#windshield_front", "seatbelt" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "suits" ] } ]
+ },
+ {
+ "id": "car_coupe_electric",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "name": "Electric Coupe",
+ "parts": [
+ { "x": -1, "y": 0, "parts": [ "engine_electric_large" ] },
+ { "x": 0, "y": 0, "parts": [ "seat#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 2, "item_groups": [ "fast_food" ] } ]
+ },
+ {
+ "id": "car_coupe_luxury_electric",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "name": "Luxury Electric Coupe",
+ "parts": [
+ { "x": -1, "y": 0, "parts": [ "engine_electric_large" ] },
+ { "x": 0, "y": 0, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "suits" ] } ]
+ },
+ {
+ "id": "car_coupe_sports_electric",
+ "type": "vehicle",
+ "copy-from": "car_coupe_abstract",
+ "name": "Electric Sports Coupe",
+ "parts": [
+ { "x": -1, "y": 0, "parts": [ "engine_electric_enhanced" ] },
+ { "x": 0, "y": 0, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 1, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "abstract": "car_super_abstract",
+ "type": "vehicle",
+ "name": "Supercar",
+ "blueprint": [
+ [ "-o+o-" ],
+ [ "|'#'=" ],
+ [ "|'#'=" ],
+ [ "-o+o-" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "xlframe#vertical_2" ] },
+ { "x": 0, "y": 0, "parts": [ "controls", "dashboard", "vehicle_alarm" ] },
+ { "x": 0, "y": 0, "parts": [ "stereo", "horn_car", "roof" ] },
+ { "x": 0, "y": 0, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": -1, "parts": [ "xlframe#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "xlframe#vertical_2", "roof" ] },
+ { "x": 0, "y": 1, "parts": [ "seat_leather#windshield_front", "seatbelt" ] },
+ { "x": 0, "y": 2, "parts": [ "xlframe#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "xlframe#vertical_T_left", "windshield#wheel_left" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] },
+ { "x": 1, "y": 0, "parts": [ "xlframe#horizontal", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "xlframe#horizontal", "windshield#cover_right" ] },
+ { "x": 1, "y": 2, "parts": [ "xlframe#vertical_T_right", "windshield#wheel_right" ] },
+ { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel_slick" ] },
+ { "x": 2, "y": -1, "parts": [ "xlframe#nw", "halfboard#nw", "headlight" ] },
+ { "x": 2, "y": 0, "parts": [ "xlframe#horizontal_front", "trunk_sedan" ] },
+ { "x": 2, "y": 1, "parts": [ "xlframe#horizontal_front", "trunk_sedan" ] },
+ { "x": 2, "y": 2, "parts": [ "xlframe#ne", "halfboard#ne", "headlight" ] },
+ { "x": -1, "y": -1, "parts": [ "xlframe#vertical_left", "halfboard#vertical" ] },
+ { "x": -1, "y": 0, "parts": [ "xlframe#cross", "windshield#horizontal_rear" ] },
+ { "x": -1, "y": 1, "parts": [ "xlframe#cross", "windshield#horizontal_rear" ] },
+ { "x": -1, "y": 2, "parts": [ "xlframe#vertical_right", "halfboard#vertical" ] },
+ { "x": -2, "y": -1, "parts": [ "xlframe#horizontal_rear", "halfboard#hatch_wheel_left" ] },
+ { "x": -2, "y": -1, "parts": [ "wheel_mount_medium", "wheel_slick" ] },
+ { "x": -2, "y": 0, "parts": [ "xlframe#horizontal_rear", "muffler", "halfboard#horizontal_rear" ] },
+ { "x": -2, "y": 1, "parts": [ "xlframe#horizontal_rear", "halfboard#horizontal_rear" ] },
+ { "x": -2, "y": 2, "parts": [ "xlframe#horizontal_rear", "halfboard#hatch_wheel_right" ] },
+ { "x": -2, "y": 2, "parts": [ "wheel_mount_medium", "wheel_slick" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 90, "item_groups": [ "car_misc" ] },
+ { "x": 2, "y": 1, "chance": 90, "item_groups": [ "car_kit" ] },
+ { "x": 2, "y": 1, "chance": 40, "item_groups": [ "spare_tire_kit_small_jack" ] },
+ { "x": 0, "y": 1, "chance": 5, "item_groups": [ "female_underwear" ] }
+ ]
+ },
+ {
+ "id": "car_super_v12",
+ "type": "vehicle",
+ "copy-from": "car_super_abstract",
+ "name": "V12 Super Car",
+ "parts": [
+ { "x": -1, "y": 0, "parts": [ "engine_v12", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": -1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_super_electric",
+ "type": "vehicle",
+ "copy-from": "car_super_abstract",
+ "name": "Electric Super Car",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric_super" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
+ {
+ "id": "car_super_electric_alt",
+ "type": "vehicle",
+ "copy-from": "car_super_abstract",
+ "name": "Electric Super Car",
+ "parts": [
+ { "x": -2, "y": 0, "parts": [ "engine_electric_enhanced" ] },
+ { "x": -2, "y": 1, "parts": [ "engine_electric_enhanced" ] },
+ { "x": 0, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": 0, "y": 1, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 0, "parts": [ "storage_battery" ] },
+ { "x": -1, "y": 1, "parts": [ "storage_battery" ] }
+ ],
+ "items": [
+ { "x": 0, "y": 0, "chance": 10, "item_groups": [ "snacks_fancy" ] },
+ { "x": 0, "y": 1, "chance": 10, "item_groups": [ "snacks_fancy" ] }
+ ]
+ },
{
"id": "car_sports_atomic",
"type": "vehicle",
diff --git a/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json b/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json
index f5e9070846b17..571482070e096 100644
--- a/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json
+++ b/data/mods/Aftershock/itemgroups/weapons/energy_gun_groups.json
@@ -41,7 +41,7 @@
"subtype": "distribution",
"ammo": 100,
"magazine": 100,
- "items": [ [ "afs_pam-41", 30 ] ]
+ "items": [ [ "afs_pam-41", 30 ], [ "afs_magnadrive_230k", 30 ] ]
},
{
"id": "afs_any_energy_mag",
@@ -66,7 +66,7 @@
"type": "item_group",
"subtype": "distribution",
"ammo": 100,
- "items": [ [ "afs_4g_plasma", 30 ] ]
+ "items": [ [ "afs_4g_plasma", 30 ], [ "afs_20g_plasma", 20 ] ]
},
{
"type": "item_group",
diff --git a/data/mods/Aftershock/items/gun/plasma.json b/data/mods/Aftershock/items/gun/plasma.json
index 016cc36d62358..8a03dd5b74ba0 100644
--- a/data/mods/Aftershock/items/gun/plasma.json
+++ b/data/mods/Aftershock/items/gun/plasma.json
@@ -26,6 +26,47 @@
"valid_mod_locations": [ [ "grip", 1 ], [ "rail", 1 ], [ "sights", 1 ], [ "sling", 1 ], [ "stock", 1 ], [ "underbarrel", 1 ] ],
"melee_damage": { "bash": 6 }
},
+ {
+ "id": "afs_magnadrive_230k",
+ "type": "GUN",
+ "name": { "str": "Magnadrive 230K" },
+ "copy-from": "afs_plasma_base",
+ "looks_like": "plasma_gun",
+ "description": "A heavy plasma railgun that easily defeats most forms of conventional armor and flash-incinerates anything behind it. Its large size and liability to overheat make it unsuitable for infantry use, but it is a common sight on military vehicles and in the hands of power-armored troops, especially when heavy armor is expected.",
+ "weight": "8500 g",
+ "volume": "4 L",
+ "longest_side": "45 cm",
+ "price": "15 kUSD",
+ "price_postapoc": "15 kUSD",
+ "range": 15,
+ "ranged_damage": [
+ { "damage_type": "bullet", "amount": 15, "armor_penetration": 30 },
+ { "damage_type": "heat", "amount": 40, "armor_penetration": 10 }
+ ],
+ "delete": { "ammo_effects": [ "FLAME" ] },
+ "extend": { "flags": [ "OVERHEATS" ] },
+ "ammo": [ "afs_shydrogen" ],
+ "dispersion": 200,
+ "ammo_to_fire": 2,
+ "overheat_threshold": 100,
+ "cooling_value": 3,
+ "heat_per_shot": 30,
+ "recoil": 30,
+ "durability": 4,
+ "loudness": 5,
+ "reload": 1800,
+ "pocket_data": [
+ {
+ "pocket_type": "MAGAZINE_WELL",
+ "holster": true,
+ "magazine_well": "120 ml",
+ "max_contains_volume": "20 L",
+ "max_contains_weight": "20 kg",
+ "item_restriction": [ "afs_20g_plasma", "afs_4g_plasma" ]
+ }
+ ],
+ "faults": [ "fault_overheat_explosion", "fault_overheat_venting", "fault_overheat_safety" ]
+ },
{
"id": "afs_pam-41",
"type": "GUN",
@@ -77,7 +118,7 @@
"charges_per_use": 2,
"use_action": [ "OXYTORCH" ],
"qualities": [ [ "WELD", 2 ] ],
- "flags": [ "ALLOWS_REMOTE_USE" ],
+ "flags": [ "ALLOWS_REMOTE_USE", "NEVER_JAMS", "NON_FOULING", "NEEDS_NO_LUBE", "OVERHEATS" ],
"gun_data": {
"dispersion": 1500,
"ammo_to_fire": 2,
@@ -88,6 +129,9 @@
"delete": { "ammo_effects": [ "FLAME", "EXPLOSIVE_SMALL" ] },
"extend": { "ammo_effects": [ "DAZZLE_BEAM" ] },
"range": 3,
+ "overheat_threshold": 100,
+ "cooling_value": 3,
+ "heat_per_shot": 27,
"ranged_damage": [
{ "damage_type": "bullet", "amount": 35, "armor_penetration": 30 },
{ "damage_type": "heat", "amount": 30, "armor_penetration": 10 }
@@ -103,6 +147,7 @@
"max_contains_weight": "20 kg",
"item_restriction": [ "afs_40g_plasma_civ" ]
}
- ]
+ ],
+ "faults": [ "fault_overheat_melting" ]
}
]
diff --git a/data/mods/Aftershock/items/magazine/plasma.json b/data/mods/Aftershock/items/magazine/plasma.json
index 80ca3b7b2d922..1a53846835a4b 100644
--- a/data/mods/Aftershock/items/magazine/plasma.json
+++ b/data/mods/Aftershock/items/magazine/plasma.json
@@ -18,6 +18,25 @@
"reload_time": 10,
"pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "airtight": true, "ammo_restriction": { "afs_shydrogen": 4 } } ]
},
+ {
+ "id": "afs_20g_plasma",
+ "looks_like": "plasma",
+ "type": "MAGAZINE",
+ "name": { "str": "20g plasma cell" },
+ "description": "A reinforced canister that can safely store up to 20 grams of solid hydrogen in a cryo-pressurized state.",
+ "weight": "30 g",
+ "volume": "120 ml",
+ "price": "1400 USD",
+ "price_postapoc": "1400 USD",
+ "material": [ "hydrogen_cell" ],
+ "symbol": "o",
+ "color": "light_blue",
+ "ammo_type": [ "afs_shydrogen" ],
+ "flags": [ "NO_UNLOAD", "NO_RELOAD" ],
+ "capacity": 4,
+ "reload_time": 10,
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "airtight": true, "ammo_restriction": { "afs_shydrogen": 20 } } ]
+ },
{
"id": "afs_40g_plasma_civ",
"looks_like": "plasma",
diff --git a/data/mods/Aftershock/region_settings.json b/data/mods/Aftershock/region_settings.json
index ef8159e15b2a1..267d30ca387e2 100644
--- a/data/mods/Aftershock/region_settings.json
+++ b/data/mods/Aftershock/region_settings.json
@@ -9,7 +9,8 @@
"afs_augmentation_clinic_1": 400,
"city_block_2": 700,
"urban_35_hospital": 875,
- "office_tower_large": 800,
+ "office_skyscraper": 400,
+ "office_tower_large": 400,
"office_tower_hiddenlab": 800,
"afs_astrobiology_lab": 300,
"mall": 700
diff --git a/data/mods/DinoMod/monsters/dinosaur.json b/data/mods/DinoMod/monsters/dinosaur.json
index 781419c0bc5b3..06d3f7369a4f5 100644
--- a/data/mods/DinoMod/monsters/dinosaur.json
+++ b/data/mods/DinoMod/monsters/dinosaur.json
@@ -70,6 +70,7 @@
"volume": "400 L",
"weight": "400 kg",
"material": [ "flesh" ],
+ "stomach_size": 4,
"aggression": 5,
"morale": 40,
"speed": 90,
@@ -87,8 +88,8 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 2 },
"grab_strength": 15,
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 } ],
- "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "WARM", "SWIMS" ],
+ "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "EAT_CARRION", 60 ] ],
+ "flags": [ "SEES", "SMELLS", "HEARS", "EATS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "WARM", "SWIMS" ],
"harvest": "dino_med_feather_pred",
"anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT", "PLAYER_CLOSE" ],
"fear_triggers": [ "FRIEND_DIED" ],
@@ -108,6 +109,7 @@
"weight": "540 kg",
"material": [ "flesh" ],
"bodytype": "ostrich",
+ "stomach_size": 5,
"aggression": 10,
"morale": 70,
"speed": 80,
@@ -125,8 +127,8 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 2 },
"grab_strength": 15,
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 } ],
- "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "WARM", "SWIMS" ],
+ "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "EAT_CARRION", 60 ] ],
+ "flags": [ "SEES", "SMELLS", "HEARS", "EATS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "WARM", "SWIMS" ],
"harvest": "dino_large_pred",
"dissect": "dissect_dino_large_pred",
"anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT", "PLAYER_CLOSE" ],
@@ -147,6 +149,7 @@
"//": "When large weights and volumes are fixed this should be 15000 L and 15000 kg",
"bodytype": "bear",
"material": [ "flesh" ],
+ "stomach_size": 150,
"aggression": 15,
"morale": 70,
"speed": 90,
@@ -163,8 +166,20 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 1 },
"grab_strength": 15,
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "LUNGE", 5 ] ],
- "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "WARM", "SWIMS", "PUSH_MON" ],
+ "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "LUNGE", 5 ], [ "EAT_CARRION", 60 ] ],
+ "flags": [
+ "SEES",
+ "SMELLS",
+ "HEARS",
+ "EATS",
+ "ANIMAL",
+ "PATH_AVOID_DANGER_1",
+ "BASHES",
+ "DESTROYS",
+ "WARM",
+ "SWIMS",
+ "PUSH_MON"
+ ],
"harvest": "dino_large_pred",
"dissect": "dissect_dino_large_pred",
"anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT", "PLAYER_CLOSE", "SOUND" ],
@@ -185,6 +200,7 @@
"//": "When large weights and volumes are fixed this should be 5000 L and 5000 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 50,
"aggression": 15,
"morale": 70,
"speed": 50,
@@ -202,8 +218,8 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 1 },
"grab_strength": 15,
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "LUNGE", 5 ] ],
- "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "WARM", "PUSH_MON" ],
+ "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "LUNGE", 5 ], [ "EAT_CARRION", 60 ] ],
+ "flags": [ "SEES", "SMELLS", "HEARS", "EATS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "WARM", "PUSH_MON" ],
"harvest": "dino_large_pred",
"dissect": "dissect_dino_large_pred",
"anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT", "PLAYER_CLOSE", "SOUND" ],
@@ -223,6 +239,7 @@
"//": "When large weights and volumes are fixed this should be 1700 L and 1700 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 17,
"aggression": 15,
"morale": 80,
"speed": 100,
@@ -240,8 +257,8 @@
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 1 },
"grab_strength": 15,
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 } ],
- "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "WARM" ],
+ "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "EAT_CARRION", 60 ] ],
+ "flags": [ "SEES", "SMELLS", "HEARS", "EATS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "WARM" ],
"harvest": "allosaurus",
"dissect": "dissect_dino_large_pred",
"anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT", "PLAYER_CLOSE", "SOUND" ],
@@ -255,13 +272,19 @@
"copy-from": "mon_allosaurus",
"default_faction": "acrocanthosaurus",
"//": "When large weights and volumes are fixed this should be 4000 L and 4000 kg",
+ "stomach_size": 40,
"speed": 75,
"melee_dice": 4,
"melee_dice_sides": 5,
"melee_damage": [ { "damage_type": "cut", "amount": 4 } ],
"hp": 300,
"zombify_into": "mon_zacrocanthosaurus",
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "LUNGE", 20 ] ],
+ "special_attacks": [
+ { "id": "teeth_grab", "cooldown": 10 },
+ { "id": "teeth_rip", "cooldown": 10 },
+ [ "LUNGE", 20 ],
+ [ "EAT_CARRION", 60 ]
+ ],
"description": "Huge predatory bipedal dinosaur with a tall ridge running the length of its back covered with heavy muscles. Its teeth are curved and serrated like sawblades.",
"reproduction": { "baby_egg": "egg_acrocanthosaurus", "baby_count": 3, "baby_timer": 24 },
"harvest": "acrocanthosaurus",
@@ -274,6 +297,7 @@
"copy-from": "mon_acrocanthosaurus",
"default_faction": "giganotosaurus",
"//": "When large weights and volumes are fixed this should be 10000 L and 10000 kg",
+ "stomach_size": 100,
"speed": 150,
"attack_cost": 150,
"melee_dice": 5,
@@ -292,6 +316,7 @@
"copy-from": "mon_allosaurus",
"default_faction": "siats",
"//": "When large weights and volumes are fixed this should be 4000 L and 4000 kg",
+ "stomach_size": 40,
"speed": 75,
"hp": 300,
"zombify_into": "mon_ziats",
@@ -300,7 +325,8 @@
{ "id": "ranged_pull", "cooldown": 20 },
{ "id": "grab_drag" },
{ "id": "drag_followup" },
- { "id": "teeth_rip", "cooldown": 10 }
+ { "id": "teeth_rip", "cooldown": 10 },
+ [ "EAT_CARRION", 60 ]
],
"description": "Huge predatory bipedal dinosaur with long claws and strong arms for grappling.",
"reproduction": { "baby_egg": "egg_siats", "baby_count": 3, "baby_timer": 24 },
@@ -324,7 +350,8 @@
"special_attacks": [
{ "id": "teeth_grab", "cooldown": 15 },
{ "id": "teeth_pull", "cooldown": 15 },
- { "type": "leap", "cooldown": 20, "max_range": 5, "allow_no_target": true }
+ { "type": "leap", "cooldown": 20, "max_range": 5, "allow_no_target": true },
+ [ "EAT_CARRION", 60 ]
]
},
{
@@ -334,6 +361,7 @@
"copy-from": "mon_gorgosaurus",
"default_faction": "appalachiosaurus",
"//": "When large weights and volumes are fixed this should be 1500 L and 1500 kg",
+ "stomach_size": 15,
"speed": 130,
"attack_cost": 130,
"melee_damage": [ { "damage_type": "cut", "amount": 14 } ],
@@ -341,7 +369,12 @@
"zombify_into": "mon_zappalachiosaurus",
"description": "Enormous teeth, fierce eyes, and a powerful frame to drive it forward, with two small arms and a feathered mullet and tail. The snout is long with six ridges.",
"reproduction": { "baby_egg": "egg_appalachiosaurus", "baby_count": 3, "baby_timer": 24 },
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 15 }, { "id": "teeth_pull", "cooldown": 15 }, [ "LUNGE", 20 ] ]
+ "special_attacks": [
+ { "id": "teeth_grab", "cooldown": 15 },
+ { "id": "teeth_pull", "cooldown": 15 },
+ [ "LUNGE", 20 ],
+ [ "EAT_CARRION", 60 ]
+ ]
},
{
"type": "MONSTER",
@@ -350,6 +383,7 @@
"copy-from": "mon_albertosaurus",
"default_faction": "gorgosaurus",
"//": "When large weights and volumes are fixed this should be 2500 L and 2500 kg",
+ "stomach_size": 25,
"morale": 80,
"speed": 60,
"attack_cost": 60,
@@ -359,7 +393,12 @@
"zombify_into": "mon_zorgosaurus",
"description": "Enormous teeth, fierce eyes, and a powerful frame to drive it forward, with two small arms and a feathered mullet and tail.",
"reproduction": { "baby_egg": "egg_gorgosaurus", "baby_count": 3, "baby_timer": 24 },
- "special_attacks": [ { "id": "teeth_grab", "cooldown": 10 }, { "id": "teeth_rip", "cooldown": 10 }, [ "LUNGE", 15 ] ]
+ "special_attacks": [
+ { "id": "teeth_grab", "cooldown": 10 },
+ { "id": "teeth_rip", "cooldown": 10 },
+ [ "LUNGE", 15 ],
+ [ "EAT_CARRION", 60 ]
+ ]
},
{
"type": "MONSTER",
@@ -373,6 +412,7 @@
"volume": "1000 L",
"weight": "1000 kg",
"//": "When large weights and volumes are fixed this should be 2000 L and 2000 kg",
+ "stomach_size": 20,
"bodytype": "ostrich",
"material": [ "flesh" ],
"aggression": 15,
@@ -392,9 +432,14 @@
"reproduction": { "baby_egg": "egg_albertosaurus", "baby_count": 3, "baby_timer": 24 },
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 1 },
- "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "WARM", "PUSH_MON" ],
+ "flags": [ "SEES", "SMELLS", "HEARS", "EATS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "WARM", "PUSH_MON" ],
"grab_strength": 15,
- "special_attacks": [ { "id": "teeth_puncture", "cooldown": 7 }, { "id": "teeth_pull", "cooldown": 5 }, [ "LUNGE", 10 ] ],
+ "special_attacks": [
+ { "id": "teeth_puncture", "cooldown": 7 },
+ { "id": "teeth_pull", "cooldown": 5 },
+ [ "LUNGE", 10 ],
+ [ "EAT_CARRION", 60 ]
+ ],
"harvest": "dino_large_feather_pred",
"dissect": "dissect_tyrant_sample_large",
"anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT", "PLAYER_CLOSE", "SOUND" ],
@@ -414,6 +459,7 @@
"weight": "767 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 7,
"aggression": 15,
"morale": 80,
"speed": 70,
@@ -437,9 +483,10 @@
{ "id": "teeth_puncture", "cooldown": 7 },
{ "id": "teeth_pull", "cooldown": 5 },
[ "LUNGE", 10 ],
- { "id": "bio_op_takedown", "cooldown": 30 }
+ { "id": "bio_op_takedown", "cooldown": 30 },
+ [ "EAT_CARRION", 60 ]
],
- "flags": [ "SEES", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "WARM", "PUSH_MON" ],
+ "flags": [ "SEES", "SMELLS", "HEARS", "EATS", "ANIMAL", "PATH_AVOID_DANGER_1", "BASHES", "DESTROYS", "WARM", "PUSH_MON" ],
"harvest": "dino_large_feather_pred",
"dissect": "dissect_tyrant_sample_large",
"anger_triggers": [ "STALK", "PLAYER_WEAK", "HURT", "PLAYER_CLOSE", "SOUND" ],
@@ -454,6 +501,7 @@
"color": "white",
"default_faction": "nanuqsaurus",
"//": "When large weights and volumes are fixed this should be 1500 L and 1500 kg",
+ "stomach_size": 15,
"speed": 50,
"attack_cost": 50,
"hp": 150,
@@ -464,7 +512,8 @@
{ "id": "teeth_puncture", "cooldown": 20 },
{ "id": "teeth_pull", "cooldown": 10 },
[ "LUNGE", 10 ],
- { "id": "bio_op_takedown", "cooldown": 20 }
+ { "id": "bio_op_takedown", "cooldown": 20 },
+ [ "EAT_CARRION", 60 ]
]
},
{
@@ -474,6 +523,7 @@
"copy-from": "mon_tyrannosaurus",
"default_faction": "daspletosaurus",
"//": "When large weights and volumes are fixed this should be 2500 L and 2500 kg",
+ "stomach_size": 25,
"melee_dice": 4,
"melee_dice_sides": 5,
"melee_damage": [ { "damage_type": "cut", "amount": 4 } ],
@@ -485,7 +535,8 @@
{ "id": "teeth_puncture", "cooldown": 10 },
{ "id": "teeth_pull", "cooldown": 10 },
[ "LUNGE", 10 ],
- { "id": "bio_op_takedown", "cooldown": 15 }
+ { "id": "bio_op_takedown", "cooldown": 15 },
+ [ "EAT_CARRION", 60 ]
],
"harvest": "dino_large_feather_pred"
},
@@ -502,6 +553,7 @@
"//": "When large weights and volumes are fixed this should be 8500 L and 8500 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 85,
"aggression": 15,
"morale": 90,
"speed": 50,
@@ -524,12 +576,14 @@
{ "id": "teeth_puncture", "cooldown": 7 },
{ "id": "teeth_pull", "cooldown": 5 },
[ "LUNGE", 10 ],
- { "id": "bio_op_takedown", "cooldown": 15 }
+ { "id": "bio_op_takedown", "cooldown": 15 },
+ [ "EAT_CARRION", 60 ]
],
"flags": [
"SEES",
"SMELLS",
"HEARS",
+ "EATS",
"ANIMAL",
"PATH_AVOID_DANGER_1",
"BASHES",
@@ -880,6 +934,7 @@
"default_faction": "saurornitholestes",
"volume": "10 L",
"weight": "10 kg",
+ "stomach_size": 1,
"speed": 150,
"attack_cost": 150,
"melee_damage": [ { "damage_type": "cut", "amount": 4 } ],
@@ -888,10 +943,12 @@
"special_attacks": [
{ "id": "teeth_grab", "cooldown": 30 },
{ "id": "teeth_rip", "cooldown": 20 },
- [ "EAT_FOOD", 20 ],
+ [ "EAT_FOOD", 60 ],
+ [ "EAT_CARRION", 60 ],
{ "type": "leap", "cooldown": 15, "max_range": 5, "allow_no_target": true }
],
- "reproduction": { "baby_egg": "egg_saurornitholestes", "baby_count": 3, "baby_timer": 18 }
+ "reproduction": { "baby_egg": "egg_saurornitholestes", "baby_count": 3, "baby_timer": 18 },
+ "extend": { "flags": [ "EATS" ] }
},
{
"type": "MONSTER",
@@ -905,6 +962,7 @@
"weight": "15 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 1,
"aggression": 0,
"morale": 20,
"speed": 140,
@@ -922,7 +980,8 @@
"special_attacks": [
{ "id": "teeth_grab", "cooldown": 20 },
{ "id": "teeth_rip", "cooldown": 10 },
- { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true }
+ { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true },
+ [ "EAT_CARRION", 60 ]
],
"description": "A small bipedal dinosaur covered with feathers. Small, hooked claws emerge from its feet and hands.",
"reproduction": { "baby_egg": "egg_velociraptor", "baby_count": 3, "baby_timer": 18 },
@@ -932,6 +991,7 @@
"SEES",
"SMELLS",
"HEARS",
+ "EATS",
"ANIMAL",
"PATH_AVOID_DANGER_1",
"KEENNOSE",
@@ -958,6 +1018,7 @@
"weight": "75 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 1,
"aggression": 1,
"morale": 50,
"speed": 80,
@@ -977,7 +1038,8 @@
"special_attacks": [
{ "id": "teeth_grab", "cooldown": 20 },
{ "id": "teeth_rip", "cooldown": 5 },
- { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true }
+ { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true },
+ [ "EAT_CARRION", 60 ]
],
"description": "A medium-sized bipedal dinosaur covered with feathers. At the end of each foot is a large sickle-like claw.",
"reproduction": { "baby_egg": "egg_deinonychus", "baby_count": 3, "baby_timer": 18 },
@@ -987,6 +1049,7 @@
"SEES",
"SMELLS",
"HEARS",
+ "EATS",
"ANIMAL",
"PATH_AVOID_DANGER_1",
"KEENNOSE",
@@ -1014,6 +1077,7 @@
"weight": "500 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 5,
"aggression": 15,
"morale": 80,
"speed": 80,
@@ -1032,13 +1096,14 @@
"special_attacks": [
{ "id": "teeth_grab", "cooldown": 20 },
{ "id": "teeth_rip", "cooldown": 5 },
- { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true }
+ { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true },
+ [ "EAT_CARRION", 60 ]
],
"description": "A large bipedal dinosaur with feathered arms, a long tail, and scythe-like claws.",
"reproduction": { "baby_egg": "egg_utahraptor", "baby_count": 3, "baby_timer": 18 },
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 2 },
- "flags": [ "SEES", "SMELLS", "HEARS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "WARM", "CLIMBS" ],
+ "flags": [ "SEES", "SMELLS", "HEARS", "EATS", "ANIMAL", "PATH_AVOID_DANGER_1", "KEENNOSE", "WARM", "CLIMBS" ],
"harvest": "dino_med_feather_pred",
"dissect": "dissect_raptor_sample_small",
"anger_triggers": [ "FRIEND_ATTACKED", "PLAYER_WEAK", "PLAYER_CLOSE", "HURT", "STALK", "SOUND" ],
@@ -1074,6 +1139,7 @@
"weight": "35 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 1,
"aggression": 0,
"morale": 50,
"speed": 100,
@@ -1089,7 +1155,8 @@
"special_attacks": [
{ "id": "teeth_grab", "cooldown": 20 },
{ "id": "teeth_rip", "cooldown": 10 },
- { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true }
+ { "type": "leap", "cooldown": 5, "max_range": 5, "allow_no_target": true },
+ [ "EAT_CARRION", 60 ]
],
"description": "A small bipedal dinosaur covered with feathers. At the end of each foot is a large sickle-like claw. Its eyes suggest intelligence.",
"reproduction": { "baby_egg": "egg_stenonychosaurus", "baby_count": 3, "baby_timer": 18 },
@@ -1099,6 +1166,7 @@
"SEES",
"SMELLS",
"HEARS",
+ "EATS",
"ANIMAL",
"PATH_AVOID_DANGER_1",
"KEENNOSE",
@@ -1126,6 +1194,7 @@
"weight": "10 kg",
"bodytype": "ostrich",
"material": [ "flesh" ],
+ "stomach_size": 1,
"aggression": -60,
"morale": -60,
"speed": 100,
@@ -1142,11 +1211,12 @@
"reproduction": { "baby_egg": "egg_eoraptor", "baby_count": 3, "baby_timer": 6 },
"baby_flags": [ "SPRING", "SUMMER" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 100 },
- "special_attacks": [ [ "EAT_FOOD", 20 ] ],
+ "special_attacks": [ [ "EAT_FOOD", 60 ], [ "EAT_CARRION", 60 ] ],
"flags": [
"SEES",
"SMELLS",
"HEARS",
+ "EATS",
"HIT_AND_RUN",
"ANIMAL",
"PATH_AVOID_DANGER_1",
@@ -2607,6 +2677,7 @@
"default_faction": "pteranodon",
"volume": "70 L",
"weight": "50 kg",
+ "stomach_size": 1,
"hp": 20,
"aggression": 9,
"morale": 50,
@@ -2618,7 +2689,7 @@
"fear_triggers": [ "FRIEND_DIED" ],
"harvest": "dino_feather_leather",
"dissect": "dissect_lizard_sample_small",
- "special_attacks": [ [ "scratch", 10 ] ]
+ "special_attacks": [ [ "scratch", 10 ], [ "EAT_CARRION", 60 ] ]
},
{
"type": "MONSTER",
@@ -2628,6 +2699,7 @@
"default_faction": "quetzalcoatlus",
"volume": "330 L",
"weight": "250 kg",
+ "stomach_size": 2,
"hp": 70,
"aggression": 9,
"morale": 80,
@@ -2635,11 +2707,12 @@
"zombify_into": "mon_zuetzalcoatlus",
"description": "A huge feathered flying reptile, with a long pointed toothless beak and a long stiff neck.",
"reproduction": { "baby_egg": "egg_quetzalcoatlus", "baby_count": 3, "baby_timer": 24 },
- "special_attacks": [ [ "scratch", 10 ] ],
+ "special_attacks": [ [ "scratch", 10 ], [ "EAT_CARRION", 60 ] ],
"flags": [
"SEES",
"SMELLS",
"HEARS",
+ "EATS",
"FLIES",
"HIT_AND_RUN",
"ANIMAL",
@@ -2668,6 +2741,7 @@
"//": "When large weights and volumes are fixed this should be 10000 L and 10000 kg",
"bodytype": "fish",
"material": [ "flesh" ],
+ "stomach_size": 100,
"aggression": 9,
"morale": 90,
"speed": 30,
@@ -2684,10 +2758,11 @@
"baby_flags": [ "SPRING", "SUMMER", "AUTUMN" ],
"biosignature": { "biosig_item": "feces_dino", "biosig_timer": 1 },
"grab_strength": 50,
- "special_attacks": [ { "id": "bite_grab", "cooldown": 7 }, [ "LUNGE", 10 ] ],
+ "special_attacks": [ { "id": "bite_grab", "cooldown": 7 }, [ "LUNGE", 10 ], [ "EAT_CARRION", 60 ] ],
"flags": [
"SEES",
"HEARS",
+ "EATS",
"ANIMAL",
"PATH_AVOID_DANGER_1",
"GRABS",
diff --git a/data/mods/Magiclysm/Spells/druid.json b/data/mods/Magiclysm/Spells/druid.json
index 93cd77c71e3c8..d20c9526f0a24 100644
--- a/data/mods/Magiclysm/Spells/druid.json
+++ b/data/mods/Magiclysm/Spells/druid.json
@@ -733,6 +733,33 @@
"max_duration": 1440000,
"duration_increment": 84000
},
+ {
+ "id": "druid_summon_tanglevine",
+ "type": "SPELL",
+ "name": "Summon Tanglevine",
+ "description": "This spell causes an animated vine to burst from the ground and attempt to seize a nearby target and hold it fast.",
+ "valid_targets": [ "ground" ],
+ "flags": [ "VERBAL", "SOMATIC" ],
+ "effect": "summon",
+ "effect_str": "mon_tanglevine",
+ "shape": "blast",
+ "spell_class": "DRUID",
+ "difficulty": 6,
+ "min_damage": 1,
+ "max_damage": 1,
+ "min_range": 5,
+ "max_range": 15,
+ "range_increment": 0.8,
+ "base_casting_time": 250,
+ "energy_source": "MANA",
+ "max_level": 15,
+ "min_duration": 12000,
+ "max_duration": 42000,
+ "duration_increment": 2000,
+ "base_energy_cost": 650,
+ "final_energy_cost": 400,
+ "energy_increment": -16.666
+ },
{
"id": "druid_beguile_savage_beast",
"type": "SPELL",
@@ -760,5 +787,52 @@
"max_duration": 90000,
"duration_increment": 4000,
"targeted_monster_species": [ "MAMMAL", "BIRD" ]
+ },
+ {
+ "id": "druid_bramble_spear",
+ "type": "SPELL",
+ "name": "Spear of Brambles",
+ "description": "This spell turns a stick into a vicious spear that drips with sticky sap.",
+ "valid_targets": [ "none" ],
+ "flags": [ "CONCENTRATE", "VERBAL", "NO_HANDS" ],
+ "//": "NO_HANDS so you can hold on to the stick and cast the spell and then be holding the spear",
+ "effect": "spawn_item",
+ "effect_str": "druid_bramble_spear_item",
+ "components": "spell_components_druid_bramble_spear",
+ "shape": "blast",
+ "energy_source": "MANA",
+ "spell_class": "DRUID",
+ "difficulty": 4,
+ "min_damage": 1,
+ "max_damage": 1,
+ "max_level": 15,
+ "base_casting_time": 1000,
+ "base_energy_cost": 350,
+ "min_duration": 24000,
+ "max_duration": 360000,
+ "duration_increment": 24000,
+ "learn_spells": { "druid_bramble_spear_enhanced": 15 }
+ },
+ {
+ "id": "druid_bramble_spear_enhanced",
+ "type": "SPELL",
+ "name": "Enhanced Spear of Brambles",
+ "description": "This spell turns a bit of bark or a twig into a vicious spear that drips with sticky sap. You now know this spell like the back of your hand, and no longer need such massive spell components as you did previously.",
+ "valid_targets": [ "none" ],
+ "flags": [ "CONCENTRATE", "VERBAL", "NO_HANDS" ],
+ "effect": "spawn_item",
+ "effect_str": "druid_bramble_spear_item",
+ "shape": "blast",
+ "energy_source": "MANA",
+ "spell_class": "DRUID",
+ "difficulty": 5,
+ "min_damage": 1,
+ "max_damage": 1,
+ "max_level": 15,
+ "base_casting_time": 1000,
+ "base_energy_cost": 250,
+ "min_duration": 360000,
+ "max_duration": 2160000,
+ "duration_increment": 72000
}
]
diff --git a/data/mods/Magiclysm/Spells/earthshaper.json b/data/mods/Magiclysm/Spells/earthshaper.json
index 0686a1ffe07af..71cc11ccb3937 100644
--- a/data/mods/Magiclysm/Spells/earthshaper.json
+++ b/data/mods/Magiclysm/Spells/earthshaper.json
@@ -885,5 +885,99 @@
"min_range": 3,
"max_range": 20,
"range_increment": 1.2
+ },
+ {
+ "id": "earthshaper_granite_aegis",
+ "type": "SPELL",
+ "name": "Granite Aegis",
+ "description": "In an extremity of danger, summon a hollow shell of rock around yourself. It lasts only a few moments, but sometimes that's all you need. You must be standing on the living earth to invoke it.",
+ "flags": [ "SOMATIC", "VERBAL" ],
+ "valid_targets": [ "self" ],
+ "max_level": 10,
+ "spell_class": "EARTHSHAPER",
+ "energy_source": "MANA",
+ "shape": "blast",
+ "difficulty": 9,
+ "effect": "effect_on_condition",
+ "effect_str": "EOC_EARTHSHAPER_GRANITE_AEGIS",
+ "base_casting_time": 150,
+ "final_casting_time": 100,
+ "casting_time_increment": -5,
+ "base_energy_cost": 750
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_EARTHSHAPER_GRANITE_AEGIS",
+ "condition": {
+ "and": [
+ {
+ "or": [
+ { "u_is_on_terrain": "t_rock_floor_no_roof" },
+ { "u_is_on_terrain": "t_rock_floor" },
+ { "u_is_on_terrain": "t_dirtfloor_no_roof" },
+ { "u_is_on_terrain": "t_clay" },
+ { "u_is_on_terrain": "t_claymound" },
+ { "u_is_on_terrain": "t_claymound_underground" },
+ { "u_is_on_terrain": "t_sandmound" },
+ { "u_is_on_terrain": "t_dirtmoundfloor" },
+ { "u_is_on_terrain": "t_dirt" },
+ { "u_is_on_terrain": "t_dirt_underground" },
+ { "u_is_on_terrain": "t_forestfloor" },
+ { "u_is_on_terrain": "t_grass" },
+ { "u_is_on_terrain": "t_grass_tall" },
+ { "u_is_on_terrain": "t_grass_dead" },
+ { "u_is_on_terrain": "t_grass_white" },
+ { "u_is_on_terrain": "t_forestfloor" },
+ { "u_is_on_terrain": "t_moss" },
+ { "u_is_on_terrain": "t_soil" },
+ { "u_is_on_terrain": "t_dirtmound" },
+ { "u_is_on_terrain": "t_region_soil" },
+ { "u_is_on_terrain": "t_pit_shallow" },
+ { "u_is_on_terrain": "t_pit" },
+ { "u_is_on_terrain": "t_puddle_underground" },
+ { "u_is_on_terrain": "t_mud" },
+ { "u_is_on_terrain": "t_mud_underground" },
+ { "u_is_on_terrain": "t_concrete_y" },
+ { "u_is_on_terrain": "t_concrete" },
+ { "u_is_on_terrain": "t_thconc_y_olight" },
+ { "u_is_on_terrain": "t_thconc_warning" },
+ { "u_is_on_terrain": "t_thconc_y" },
+ { "u_is_on_terrain": "t_thconc_r" },
+ { "u_is_on_terrain": "t_thconc_floor" },
+ { "u_is_on_terrain": "t_strconc_floor" },
+ { "u_is_on_terrain": "t_strconc_floor_olight" },
+ { "u_is_on_terrain": "t_strconc_floor_no_roof" },
+ { "u_is_on_terrain": "t_railroad_rubble" }
+ ]
+ },
+ { "math": [ "u_val('pos_z')", "<=", "0" ] }
+ ]
+ },
+ "effect": [
+ {
+ "u_location_variable": { "global_val": "earthshaper_granite_aegis_location" },
+ "min_radius": 0,
+ "max_radius": 0,
+ "outdoor_only": false
+ },
+ {
+ "u_transform_radius": 1,
+ "ter_furn_transform": "earthshaper_granite_aegis_to_stone",
+ "target_var": { "global_val": "earthshaper_granite_aegis_location" }
+ },
+ {
+ "u_transform_radius": 0,
+ "ter_furn_transform": "earthshaper_granite_aegis_to_stone_safe",
+ "target_var": { "global_val": "earthshaper_granite_aegis_location" },
+ "time_in_future": [ "0 seconds", "0 seconds" ]
+ },
+ {
+ "u_transform_radius": 1,
+ "ter_furn_transform": "earthshaper_granite_aegis_from_stone",
+ "target_var": { "global_val": "earthshaper_granite_aegis_location" },
+ "time_in_future": [ "5 seconds", "20 seconds" ]
+ }
+ ],
+ "false_effect": { "u_message": "Without a connection to the living earth or a flat surface of solid rock, the spell fails." }
}
]
diff --git a/data/mods/Magiclysm/Spells/item_only.json b/data/mods/Magiclysm/Spells/item_only.json
index 01c5e527fa043..a9d2692c4158a 100644
--- a/data/mods/Magiclysm/Spells/item_only.json
+++ b/data/mods/Magiclysm/Spells/item_only.json
@@ -766,5 +766,19 @@
"max_aoe": 4,
"flags": [ "LOUD", "RANDOM_DAMAGE", "NO_EXPLOSION_SFX" ],
"message": ""
+ },
+ {
+ "id": "bramble_spear_slow",
+ "type": "SPELL",
+ "name": "Bramble spear slow",
+ "description": "Sticky sap coats your enemies.",
+ "valid_targets": [ "hostile" ],
+ "flags": [ "RANDOM_DAMAGE" ],
+ "shape": "blast",
+ "effect": "mod_moves",
+ "min_damage": -25,
+ "max_damage": -75,
+ "min_range": 2,
+ "max_range": 2
}
]
diff --git a/data/mods/Magiclysm/Spells/technomancer.json b/data/mods/Magiclysm/Spells/technomancer.json
index 0d24ab8388841..2074309e3a9fa 100644
--- a/data/mods/Magiclysm/Spells/technomancer.json
+++ b/data/mods/Magiclysm/Spells/technomancer.json
@@ -633,5 +633,92 @@
"max_range": 7,
"min_pierce": 15,
"max_pierce": 15
+ },
+ {
+ "id": "technomancer_robot_shutdown",
+ "type": "SPELL",
+ "name": "Shutdown",
+ "description": "Overload the target, stunning it briefly. Originally developed during the Roman Empire to target out-of-control golems, this spell became significantly more popular in modern times when it was discovered it also worked on robots and machinery.",
+ "valid_targets": [ "hostile", "ally" ],
+ "flags": [ "VERBAL", "SOMATIC", "RANDOM_DAMAGE", "SILENT" ],
+ "effect": "mod_moves",
+ "shape": "blast",
+ "spell_class": "TECHNOMANCER",
+ "difficulty": 6,
+ "max_level": 15,
+ "min_range": 5,
+ "max_range": 20,
+ "range_increment": 1,
+ "min_damage": { "math": [ "( (u_val('spell_level', 'spell: technomancer_robot_shutdown') * -15) - 200)" ] },
+ "max_damage": { "math": [ "( (u_val('spell_level', 'spell: technomancer_robot_shutdown') * -25) - 400)" ] },
+ "energy_source": "MANA",
+ "base_casting_time": 150,
+ "base_energy_cost": 350,
+ "targeted_monster_species": [ "GOLEM", "ROBOT", "CYBORG" ]
+ },
+ {
+ "id": "technomancer_conjure_radio",
+ "type": "SPELL",
+ "name": "Speak through the Aether",
+ "description": "One of the most widely-known pre-modern technomantic spells, this allows technomancers to communicate at a distance. Its use declined rapidly after Guglielmo Marconi invented the radio and suddenly everyone could listen in to their conversations.",
+ "valid_targets": [ "self" ],
+ "flags": [ "CONCENTRATE", "VERBAL", "SOMATIC" ],
+ "effect": "spawn_item",
+ "effect_str": "technomancer_summoned_radio",
+ "shape": "blast",
+ "spell_class": "TECHNOMANCER",
+ "difficulty": 4,
+ "max_level": 15,
+ "min_duration": 30000,
+ "max_duration": 180000,
+ "duration_increment": 15000,
+ "energy_source": "MANA",
+ "base_casting_time": 6000,
+ "base_energy_cost": 450
+ },
+ {
+ "id": "technomancer_conjure_ups",
+ "type": "SPELL",
+ "name": "Power Supply",
+ "description": "For the technomancer with no enhancements, this spell summons a power supply composed of pure mana that can be used to charge any compatible device. It will continually recharge until the duration expires.",
+ "valid_targets": [ "self" ],
+ "flags": [ "CONCENTRATE", "VERBAL", "SOMATIC" ],
+ "effect": "spawn_item",
+ "effect_str": "technomancer_summoned_ups",
+ "shape": "blast",
+ "spell_class": "TECHNOMANCER",
+ "difficulty": 7,
+ "max_level": 20,
+ "min_duration": 100000,
+ "max_duration": 300000,
+ "duration_increment": 10000,
+ "//": "The Power Supply provides 1 kj per second and regenerates 1 kj per second, so the duration is the total power supplied. Cost below increases but not as fast as power does.",
+ "energy_source": "MANA",
+ "base_casting_time": 3000,
+ "base_energy_cost": 600,
+ "final_energy_cost": 900,
+ "energy_increment": 15
+ },
+ {
+ "id": "technomancer_welder",
+ "type": "SPELL",
+ "name": "Voltaic Touch",
+ "description": "Using the principles of what were once called \"voltaic arcs\", you can electrically heat metal hot enough to weld it together.",
+ "valid_targets": [ "self" ],
+ "flags": [ "CONCENTRATE", "VERBAL", "SOMATIC", "NO_EXPLOSION_SFX" ],
+ "effect": "spawn_item",
+ "effect_str": "technomancer_welder",
+ "shape": "blast",
+ "spell_class": "TECHNOMANCER",
+ "difficulty": 5,
+ "max_level": 15,
+ "min_damage": 1,
+ "max_damage": 1,
+ "min_duration": 360000,
+ "max_duration": 720000,
+ "duration_increment": 24000,
+ "energy_source": "MANA",
+ "base_energy_cost": 500,
+ "base_casting_time": 3000
}
]
diff --git a/data/mods/Magiclysm/itemgroups/itemgroups.json b/data/mods/Magiclysm/itemgroups/itemgroups.json
index dd7a19a7bdf78..52a30dca71498 100644
--- a/data/mods/Magiclysm/itemgroups/itemgroups.json
+++ b/data/mods/Magiclysm/itemgroups/itemgroups.json
@@ -1126,7 +1126,8 @@
{ "item": "spell_scroll_bless", "prob": 50 },
{ "item": "spell_scroll_create_atomic_lamp", "prob": 50 },
{ "item": "spell_scroll_taze", "prob": 50 },
- { "item": "spell_scroll_laze", "prob": 50 }
+ { "item": "spell_scroll_laze", "prob": 50 },
+ { "item": "spell_scroll_technomancer_conjure_radio", "prob": 40 }
],
"prob": 45
},
@@ -1138,7 +1139,10 @@
{ "item": "spell_scroll_holy_blade", "prob": 50 },
{ "item": "spell_scroll_spirit_armor", "prob": 50 },
{ "item": "spell_scroll_synaptic_stimulation", "prob": 50 },
- { "item": "spell_scroll_knock", "prob": 50 }
+ { "item": "spell_scroll_knock", "prob": 50 },
+ { "item": "spell_scroll_technomancer_robot_shutdown", "prob": 50 },
+ { "item": "spell_scroll_technomancer_conjure_ups", "prob": 25 },
+ { "item": "spell_scroll_technomancer_welder", "prob": 35 }
],
"prob": 35
},
@@ -1194,7 +1198,8 @@
{ "item": "eshaper_spellbook", "prob": 10 },
{ "item": "spell_scroll_recover_stamina", "prob": 50 },
{ "item": "spell_scroll_eshaper_shardstorm", "prob": 50 },
- { "item": "spell_scroll_earthshaper_reveal_world_map", "prob": 25 }
+ { "item": "spell_scroll_earthshaper_reveal_world_map", "prob": 25 },
+ { "item": "spell_scroll_earthshaper_granite_aegis", "prob": 20 }
],
"prob": 10
}
@@ -1253,7 +1258,8 @@
{ "item": "spell_scroll_tornskin", "prob": 2 },
{ "item": "spell_scroll_summon_cats", "prob": 50 },
{ "item": "spell_scroll_seed_of_growth", "prob": 15 },
- { "item": "spell_scroll_druid_harvest_hunter", "prob": 30 }
+ { "item": "spell_scroll_druid_harvest_hunter", "prob": 30 },
+ { "item": "spell_scroll_druid_bramble_spear", "prob": 30 }
],
"prob": 45
},
@@ -1264,7 +1270,8 @@
{ "item": "spell_scroll_druid_naturebow1", "prob": 100 },
{ "item": "spell_scroll_druid_whisper_leaves", "prob": 100 },
{ "item": "spell_scroll_druid_rootstrike", "prob": 100 },
- { "item": "spell_scroll_purification_seed", "prob": 100 }
+ { "item": "spell_scroll_purification_seed", "prob": 100 },
+ { "item": "spell_scroll_druid_summon_tanglevine", "prob": 50 }
],
"prob": 35
},
diff --git a/data/mods/Magiclysm/itemgroups/spellbooks.json b/data/mods/Magiclysm/itemgroups/spellbooks.json
index 9436aebe198cf..de8cb1c06cf45 100644
--- a/data/mods/Magiclysm/itemgroups/spellbooks.json
+++ b/data/mods/Magiclysm/itemgroups/spellbooks.json
@@ -34,6 +34,7 @@
[ "spell_scroll_bless", 25 ],
[ "spell_scroll_create_atomic_lamp", 25 ],
[ "spell_scroll_taze", 25 ],
+ [ "spell_scroll_technomancer_conjure_radio", 20 ],
[ "spell_scroll_laze", 25 ],
[ "spell_scroll_lightning_blast", 20 ],
[ "spell_scroll_x-ray", 30 ],
@@ -63,6 +64,7 @@
[ "spell_scroll_druid_naturebow1", 20 ],
[ "spell_scroll_druid_bandage", 30 ],
[ "spell_scroll_druid_harvest_hunter", 40 ],
+ [ "spell_scroll_druid_bramble_spear", 30 ],
[ "spell_scroll_seismic_stomp", 20 ],
[ "spell_scroll_eshaper_shardspray", 25 ],
[ "spell_scroll_eshaper_spawn_tools", 40 ],
@@ -87,6 +89,7 @@
[ "spell_scroll_electric_eye", 35 ],
[ "spell_scroll_biomancer_swim_frog", 25 ],
[ "spell_scroll_holy_blade", 25 ],
+ [ "spell_scroll_technomancer_welder", 20 ],
[ "spell_scroll_spirit_armor", 25 ],
[ "spell_scroll_quantum_tunnel_lesser", 50 ],
[ "spell_scroll_synaptic_stimulation", 20 ],
@@ -134,6 +137,7 @@
[ "spell_scroll_eshaper_melee_damage", 30 ],
[ "spell_scroll_eshaper_crystal_wrap", 50 ],
[ "spell_scroll_druid_healing", 25 ],
+ [ "spell_scroll_druid_summon_tanglevine", 35 ],
[ "spell_scroll_fireball", 50 ],
[ "spell_scroll_cone_cold", 50 ],
[ "spell_scroll_hoary_blast", 50 ],
@@ -153,6 +157,8 @@
[ "spell_scroll_animated_blade", 35 ],
[ "spell_scroll_mirror_image", 15 ],
[ "spell_scroll_holographic_transposition", 15 ],
+ [ "spell_scroll_technomancer_conjure_ups", 20 ],
+ [ "spell_scroll_technomancer_robot_shutdown", 25 ],
[ "spell_scroll_dark_sight", 30 ],
[ "spell_scroll_druidic_regrowth", 20 ],
[ "spell_scroll_druid_whisper_leaves", 30 ],
@@ -193,7 +199,8 @@
[ "spell_scroll_focused_bolt", 4 ],
[ "spell_scroll_rupture", 4 ],
[ "spell_scroll_cause_rot", 4 ],
- [ "spell_scroll_earthshaper_reveal_world_map", 15 ]
+ [ "spell_scroll_earthshaper_reveal_world_map", 15 ],
+ [ "spell_scroll_earthshaper_granite_aegis", 5 ]
]
},
{
@@ -208,6 +215,7 @@
"items": [
[ "wizard_utility", 50 ],
[ "priest_advanced", 50 ],
+ [ "prepper_spellbook", 30 ],
[ "techno_fundamentals", 50 ],
[ "stat_up_spellbook", 45 ],
[ "tome_of_wind", 45 ],
diff --git a/data/mods/Magiclysm/items/ethereal_items.json b/data/mods/Magiclysm/items/ethereal_items.json
index 25b1dd52f5bcd..862d43cef12c0 100644
--- a/data/mods/Magiclysm/items/ethereal_items.json
+++ b/data/mods/Magiclysm/items/ethereal_items.json
@@ -1480,5 +1480,91 @@
"color": "green",
"flags": [ "TRADER_AVOID", "SINGLE_USE" ],
"use_action": { "type": "heal", "bandages_power": 3, "bleed": 12, "move_cost": 300 }
+ },
+ {
+ "id": "technomancer_summoned_radio",
+ "type": "TOOL",
+ "name": { "str": "aetherspeaker (speaking)", "str_pl": "aetherspeakers (speaking)" },
+ "description": "A magically-summoned aetherspeaker, capable of communicating long-distance with other aetherspeakers or conventional radios. With a command word, it may instead scan for radio signals.",
+ "weight": "295 g",
+ "volume": "125 ml",
+ "to_hit": -1,
+ "material": [ "concentrated_mana" ],
+ "symbol": ";",
+ "color": "cyan",
+ "flags": [ "TWO_WAY_RADIO", "ONLY_ONE", "TRADER_AVOID", "NO_DROP" ],
+ "use_action": [ { "type": "transform", "target": "technomancer_summoned_radio_on", "menu_text": "Turn to scanning mode" } ],
+ "melee_damage": { "bash": 4 }
+ },
+ {
+ "id": "technomancer_summoned_radio_on",
+ "copy-from": "technomancer_summoned_radio",
+ "type": "TOOL",
+ "name": { "str": "aetherspeaker (scanning)", "str_pl": "aetherspeakers (scanning)" },
+ "description": "An aetherspeaker tuned to listen for radio signals from the surrounding area. With a command word, it may change frequency or switch to communicating with other aetherspeakers or radios.",
+ "use_action": [ "RADIO_ON", { "type": "transform", "target": "technomancer_summoned_radio", "menu_text": "Turn to speaking mode" } ],
+ "tick_action": [ "RADIO_TICK" ],
+ "flags": [ "TRADER_AVOID", "ONLY_ONE", "NO_DROP" ]
+ },
+ {
+ "id": "technomancer_summoned_ups",
+ "type": "MAGAZINE",
+ "category": "tool_magazine",
+ "name": { "str_sp": "technomantic power supply" },
+ "description": "A smoothly-curved conglomeration of mana, humming softly as it provides power.",
+ "weight": "125 g",
+ "volume": "65 ml",
+ "material": [ "concentrated_mana" ],
+ "symbol": "=",
+ "color": "yellow",
+ "ammo_type": [ "battery" ],
+ "capacity": 1250,
+ "looks_like": "spiral_stone",
+ "flags": [ "TRADER_AVOID", "ONLY_ONE", "NO_DROP", "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD", "IS_UPS" ],
+ "pocket_data": [ { "pocket_type": "MAGAZINE", "rigid": true, "ammo_restriction": { "battery": 1 } } ],
+ "relic_data": { "charge_info": { "recharge_type": "periodic", "time": "2 s", "regenerate_ammo": true } },
+ "//": "Recharge time is 2 seconds due to bug #48019, making it actually 1 second. Reduce to 1 second if that ever gets fixed."
+ },
+ {
+ "id": "technomancer_welder",
+ "type": "TOOL",
+ "name": { "str_sp": "voltaic touch" },
+ "description": "Your hands can spark with electricity powerful enough to heat metal to searing temperatures and weld it together. You can also zap the undead with it.",
+ "weight": "0 g",
+ "volume": "0 L",
+ "price": 1,
+ "price_postapoc": 1,
+ "symbol": "$",
+ "color": "red",
+ "material": [ "concentrated_mana" ],
+ "flags": [ "UNBREAKABLE", "ZERO_WEIGHT", "ALLOWS_NATURAL_ATTACKS", "INTEGRATED", "PADDED", "OUTER", "ONLY_ONE", "NO_DROP" ],
+ "qualities": [ [ "WELD", 2 ] ],
+ "to_hit": { "grip": "weapon", "length": "hand", "surface": "any", "balance": "neutral" },
+ "melee_damage": { "bash": 2 },
+ "relic_data": {
+ "passive_effects": [ { "has": "WORN", "condition": "ALWAYS", "values": [ { "value": "ITEM_DAMAGE_ELEC", "add": 6 } ] } ]
+ }
+ },
+ {
+ "type": "GENERIC",
+ "id": "druid_bramble_spear_item",
+ "name": { "str": "spear of brambles", "str_pl": "spears of brambles" },
+ "looks_like": "spear_wood",
+ "description": "A twisted wooden spear whose branches twine together into a vicious point sticky with sap.",
+ "weight": "1200 g",
+ "price_postapoc": 1,
+ "color": "green",
+ "symbol": "/",
+ "material": [ "wood" ],
+ "techniques": [ "WBLOCK_1", "IMPALE" ],
+ "volume": "1750 ml",
+ "longest_side": "180 cm",
+ "melee_damage": { "bash": 5, "stab": 26 },
+ "to_hit": { "grip": "weapon", "length": "long", "surface": "point", "balance": "good" },
+ "flags": [ "SPEAR", "REACH_ATTACK", "NONCONDUCTIVE", "SHEATH_SPEAR", "UNBREAKABLE_MELEE", "NO_REPAIR", "NO_SALVAGE" ],
+ "weapon_category": [ "POLEARMS", "SPEARS" ],
+ "price": 1,
+ "qualities": [ [ "COOK", 1 ] ],
+ "relic_data": { "passive_effects": [ { "has": "WIELD", "hit_you_effect": [ { "id": "bramble_spear_slow", "hit_self": false } ] } ] }
}
]
diff --git a/data/mods/Magiclysm/items/spell_scrolls.json b/data/mods/Magiclysm/items/spell_scrolls.json
index 3e6bcef3e8caf..4b0d203180cab 100644
--- a/data/mods/Magiclysm/items/spell_scrolls.json
+++ b/data/mods/Magiclysm/items/spell_scrolls.json
@@ -1554,5 +1554,68 @@
"name": { "str": "Scroll of Beguiling the Savage Beast", "str_pl": "Scrolls of Beguiling the Savage Beast" },
"description": "Charm an animal into your service for a time. They don't even technically have to be savage!",
"use_action": { "type": "learn_spell", "spells": [ "druid_beguile_savage_beast" ] }
+ },
+ {
+ "type": "BOOK",
+ "copy-from": "spell_scroll",
+ "id": "spell_scroll_technomancer_robot_shutdown",
+ "//": "Technomancer spell",
+ "name": { "str": "Scroll of Shutdown", "str_pl": "Scrolls of Shutdown" },
+ "description": "Stop a robot, golem, or cyborg in their tracks. Be perfectly prepared for a different kind of apocalypse.",
+ "use_action": { "type": "learn_spell", "spells": [ "technomancer_robot_shutdown" ] }
+ },
+ {
+ "type": "BOOK",
+ "copy-from": "spell_scroll",
+ "id": "spell_scroll_technomancer_conjure_radio",
+ "//": "Technomancer spell",
+ "name": { "str": "Scroll of Speak through the Aether", "str_pl": "Scrolls of Speak through the Aether" },
+ "description": "Summon up a magical device that allows you to communicate through radio waves. Well, maybe there's someone still out there.",
+ "use_action": { "type": "learn_spell", "spells": [ "technomancer_conjure_radio" ] }
+ },
+ {
+ "type": "BOOK",
+ "copy-from": "spell_scroll",
+ "id": "spell_scroll_technomancer_conjure_ups",
+ "//": "Technomancer spell",
+ "name": { "str": "Scroll of Power Supply", "str_pl": "Scrolls of Power Supply" },
+ "description": "Power all of your devices using mana instead of electricity.",
+ "use_action": { "type": "learn_spell", "spells": [ "technomancer_conjure_ups" ] }
+ },
+ {
+ "type": "BOOK",
+ "copy-from": "spell_scroll",
+ "id": "spell_scroll_technomancer_welder",
+ "//": "Technomancer spell",
+ "name": { "str": "Scroll of Voltaic Touch", "str_pl": "Scrolls of Voltaic Touch" },
+ "description": "Weld metal using touch alone. It'll do a number on a zombie too.",
+ "use_action": { "type": "learn_spell", "spells": [ "technomancer_welder" ] }
+ },
+ {
+ "type": "BOOK",
+ "copy-from": "spell_scroll",
+ "id": "spell_scroll_earthshaper_granite_aegis",
+ "//": "Earthshaper spell",
+ "name": { "str": "Scroll of Granite Aegis", "str_pl": "Scrolls of Granite Aegis" },
+ "description": "When the going gets tough, the tough summon yards-thick walls of solid rock around themselves",
+ "use_action": { "type": "learn_spell", "spells": [ "earthshaper_granite_aegis" ] }
+ },
+ {
+ "type": "BOOK",
+ "copy-from": "spell_scroll",
+ "id": "spell_scroll_druid_bramble_spear",
+ "//": "Druid spell",
+ "name": { "str": "Scroll of Spear of Brambles", "str_pl": "Scrolls of Spear of Brambles" },
+ "description": "Transform a long stick into a spear that drips with sticky sap.",
+ "use_action": { "type": "learn_spell", "spells": [ "druid_bramble_spear" ] }
+ },
+ {
+ "type": "BOOK",
+ "copy-from": "spell_scroll",
+ "id": "spell_scroll_druid_summon_tanglevine",
+ "//": "Druid spell",
+ "name": { "str": "Scroll of Summon Tanglevine", "str_pl": "Scrolls of Summon Tanglevine" },
+ "description": "Conjure a lashing bunch of animated vines that will grab and hold your enemies.",
+ "use_action": { "type": "learn_spell", "spells": [ "druid_summon_tanglevine" ] }
}
]
diff --git a/data/mods/Magiclysm/items/spellbooks.json b/data/mods/Magiclysm/items/spellbooks.json
index 553ab398bbf56..bef351ee7d9e1 100644
--- a/data/mods/Magiclysm/items/spellbooks.json
+++ b/data/mods/Magiclysm/items/spellbooks.json
@@ -691,5 +691,35 @@
"type": "learn_spell",
"spells": [ "magus_teleport_mark", "magus_word_of_recall", "magus_spiderclimb", "quantum_tunnel_lesser" ]
}
+ },
+ {
+ "id": "prepper_spellbook",
+ "type": "BOOK",
+ "category": "manuals",
+ "name": {
+ "str": "It's the End of the World, But You'll Feel Fine",
+ "str_pl": "copies of It's the End of the World, But You'll Feel Fine"
+ },
+ "//": "3 Druid spells, 1 Earthshaper spell, 1 Biomancer spell, 2 Kelvinist spells",
+ "description": "This thick paperback book is a collection of the proper magical preparations to survive various disasters. Unfortunately, the zombie apocalypse section doesn't account for everything that's gone wrong in the Cataclysm, but there's still a lot of useful knowledge here.",
+ "weight": "473 g",
+ "volume": "825 ml",
+ "price": 3500,
+ "material": [ "paper" ],
+ "looks_like": "cookbook",
+ "symbol": "?",
+ "color": "yellow",
+ "use_action": {
+ "type": "learn_spell",
+ "spells": [
+ "druid_harvest_hunter",
+ "druid_naturebow1",
+ "biomancer_carrion_feast",
+ "purify_seed",
+ "earthshaper_turning_of_earth",
+ "create_lighter",
+ "kelvinist_anti_cold"
+ ]
+ }
}
]
diff --git a/data/mods/Magiclysm/monster_factions.json b/data/mods/Magiclysm/monster_factions.json
index f5cad0a1571d2..9ffa886d94c71 100644
--- a/data/mods/Magiclysm/monster_factions.json
+++ b/data/mods/Magiclysm/monster_factions.json
@@ -52,5 +52,9 @@
{
"type": "MONSTER_FACTION",
"name": "elves"
+ },
+ {
+ "type": "MONSTER_FACTION",
+ "name": "magical_plant"
}
]
diff --git a/data/mods/Magiclysm/monsters/plants.json b/data/mods/Magiclysm/monsters/plants.json
new file mode 100644
index 0000000000000..0f9db5d416054
--- /dev/null
+++ b/data/mods/Magiclysm/monsters/plants.json
@@ -0,0 +1,59 @@
+[
+ {
+ "id": "mon_tanglevine",
+ "type": "MONSTER",
+ "name": { "str": "tanglevine" },
+ "description": "A thick mass of animated vine, lashing back and forth at anything that comes within reach. Long thorns grow from its sides.",
+ "species": [ "PLANT" ],
+ "default_faction": "magical_plant",
+ "volume": "92500 ml",
+ "weight": "120 kg",
+ "hp": 60,
+ "speed": 80,
+ "material": [ "veggy" ],
+ "symbol": "V",
+ "color": "green",
+ "aggression": 60,
+ "morale": 200,
+ "melee_skill": 5,
+ "melee_dice": 1,
+ "melee_dice_sides": 1,
+ "grab_strength": 70,
+ "vision_day": 10,
+ "vision_night": 10,
+ "special_attacks": [
+ {
+ "id": "ranged_pull",
+ "cooldown": 6,
+ "range": 4,
+ "damage_max_instance": [ { "damage_type": "stab", "amount": 2 } ],
+ "hit_dmg_u": "%1$s lashes out and curls around your %2$s!",
+ "hit_dmg_npc": "%1$s lashes out and curls around 's %2$s!",
+ "miss_msg_u": "%s lashes out at you, but you dodge!",
+ "miss_msg_npc": "%s lashes out at , but they dodge!",
+ "no_dmg_msg_u": "%1$s lashes out at your %2$s!",
+ "no_dmg_msg_npc": "%1$s lashes out and curls around 's %2$s!"
+ },
+ {
+ "type": "monster_attack",
+ "attack_type": "melee",
+ "id": "thorn_squeeze",
+ "cooldown": 3,
+ "move_cost": 100,
+ "damage_max_instance": [ { "damage_type": "stab", "amount": 6, "armor_penetration": 30 } ],
+ "//": "armor penetration here represents that you'll literally surrounded by thorns",
+ "condition": { "and": [ { "u_has_flag": "GRAB_FILTER" }, { "npc_has_flag": "GRAB" } ] },
+ "hit_dmg_u": "%1$s squeezes and its thorns dig into your %2$s!",
+ "hit_dmg_npc": "%1$s squeezes !",
+ "miss_msg_u": "%1$s tries to squeeze you, but you fight back!",
+ "miss_msg_npc": "%1$s tries to squeeze , but they fight back!",
+ "no_dmg_msg_u": "%1$s squeezes your %2$s, but fails to penetrate your armor.",
+ "no_dmg_msg_npc": "%1$s squeezes , but fails to penetrate their armor."
+ }
+ ],
+ "dodge": 4,
+ "death_function": { "message": "The %s rots into nothingness in moments.", "corpse_type": "NO_CORPSE" },
+ "flags": [ "HEARS", "GOODHEARING", "IMMOBILE", "NOHEAD", "HARDTOSHOOT", "GRABS", "PLASTIC" ],
+ "armor": { "bash": 18, "stab": 10, "electric": 3, "bullet": 22 }
+ }
+]
diff --git a/data/mods/Magiclysm/professions.json b/data/mods/Magiclysm/professions.json
index 79714b0dd1449..25c391be320a0 100644
--- a/data/mods/Magiclysm/professions.json
+++ b/data/mods/Magiclysm/professions.json
@@ -328,7 +328,11 @@
"id": "techno_prepper",
"name": "Techno-Prepper",
"description": "You've long suspected the world might suddenly turn over. With your training, spells, and revolver, your chances are far better than most.",
- "spells": [ { "id": "create_atomic_lamp", "level": 8 }, { "id": "invisibility", "level": 2 } ],
+ "spells": [
+ { "id": "create_atomic_lamp", "level": 8 },
+ { "id": "invisibility", "level": 2 },
+ { "id": "technomancer_conjure_ups", "level": 3 }
+ ],
"points": 5,
"skills": [
{ "level": 2, "name": "survival" },
@@ -361,7 +365,11 @@
"id": "freezing_dancer",
"name": "Freezing Dancer",
"description": "You are a highly sought exotic magic dancer. You can heat the room temperature with your moves and your body, but whenever it lights too much you freeze it with your magic, granting you great control over your public. They can see, but never touch.",
- "spells": [ { "id": "freezing_touch", "level": 3 }, { "id": "glide_ice", "level": 3 } ],
+ "spells": [
+ { "id": "freezing_touch", "level": 3 },
+ { "id": "glide_ice", "level": 3 },
+ { "id": "kelvinist_anti_heat", "level": 3 }
+ ],
"skills": [ { "level": 2, "name": "dodge" }, { "level": 2, "name": "spellcraft" } ],
"points": 2,
"items": {
@@ -837,7 +845,8 @@
{ "id": "druidic_healing", "level": 4 },
{ "id": "purify_seed", "level": 4 },
{ "id": "druid_woodshaft", "level": 3 },
- { "id": "classless_watch_spell", "level": 2 }
+ { "id": "classless_watch_spell", "level": 2 },
+ { "id": "druid_beguile_savage_beast", "level": 2 }
],
"skills": [
{ "level": 4, "name": "survival" },
@@ -928,7 +937,11 @@
"name": "Arsonist",
"description": "Penned in a cell without fuel, you've been extinguished for years for setting buildings on fire. In your escape, you grabbed your familiar tool to reignite the embers.",
"points": 3,
- "spells": [ { "id": "kelvinist_flamebreath", "level": 2 }, { "id": "burning_hands", "level": 2 } ],
+ "spells": [
+ { "id": "kelvinist_flamebreath", "level": 2 },
+ { "id": "burning_hands", "level": 2 },
+ { "id": "kelvinist_anti_heat", "level": 2 }
+ ],
"skills": [ { "level": 3, "name": "spellcraft" } ],
"traits": [ "KELVINIST" ],
"items": {
@@ -948,7 +961,8 @@
{ "id": "druidic_regrowth", "level": 3 },
{ "id": "druid_feralform", "level": 2 },
{ "id": "druid_veggrasp", "level": 2 },
- { "id": "druid_natures_commune", "level": 2 }
+ { "id": "druid_natures_commune", "level": 2 },
+ { "id": "druid_summon_tanglevine", "level": 2 }
],
"skills": [
{ "level": 3, "name": "spellcraft" },
@@ -970,7 +984,12 @@
"name": { "male": "Frost Cream Man", "female": "Frost Cream Woman" },
"description": "You learned Kelvinist spells to keep equipment costs down on your ice cream truck. While their tastes have changed, the kids still scream for you.",
"points": 4,
- "spells": [ { "id": "chilling_touch", "level": 3 }, { "id": "frost_spray", "level": 3 } ],
+ "proficiencies": [ "prof_driver" ],
+ "spells": [
+ { "id": "chilling_touch", "level": 3 },
+ { "id": "frost_spray", "level": 3 },
+ { "id": "kelvinist_anti_heat", "level": 4 }
+ ],
"skills": [
{ "level": 2, "name": "speech" },
{ "level": 2, "name": "cooking" },
diff --git a/data/mods/Magiclysm/requirements/spell_components.json b/data/mods/Magiclysm/requirements/spell_components.json
index 24c4d59eab803..b5a544cd09649 100644
--- a/data/mods/Magiclysm/requirements/spell_components.json
+++ b/data/mods/Magiclysm/requirements/spell_components.json
@@ -167,5 +167,11 @@
"id": "spell_components_remove_instability",
"type": "requirement",
"components": [ [ [ "purifier", 1 ] ] ]
+ },
+ {
+ "id": "spell_components_druid_bramble_spear",
+ "type": "requirement",
+ "//": "Sticks to turn into a bramble spear",
+ "components": [ [ [ "stick", 1 ], [ "stick_long", 1 ] ] ]
}
]
diff --git a/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json b/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json
index 8b67411c8b343..a858a317d7d91 100644
--- a/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json
+++ b/data/mods/Magiclysm/ter_fur_transform/ter_fur_transform.json
@@ -204,5 +204,66 @@
"message": "There's a rippling in the air and a blast of cold air, then the crystal forms."
}
]
+ },
+ {
+ "type": "ter_furn_transform",
+ "id": "earthshaper_granite_aegis_to_stone",
+ "terrain": [
+ {
+ "result": "t_rock_smooth",
+ "valid_terrain": [
+ "t_rock_floor_no_roof",
+ "t_rock_floor",
+ "t_dirt",
+ "t_dirtfloor",
+ "t_dirtfloor_no_roof",
+ "t_dirt_underground",
+ "t_grass",
+ "t_grass_long",
+ "t_grass_tall",
+ "t_grass_dead",
+ "t_grass_white",
+ "t_grass_golf",
+ "t_pit_shallow",
+ "t_sand",
+ "t_sand_underground",
+ "t_clay",
+ "t_claymound",
+ "t_claymound_underground",
+ "t_dirtmound",
+ "t_sandmound",
+ "t_mud",
+ "t_mud_underground",
+ "t_forestfloor",
+ "t_moss",
+ "t_moss_underground",
+ "t_region_soil",
+ "t_puddle_underground",
+ "t_pit_shallow",
+ "t_concrete_y",
+ "t_concrete",
+ "t_thconc_y_olight",
+ "t_thconc_warning",
+ "t_thconc_y",
+ "t_thconc_r",
+ "t_thconc_floor",
+ "t_strconc_floor",
+ "t_strconc_floor_olight",
+ "t_strconc_floor_no_roof",
+ "t_railroad_rubble"
+ ],
+ "message": "A wall of smooth stone rises up around you!."
+ }
+ ]
+ },
+ {
+ "type": "ter_furn_transform",
+ "id": "earthshaper_granite_aegis_to_stone_safe",
+ "terrain": [ { "result": "t_dirtmound", "valid_terrain": [ "t_rock_smooth" ], "message": "" } ]
+ },
+ {
+ "type": "ter_furn_transform",
+ "id": "earthshaper_granite_aegis_from_stone",
+ "terrain": [ { "result": "t_dirtmound", "valid_terrain": [ "t_rock_smooth" ], "message": "The stone wall crumbes to dust." } ]
}
]
diff --git a/data/mods/Magiclysm/traits/fantasy_species.json b/data/mods/Magiclysm/traits/fantasy_species.json
index 2c9511d6d0ad2..d5f397cc52469 100644
--- a/data/mods/Magiclysm/traits/fantasy_species.json
+++ b/data/mods/Magiclysm/traits/fantasy_species.json
@@ -6,7 +6,7 @@
"name": "Elf (Species)",
"description": "You are one of the Firstborn, called \"alfar\" or \"sidhe\" or, more recently, \"elves\" by the humans. Your people had integrated into human society before the Cataclysm, doing jobs involving animals and nature since modern industry was never to your liking. Had technological development continued, you might have been forced to make some unpleasant compromises, but not as unpleasant as you have during the end of the world.",
"points": 4,
- "skills": [ { "level": 2, "name": "archery" }, { "level": 2, "name": "gun" } ],
+ "proficiencies": [ "prof_spotting" ],
"traits": [
"THRESH_SPECIES_ELF",
"ANIMALEMPATH2",
@@ -33,7 +33,6 @@
"name": "Dwarf (Species)",
"description": "You are a Child of the Stone, called \"dwarf\" by the humans. The legends tell that long ago, your people were born of stone and mined your way up to the surface world and its light, where you found the other sapient species of Earth. While the scale of the human world was always a bit of a problem, you fit in well due to your people's long tradition of craftsdwarfship and hard work. Now that society has collapsed, maybe you can turn that same drive to rebuilding it.",
"points": 4,
- "skills": [ { "level": 2, "name": "fabrication" }, { "level": 2, "name": "mechanics" } ],
"traits": [
"THRESH_SPECIES_DWARF",
"DARKSIGHT",
@@ -62,7 +61,6 @@
"name": "Goblin (Species)",
"description": "You are a goblin. Before the Cataclysm your people were always a little out of place: the houses weren't designed for you, the shops weren't open when you were awake, and your appearance sometimes gave human or elven children nightmares that you were going to steal them or reminded dwarves of the ancient wars your peoples fought. As it turned out, you weren't what any of them should have been worrying about.",
"points": 4,
- "skills": [ { "level": 2, "name": "survival" }, { "level": 2, "name": "traps" } ],
"traits": [
"THRESH_SPECIES_GOBLIN",
"DARKSIGHT",
@@ -89,7 +87,7 @@
"name": "Lizardfolk (Species)",
"description": "You are one of the Scaled Ones, called \"lizardfolk\" by the warmbloods. For generations, your tribe served a dragon as its eyes and ears in the outside world, until civilization encroached far enough that even all the dragon's might could not hold it back. You were sent out to integrate into the modern world, but you were only there a few years before human science ended their world. Now, you have to survive in the mess they've created.",
"points": 4,
- "skills": [ { "level": 2, "name": "swimming" }, { "level": 2, "name": "unarmed" } ],
+ "skills": [ { "level": 2, "name": "swimming" } ],
"traits": [
"THRESH_SPECIES_LIZARDFOLK",
"LIZARDFOLK_BUILD",
@@ -119,7 +117,7 @@
"name": "Ravenfolk (Species)",
"description": "You are one of the Kor'uru, called \"ravenfolk\" by those who can't make the appropriate clacking sound due to their lack of beak. While your people could not fly without the aid of magic, you were always drawn to explore the world, and had traveled to nearly every country and continent even before modern society made such travel easy. You were well-integrated into society at all levels…and that made you just as vulnerable as everyone else when it fell.",
"points": 4,
- "skills": [ { "level": 2, "name": "swimming" }, { "level": 2, "name": "dodge" } ],
+ "proficiencies": [ "prof_spotting" ],
"traits": [
"THRESH_SPECIES_RAVENFOLK",
"RAVENFOLK_BUILD",
diff --git a/data/mods/MindOverMatter/effects/effects_penalty.json b/data/mods/MindOverMatter/effects/effects_penalty.json
index abf9540b39eb4..eb041d5c74f7a 100644
--- a/data/mods/MindOverMatter/effects/effects_penalty.json
+++ b/data/mods/MindOverMatter/effects/effects_penalty.json
@@ -267,7 +267,7 @@
"name": [ "Oppressive Weight" ],
"desc": [ "Everything feels so much heavier." ],
"apply_message": "The air itself seems to press down on you!",
- "remove_message": "The oppressive weight vanishes",
+ "remove_message": "The oppressive weight vanishes.",
"rating": "bad",
"max_intensity": 10,
"enchantments": [ { "values": [ { "value": "CARRY_WEIGHT", "multiply": 0.75 }, { "value": "MOVE_COST", "multiply": 1.5 } ] } ],
diff --git a/data/mods/MindOverMatter/itemgroups/matrix_technology_labs.json b/data/mods/MindOverMatter/itemgroups/matrix_technology_labs.json
index 1371485811a0b..e8126c9644870 100644
--- a/data/mods/MindOverMatter/itemgroups/matrix_technology_labs.json
+++ b/data/mods/MindOverMatter/itemgroups/matrix_technology_labs.json
@@ -69,6 +69,12 @@
{ "item": "psionic_fire_shield_belt", "prob": 1, "charges": [ 0, 300 ] }
]
},
+ {
+ "type": "item_group",
+ "subtype": "distribution",
+ "id": "dist_pulse_rifles_heavy_prototype",
+ "items": [ { "item": "mom_pulse_rifle", "prob": 1 }, { "item": "mom_pulse_rifle_prototype", "prob": 4 } ]
+ },
{
"type": "item_group",
"subtype": "distribution",
diff --git a/data/mods/MindOverMatter/items/weapons.json b/data/mods/MindOverMatter/items/weapons.json
index 14999e81f07f2..9da7986fd0e88 100644
--- a/data/mods/MindOverMatter/items/weapons.json
+++ b/data/mods/MindOverMatter/items/weapons.json
@@ -53,7 +53,7 @@
"type": "GUN",
"reload_noise_volume": 10,
"name": { "str": "LV429 Pulse Rifle" },
- "description": "The LV429 fires a series of extremely short high-energy laser pulses, more like bullets than a traditional laser beam, greatly reducing dwell time and weapon effectiveness. Matrix crystal technology has made the weapon compact enough to be man-portable and provided it with enough power for essentially unlimited operation, but heat dissipation is still a problem, preventing it from being fired more than once every few seconds.",
+ "description": "The LV429 fires a series of extremely short high-energy laser pulses, more like bullets than a traditional laser beam, greatly reducing dwell time and increasing weapon effectiveness. Matrix crystal technology has made the weapon compact enough to be man-portable and provided it with enough power for essentially unlimited combat operations, but heat dissipation is still a problem, preventing it from being fired more than once every few seconds.",
"weight": "4350 g",
"volume": "3 L",
"longest_side": "965 mm",
@@ -67,9 +67,13 @@
"skill": "rifle",
"range": 35,
"dispersion": 10,
- "durability": 10,
+ "overheat_threshold": 100,
+ "cooling_value": 4,
+ "heat_per_shot": 21,
+ "recoil": 0,
+ "durability": 4,
"modes": [ [ "DEFAULT", "semi-auto", 1 ] ],
- "loudness": 23,
+ "loudness": 5,
"reload": 0,
"clip_size": 1,
"valid_mod_locations": [
@@ -84,9 +88,23 @@
],
"ammo": [ "mom_pulse_rifle_ammo" ],
"ammo_effects": [ "LASER", "INCENDIARY" ],
- "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "NO_REPAIR" ],
+ "flags": [ "NEVER_JAMS", "NO_UNLOAD", "NON_FOULING", "NEEDS_NO_LUBE", "NO_REPAIR", "OVERHEATS" ],
+ "faults": [ "fault_overheat_explosion", "fault_overheat_melting" ],
"pocket_data": [ { "pocket_type": "MAGAZINE", "ammo_restriction": { "mom_pulse_rifle_ammo": 1 } } ],
"relic_data": { "charge_info": { "recharge_type": "periodic", "time": "8 s", "regenerate_ammo": true } },
"//": "Recharge time is 8 seconds due to bug #48019, making it actually 4 seconds. Reduce to 4 seconds if that ever gets fixed."
+ },
+ {
+ "id": "mom_pulse_rifle_prototype",
+ "looks_like": "ar15",
+ "type": "GUN",
+ "copy-from": "mom_pulse_rifle",
+ "name": { "str": "LV429-P Pulse Rifle" },
+ "description": "The LV429 fires a series of extremely short high-energy laser pulses, more like bullets than a traditional laser beam, greatly reducing dwell time and increasing weapon effectiveness. Matrix crystal technology has made the weapon compact enough to be man-portable and provided it with enough power for essentially unlimited operation. This is a prototype, obvious from the bright red coloration of the barrel and grip, as well as the word \"prototype\" written in large letters on the stock and the flammable symbol next to it.",
+ "overheat_threshold": 100,
+ "cooling_value": 5,
+ "heat_per_shot": 21,
+ "relic_data": { "charge_info": { "recharge_type": "periodic", "time": "2 s", "regenerate_ammo": true } },
+ "//": "Recharge time is 8 seconds due to bug #48019, making it actually 1 second. Reduce to 1 seconds if that ever gets fixed."
}
]
diff --git a/data/mods/MindOverMatter/mapgen/nested/office_phavian_modular.json b/data/mods/MindOverMatter/mapgen/nested/office_phavian_modular.json
index 63136abc6a3c0..445d89786f9e9 100644
--- a/data/mods/MindOverMatter/mapgen/nested/office_phavian_modular.json
+++ b/data/mods/MindOverMatter/mapgen/nested/office_phavian_modular.json
@@ -717,7 +717,7 @@
"type": "mapgen",
"method": "json",
"//": "A nested map for the Phavian secret office lab room south of the hall, door in the upper left. This is a weapons lab",
- "weight": 50,
+ "weight": 450,
"nested_mapgen_id": "office_phavian_lab_DN8x8",
"object": {
"mapgensize": [ 8, 8 ],
@@ -726,19 +726,23 @@
"........",
"...çç...",
"...ⱮⱮ..ç",
- "C..Aɱ..ç",
+ "C..Aɱ..è",
"C......M",
"CA....cɱ",
"C.....UU"
],
"palettes": [ "office_phavian_palette" ],
+ "furniture": { "è": "f_lab_bench" },
"place_item": [
{ "item": "grenade_inferno", "x": 7, "y": 3, "chance": 30, "repeat": [ 1, 2 ] },
- { "item": "mom_pulse_rifle", "x": 7, "y": 4, "chance": 15 },
{ "item": "grenade_inferno", "x": 7, "y": 4, "chance": 60, "repeat": [ 1, 3 ] },
{ "item": "schematics_grenade_inferno", "x": 7, "y": 7, "chance": 60 }
],
"items": {
+ "è": [
+ { "item": "psi_lab", "chance": 20, "repeat": [ 1, 3 ] },
+ { "item": "dist_pulse_rifles_heavy_prototype", "chance": 40 }
+ ],
"l": [ { "item": "lab_torso", "chance": 40, "repeat": [ 1, 8 ] }, { "item": "lab_shoes", "chance": 40, "repeat": [ 1, 8 ] } ],
"U": [ { "item": "psi_lab", "chance": 50, "repeat": [ 1, 3 ] } ],
"&": { "item": "trash", "chance": 75, "repeat": [ 1, 2 ] }
@@ -753,7 +757,7 @@
"type": "mapgen",
"method": "json",
"//": "A nested map for the Phavian secret office lab room north of the hall, door in the lower right. This is a weapons lab",
- "weight": 50,
+ "weight": 450,
"nested_mapgen_id": "office_phavian_lab_DS8x8",
"object": {
"mapgensize": [ 8, 8 ],
@@ -761,20 +765,24 @@
"UU.....C",
"ɱc....AC",
"M......C",
- "ç..ɱA..C",
+ "è..ɱA..C",
"ç..ⱮⱮ...",
"...çç...",
"........",
"....l&.."
],
+ "furniture": { "è": "f_lab_bench" },
"palettes": [ "office_phavian_palette" ],
"place_item": [
{ "item": "grenade_inferno", "x": 0, "y": 4, "chance": 30, "repeat": [ 1, 2 ] },
- { "item": "mom_pulse_rifle", "x": 0, "y": 3, "chance": 15 },
{ "item": "grenade_inferno", "x": 0, "y": 3, "chance": 60, "repeat": [ 1, 3 ] },
{ "item": "schematics_grenade_inferno", "x": 0, "y": 0, "chance": 60 }
],
"items": {
+ "è": [
+ { "item": "psi_lab", "chance": 20, "repeat": [ 1, 3 ] },
+ { "item": "dist_pulse_rifles_heavy_prototype", "chance": 40 }
+ ],
"l": [ { "item": "lab_torso", "chance": 40, "repeat": [ 1, 8 ] }, { "item": "lab_shoes", "chance": 40, "repeat": [ 1, 8 ] } ],
"U": [ { "item": "psi_lab", "chance": 50, "repeat": [ 1, 3 ] } ],
"&": { "item": "trash", "chance": 75, "repeat": [ 1, 2 ] }
diff --git a/data/mods/MindOverMatter/powers/teleportation.json b/data/mods/MindOverMatter/powers/teleportation.json
index d47235e524269..62ca1b312f89e 100644
--- a/data/mods/MindOverMatter/powers/teleportation.json
+++ b/data/mods/MindOverMatter/powers/teleportation.json
@@ -224,7 +224,7 @@
"base_casting_time": 80,
"final_casting_time": 45,
"casting_time_increment": -2,
- "learn_spells": { "teleport_displace": 4, "teleport_banish": 9, "teleport_gateway": 12, "teleport_summon": 15 }
+ "learn_spells": { "teleport_displacement": 4, "teleport_banish": 9, "teleport_gateway": 12, "teleport_summon": 15 }
},
{
"id": "teleport_farstep",
diff --git a/data/mods/No_Hope/regional_map_settings.json b/data/mods/No_Hope/regional_map_settings.json
index cf67dd7fda00f..360d85c15b947 100644
--- a/data/mods/No_Hope/regional_map_settings.json
+++ b/data/mods/No_Hope/regional_map_settings.json
@@ -1202,7 +1202,8 @@
"public_works": 200,
"office_tower": 150,
"office_tower_2": 150,
- "office_tower_large": 500,
+ "office_skyscraper": 300,
+ "office_tower_large": 300,
"office_tower_hiddenlab": 50,
"mall": 100,
"home_improvement_superstore_new": 150,
diff --git a/data/mods/TEST_DATA/vehicle.json b/data/mods/TEST_DATA/vehicle.json
index 4be2e484b15da..04cb487282613 100644
--- a/data/mods/TEST_DATA/vehicle.json
+++ b/data/mods/TEST_DATA/vehicle.json
@@ -463,5 +463,39 @@
{ "x": -5, "y": -2, "parts": [ "wing_mirror" ] },
{ "x": -5, "y": 4, "parts": [ "external_tank_small" ] }
]
+ },
+ {
+ "id": "test_beetle",
+ "type": "vehicle",
+ "name": "Test Beetle",
+ "blueprint": [
+ [ "o+o-" ],
+ [ "|=|=" ],
+ [ "|=|=" ],
+ [ "o+o-" ]
+ ],
+ "parts": [
+ { "x": 0, "y": 0, "parts": [ "frame#vertical_2", "seat#windshield_front", "seatbelt", "roof", "controls" ] },
+ { "x": 0, "y": 0, "parts": [ "stereo", "dashboard", "vehicle_alarm", "horn_car" ] },
+ { "x": 0, "y": -1, "parts": [ "frame#vertical_left", "door#nw" ] },
+ { "x": 0, "y": 1, "parts": [ "frame#vertical_2", "seat#windshield_front", "seatbelt", "roof" ] },
+ { "x": 0, "y": 2, "parts": [ "frame#vertical_right", "door#ne" ] },
+ { "x": 1, "y": -1, "parts": [ "frame#vertical_left", "windshield#wheel_left" ] },
+ { "x": 1, "y": -1, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 1, "y": 0, "parts": [ "frame#horizontal", "windshield#cover_left" ] },
+ { "x": 1, "y": 1, "parts": [ "frame#horizontal", "windshield#cover_right" ] },
+ { "x": 1, "y": 2, "parts": [ "frame#vertical_right", "windshield#wheel_right" ] },
+ { "x": 1, "y": 2, "parts": [ "wheel_mount_medium_steerable", "wheel" ] },
+ { "x": 2, "y": -1, "parts": [ "frame#nw", "halfboard#nw", "headlight" ] },
+ { "x": 2, "y": 0, "parts": [ "frame#horizontal_front", "trunk" ] },
+ { "x": 2, "y": 1, "parts": [ "frame#horizontal_front", "trunk" ] },
+ { "x": 2, "y": 1, "parts": [ { "part": "tank", "fuel": "gasoline" } ] },
+ { "x": 2, "y": 2, "parts": [ "frame#ne", "halfboard#ne", "headlight" ] },
+ { "x": -1, "y": -1, "parts": [ "frame#sw", "halfboard#hatch_wheel_left", "wheel_mount_medium", "wheel" ] },
+ { "x": -1, "y": 0, "parts": [ "frame#horizontal_rear", "halfboard#horizontal_2_rear" ] },
+ { "x": -1, "y": 0, "parts": [ "engine_inline4", "alternator_car", "battery_car" ] },
+ { "x": -1, "y": 1, "parts": [ "frame#horizontal_rear", "halfboard#horizontal_2_rear" ] },
+ { "x": -1, "y": 2, "parts": [ "frame#se", "halfboard#hatch_wheel_right", "wheel_mount_medium", "wheel" ] }
+ ]
}
]
diff --git a/data/mods/TEST_DATA/vehicle_drag_test.json b/data/mods/TEST_DATA/vehicle_drag_test.json
index 9f52a5845e8ea..102d2ca0b8717 100644
--- a/data/mods/TEST_DATA/vehicle_drag_test.json
+++ b/data/mods/TEST_DATA/vehicle_drag_test.json
@@ -16,7 +16,7 @@
"road_roller": [ 2.104312, 2.839298, 9433.238542, 9000, 10428 ],
"semi_truck": [ 1.108663, 7.621904, 5137.978611, 10870, 12710 ],
"truck_trailer": [ 1.12875, 10.893304, 4827.95, 0, 0 ],
- "beetle": [ 0.78561, 1.562241, 1105.901562, 9009, 10747 ],
+ "test_beetle": [ 0.78561, 1.562241, 1105.901562, 9009, 10747 ],
"inflatable_boat": [ 0.46956, 3.577952, 2.02625, 553, 1089 ],
"fire_engine": [ 2.447775, 2.850525, 1871.648214, 8570, 10201 ],
"cube_van_cheap": [ 0.8643, 2.51547, 2064.564583, 8594, 10287 ],
diff --git a/data/mods/TEST_DATA/vehicle_efficiency_test.json b/data/mods/TEST_DATA/vehicle_efficiency_test.json
index 4d0e6e0ddda2b..93e8f93a02b9d 100644
--- a/data/mods/TEST_DATA/vehicle_efficiency_test.json
+++ b/data/mods/TEST_DATA/vehicle_efficiency_test.json
@@ -13,7 +13,7 @@
"ambulance": { "forward": [ 1718161, 581100, 494600, 92170, 74550 ], "reverse": [ 1718161, 54450, 54030, 41110, 39970 ] },
"superbike": { "forward": [ 233585, 126400, 73470, 45480, 26130 ], "reverse": [ 233585, 19660, 11160, 13860, 8875 ] },
"electric_car": { "forward": [ 715829, 203700, 173900, 16850, 14030 ], "reverse": [ 715829, 204000, 174200, 16890, 14060 ] },
- "beetle": { "forward": [ 711045, 499600, 434400, 116300, 95800 ], "reverse": [ 711045, 60380, 60270, 47140, 45680 ] },
+ "test_beetle": { "forward": [ 711045, 499600, 434400, 116300, 95800 ], "reverse": [ 711045, 60380, 60270, 47140, 45680 ] },
"scooter": { "forward": [ 38191, 309800, 309800, 237100, 237100 ], "reverse": [ 38191, 89140, 89140, 68680, 68680 ] },
"truck_swat": { "forward": [ 6046751, 629000, 112300, 34510, 7719 ], "reverse": [ 6046751, 126300, 127100, 32650, 7898 ] },
"fire_truck": { "forward": [ 6188143, 404800, 82000, 21260, 4751 ], "reverse": [ 6188143, 56790, 56830, 21220, 4673 ] },
diff --git a/data/mods/TropiCataclysm/tropical_regional_map_settings.json b/data/mods/TropiCataclysm/tropical_regional_map_settings.json
index f8dd137b93631..f69f0782b6f85 100644
--- a/data/mods/TropiCataclysm/tropical_regional_map_settings.json
+++ b/data/mods/TropiCataclysm/tropical_regional_map_settings.json
@@ -1262,7 +1262,8 @@
"public_works": 200,
"office_tower": 150,
"office_tower_2": 150,
- "office_tower_large": 500,
+ "office_skyscraper": 300,
+ "office_tower_large": 300,
"office_tower_hiddenlab": 50,
"mall": 100,
"home_improvement_superstore_new": 150,
diff --git a/data/mods/Xedra_Evolved/effects/effect_on_condition.json b/data/mods/Xedra_Evolved/effects/effect_on_condition.json
index 64a57a6dbc4a7..6221a2074846b 100644
--- a/data/mods/Xedra_Evolved/effects/effect_on_condition.json
+++ b/data/mods/Xedra_Evolved/effects/effect_on_condition.json
@@ -31,5 +31,20 @@
"recurrence": [ "72 hours", "168 hours" ],
"condition": { "u_has_items": { "item": "book_teens_deduction", "count": 1 } },
"effect": [ { "u_message": "XE_SCRAGGY-BOO_MESSAGES_1", "snippet": true } ]
+ },
+ {
+ "type": "effect_on_condition",
+ "id": "EOC_EATER_CHECK",
+ "global": true,
+ "recurrence": [ "12 hours", "72 hours" ],
+ "condition": { "math": [ "u_val('spell_count', 'school: EATER')", ">=", "6" ] },
+ "deactivate_condition": { "u_has_trait": "EATER_SIXTH_SENSE" },
+ "effect": [
+ {
+ "u_message": "You suddenly realize that your ability to sense the unnatural has expanded to a level beyond those of the normal five senses.",
+ "type": "good"
+ },
+ { "u_add_trait": "EATER_SIXTH_SENSE" }
+ ]
}
]
diff --git a/data/mods/Xedra_Evolved/enchantments/mutations.json b/data/mods/Xedra_Evolved/enchantments/mutations.json
index 8db16832de1d9..b1cc42deee030 100644
--- a/data/mods/Xedra_Evolved/enchantments/mutations.json
+++ b/data/mods/Xedra_Evolved/enchantments/mutations.json
@@ -25,5 +25,11 @@
"id": "BONUS_INVENTOR",
"condition": "ALWAYS",
"values": [ { "value": "MAX_MANA", "add": { "math": [ "u_skill('deduction')*50" ] } } ]
+ },
+ {
+ "type": "enchantment",
+ "id": "EATER_SIXTH_SENSE",
+ "condition": "ALWAYS",
+ "values": [ { "value": "MAX_MANA", "add": { "math": [ "u_skill('deduction')*50" ] } } ]
}
]
diff --git a/data/mods/Xedra_Evolved/itemgroups/dreamsmith_procgen.json b/data/mods/Xedra_Evolved/itemgroups/dreamsmith_procgen.json
index 3044541a094d0..48b2f479b2198 100644
--- a/data/mods/Xedra_Evolved/itemgroups/dreamsmith_procgen.json
+++ b/data/mods/Xedra_Evolved/itemgroups/dreamsmith_procgen.json
@@ -453,5 +453,43 @@
"prob": 100
}
]
+ },
+ {
+ "type": "item_group",
+ "//": "Dreamsmith artifact creation itemgroup.",
+ "id": "dreamsmith_artifact",
+ "subtype": "distribution",
+ "entries": [
+ { "group": "dreamforged_boots_ench", "prob": 100 },
+ { "group": "dreamforged_armguard_plate_ench", "prob": 100 },
+ { "group": "dreamforged_plate_armor_ench", "prob": 100 },
+ { "group": "dreamforged_helmet_ench", "prob": 100 },
+ { "group": "dreamforged_fullhelmet_ench", "prob": 100 },
+ { "group": "dreamforged_knuckle_ench", "prob": 100 },
+ { "group": "dreamforged_lucerne_ench", "prob": 100 },
+ { "group": "dreamforged_khopesh_ench", "prob": 100 },
+ { "group": "dreamforged_zweihander_ench", "prob": 100 },
+ { "group": "dreamforged_wakizashi_ench", "prob": 100 },
+ { "group": "dreamforged_tanto_ench", "prob": 100 },
+ { "group": "dreamforged_rapier_ench", "prob": 100 },
+ { "group": "dreamforged_nodachi_ench", "prob": 100 },
+ { "group": "dreamforged_kukri_ench", "prob": 100 },
+ { "group": "dreamforged_kris_ench", "prob": 100 },
+ { "group": "dreamforged_knife_combat_ench", "prob": 100 },
+ { "group": "dreamforged_katana_ench", "prob": 100 },
+ { "group": "dreamforged_battleaxe_ench", "prob": 100 },
+ { "group": "dreamforged_broadsword_ench", "prob": 100 },
+ { "group": "dreamforged_arming_sword_ench", "prob": 100 },
+ { "group": "dreamforged_estoc_ench", "prob": 100 },
+ { "group": "dreamforged_morningstar_ench", "prob": 100 },
+ { "group": "dreamforged_mace_ench", "prob": 100 },
+ { "group": "dreamforged_naginata_ench", "prob": 100 },
+ { "group": "dreamforged_glaive_ench", "prob": 100 },
+ { "group": "dreamforged_halberd_ench", "prob": 100 },
+ { "group": "dreamforged_spear_ench", "prob": 100 },
+ { "group": "dreamforged_warhammer_ench", "prob": 100 },
+ { "group": "dreamforged_longsword_ench", "prob": 100 },
+ { "group": "dreamforged_q_staff_ench", "prob": 100 }
+ ]
}
]
diff --git a/data/mods/Xedra_Evolved/itemgroups/spell_artifacts/main.json b/data/mods/Xedra_Evolved/itemgroups/spell_artifacts/main.json
index e55e324a11d55..b4cb9e80a8717 100644
--- a/data/mods/Xedra_Evolved/itemgroups/spell_artifacts/main.json
+++ b/data/mods/Xedra_Evolved/itemgroups/spell_artifacts/main.json
@@ -37,5 +37,52 @@
{ "group": "xe_eater_spells_high", "prob": 100 },
{ "group": "xe_inventor_spells_high", "prob": 100 }
]
+ },
+ {
+ "type": "item_group",
+ "//": "Inventor created items itemgroup.",
+ "id": "inventor_creations",
+ "subtype": "distribution",
+ "items": [
+ [ "helmet_inventor", 100 ],
+ [ "inventor_backpack", 100 ],
+ [ "inventor_leg_weight", 100 ],
+ [ "inventor_jump_boots", 100 ],
+ [ "aura_force", 100 ],
+ [ "vision_halo", 100 ],
+ [ "inventor_fists", 100 ],
+ [ "wolf_mask", 100 ],
+ [ "magnetic_holster", 100 ],
+ [ "battery_gun", 100 ],
+ [ "ray_gun", 50 ],
+ [ "ray_rifle", 10 ],
+ [ "rip_ticket", 100 ],
+ [ "ion_gun", 100 ],
+ [ "inventor_shotgun", 100 ],
+ [ "sonic_gun", 100 ],
+ [ "heater_gun", 100 ],
+ [ "inventor_pistol", 100 ],
+ [ "combatsaw_spear_off", 100 ],
+ [ "inventor_light_minus_cell", 100 ],
+ [ "inventor_light_cell", 100 ],
+ [ "inventor_medium_cell", 50 ],
+ [ "inventor_heavy_cell", 10 ],
+ [ "inventor_welder", 5 ],
+ [ "heater_tool", 100 ]
+ ]
+ },
+ {
+ "type": "item_group",
+ "id": "xe_border_patrol_evidence",
+ "//": "Itemgroup for Border Patrol Evidence rooms",
+ "subtype": "distribution",
+ "entries": [
+ { "group": "xe_all_spells_low", "prob": 400 },
+ { "group": "xe_all_spells_mid", "prob": 200 },
+ { "group": "xe_all_spells_high", "prob": 100 },
+ { "group": "dreamer_artifact", "prob": 50 },
+ { "group": "dreamsmith_artifact", "prob": 50 },
+ { "group": "inventor_creations", "prob": 50 }
+ ]
}
]
diff --git a/data/mods/Xedra_Evolved/mapgen/nested/field_office_nests.json b/data/mods/Xedra_Evolved/mapgen/nested/field_office_nests.json
index 4e1dd8a3ff454..7fc8efcc05550 100644
--- a/data/mods/Xedra_Evolved/mapgen/nested/field_office_nests.json
+++ b/data/mods/Xedra_Evolved/mapgen/nested/field_office_nests.json
@@ -353,6 +353,34 @@
"palettes": [ "field_office_palette" ]
}
},
+ {
+ "type": "mapgen",
+ "method": "json",
+ "nested_mapgen_id": "xed__contraband_containment",
+ "object": {
+ "mapgensize": [ 16, 16 ],
+ "rotation": [ 0, 0 ],
+ "rows": [
+ "*V..............",
+ "*V..............",
+ "*V..............",
+ "*|...FFF..FFF...",
+ "*V...-|-..-|-...",
+ "*Vcx.d|cx.d|cx..",
+ "*Vch.d|ch.d|c...",
+ "*|d.hc|d.hc|d.h.",
+ "*Vd.xc|d.xc|d...",
+ "*V....|....|....",
+ "*Vd.h.|c.h.|..hd",
+ "*|dccx|cxdd|xccd",
+ "*|-HHH-HHHH-HHH-",
+ "****************",
+ "****************",
+ "****************"
+ ],
+ "palettes": [ "field_office_palette" ]
+ }
+ },
{
"type": "mapgen",
"method": "json",
@@ -372,7 +400,7 @@
"bb...bb|......V*",
"tt...tt|-=----|*",
"tt...tt|......|*",
- "bb.a.bb|FQFQFQ|*",
+ "bb.a.bb|QQQQQQ|*",
"-HHHHH-|------|*",
"****************",
"****************",
@@ -1175,11 +1203,11 @@
"palettes": [ "lab_palette" ],
"computers": {
"6": {
- "name": "Containment Control",
+ "name": "Border Patrol Containment Room Controls",
"security": 4,
"options": [
{ "name": "EMERGENCY CONTAINMENT UNLOCK", "action": "unlock", "security": 4 },
- { "name": "EMERGENCY CLEANSE", "action": "disconnect", "security": 7 }
+ { "name": "EMERGENCY CLEANSE", "action": "terminate", "security": 7 }
],
"failures": [ { "action": "damage" }, { "action": "shutdown" } ]
}
@@ -1208,11 +1236,11 @@
"palettes": [ "lab_palette" ],
"computers": {
"6": {
- "name": "Containment Control",
+ "name": "Border Patrol Containment Room Controls",
"security": 4,
"options": [
{ "name": "EMERGENCY CONTAINMENT UNLOCK", "action": "unlock", "security": 4 },
- { "name": "EMERGENCY CLEANSE", "action": "disconnect", "security": 7 }
+ { "name": "EMERGENCY CLEANSE", "action": "terminate", "security": 7 }
],
"failures": [ { "action": "damage" }, { "action": "shutdown" } ]
}
@@ -1240,11 +1268,11 @@
"palettes": [ "lab_palette" ],
"computers": {
"6": {
- "name": "Containment Control",
+ "name": "Border Patrol Containment Room Controls",
"security": 4,
"options": [
{ "name": "EMERGENCY CONTAINMENT UNLOCK", "action": "unlock", "security": 4 },
- { "name": "EMERGENCY CLEANSE", "action": "disconnect", "security": 7 }
+ { "name": "EMERGENCY CLEANSE", "action": "terminate", "security": 7 }
],
"failures": [ { "action": "damage" }, { "action": "shutdown" } ]
}
@@ -1273,11 +1301,11 @@
"palettes": [ "lab_palette" ],
"computers": {
"6": {
- "name": "Containment Control",
+ "name": "Border Patrol Containment Room Controls",
"security": 4,
"options": [
{ "name": "EMERGENCY CONTAINMENT UNLOCK", "action": "unlock", "security": 4 },
- { "name": "EMERGENCY CLEANSE", "action": "disconnect", "security": 7 }
+ { "name": "EMERGENCY CLEANSE", "action": "terminate", "security": 7 }
],
"failures": [ { "action": "damage" }, { "action": "shutdown" } ]
}
diff --git a/data/mods/Xedra_Evolved/mapgen/xedra_field_office.json b/data/mods/Xedra_Evolved/mapgen/xedra_field_office.json
index a7c709864d0f2..2aab902eafdfc 100644
--- a/data/mods/Xedra_Evolved/mapgen/xedra_field_office.json
+++ b/data/mods/Xedra_Evolved/mapgen/xedra_field_office.json
@@ -107,19 +107,19 @@
"ss%|:::::...|--|-|-|HHHGGHHH|-|-|--|...:::::|%ss",
"ss%|:::::...|SS|T|T|........|T|T|SS|...:::::|%ss",
"ss%|----|...+ii|+|+|........|+|+|ii+...|----|%ss",
- "ss%|rrrr|...|iiiiii|........|iiiiii|...|rrrr|%ss",
- "ss%|''''+...|---|--||......||--|---|...+''''|%ss",
- "ss%|rrrr|...|>R<|EEE|......|xEE|>R<|...|rrrr|%ss",
+ "ss%|gggg|6..|iiiiii|........|iiiiii|...|rrrr|%ss",
+ "ss%|''''L...|---|--||......||--|---|...+''''|%ss",
+ "ss%|gggg|...|>R<|EEE|......|xEE|>R<|...|rrrr|%ss",
"ss%|----|...|'R'|EEED......DEEE|'R'|...|----|%ss",
"ss%|:::::...|'''|EEED......DEEE|'''|...:::::|%ss",
"ss%|:::::...|'''|EEx|......|EEE|'''|...:::::|%ss",
"ss%|:::::...|-+-|---|^....^|---|-+-|...:::::|%ss",
"ss%Vc.h.+..........................+...:::::V%ss",
"ss%Vcddx|^.........................+...:::::V%ss",
- "ssI|-ww-|-|-+--ccc--|-+----|...|---|...:::::|%ss",
- "ss%|''O''O|..cc.h..F|d.cc.F|...='''+...:::::V%ss",
- "sss=''''''+...h....F|dh...F|...|rrr|^..::::^V%ss",
- "ss%|rrrOO'|.xdd....F|xxx|--|...|---|--------|%ss",
+ "ssI|----|-|-+--ccc--|-+----|...|---|...:::::|%ss",
+ "ss%|QQQQQQ|..cc.h..F|d.cc.F|...='''+...:::::V%ss",
+ "sss|''''''L...h....F|dh...F|HGH|rrr|^..::::^V%ss",
+ "ss%|QQQQQQ|7xdd....F|xxx|--|...|---|--------|%ss",
"ssI|------|---------|---|..a...::::::::.....VIss",
"ss%|~################~~~|......::::::::.....Vsss",
"ss%|~#±±±±±±##±±±±±±#~~~|......::::::::.....Gsss",
@@ -147,6 +147,20 @@
"repeat": [ 1, 4 ]
}
],
+ "computers": {
+ "7": {
+ "name": "Border Partol OS v0.A17 - Armory Access",
+ "security": 2,
+ "options": [ { "name": "Unlock Armory", "action": "unlock" } ],
+ "failures": [ { "action": "shutdown" }, { "action": "alarm" }, { "action": "manhacks" } ]
+ },
+ "6": {
+ "name": "Border Partol OS v0.A17 - Evidence Locker Access",
+ "security": 3,
+ "options": [ { "name": "Unlock Evidence Locker", "action": "unlock" } ],
+ "failures": [ { "action": "shutdown" }, { "action": "alarm" }, { "action": "manhacks" } ]
+ }
+ },
"place_nested": [
{
"chunks": [ [ "xed_4x4_cr1_l", 20 ], [ "xed_4x4_cr2_l", 20 ], [ "xed_4x4_cr3_l", 20 ] ],
@@ -338,6 +352,7 @@
{
"chunks": [
[ "xed_office_slide_dl", 20 ],
+ [ "xed__contraband_containment", 40 ],
[ "xed_glass_dl", 20 ],
[ "xed_private_dl", 20 ],
[ "xed_crowded_dl", 20 ],
@@ -724,19 +739,19 @@
"ss%|:::::...|--|-|-|HHHGGHHH|-|-|--|...:::::|%ss",
"ss%|:::::...|SS|T|T|........|T|T|SS|...:::::|%ss",
"ss%|----|...+ii|+|+|........|+|+|ii+...|----|%ss",
- "ss%|rrrr|...|iiiiii|........|iiiiii|...|rrrr|%ss",
- "ss%|''''+...|---|--||......||--|---|...+''''|%ss",
- "ss%|rrrr|...|>R<|EEE|......|xEE|>R<|...|rrrr|%ss",
+ "ss%|gggg|6..|iiiiii|........|iiiiii|...|rrrr|%ss",
+ "ss%|''''L...|---|--||......||--|---|...+''''|%ss",
+ "ss%|gggg|...|>R<|EEE|......|xEE|>R<|...|rrrr|%ss",
"ss%|----|...|'R'|EEED......DEEE|'R'|...|----|%ss",
"ss%|:::::...|'''|EEED......DEEE|'''|...:::::|%ss",
"ss%|:::::...|'''|EEx|......|EEE|'''|...:::::|%ss",
"ss%|:::::...|-+-|---|^....^|---|-+-|...:::::|%ss",
"ss%Vc.h.+..........................+...:::::V%ss",
"ss%Vcddx|^.........................+...:::::V%ss",
- "ssI|-ww-|-|-+--ccc--|-+----|...|---|...:::::|%ss",
- "ss%|''O''O|..cc.h..F|d.cc.F|...='''+...:::::V%ss",
- "sss=''''''+...h....F|dh...F|...|rrr|^..::::^V%ss",
- "ss%|rrrOO'|.xdd....F|xxx|--|...|---|--------|%ss",
+ "ssI|----|-|-+--ccc--|-+----|...|---|...:::::|%ss",
+ "ss%|QQQQQQ|..cc.h..F|d.cc.F|...='''+...:::::V%ss",
+ "sss|''''''L...h....F|dh...F|HGH|rrr|^..::::^V%ss",
+ "ss%|QQQQQQ|7xdd....F|xxx|--|...|---|--------|%ss",
"ssI|------|---------|---|..a...::::::::.....VIss",
"ss%|~################~~~|......::::::::.....Vsss",
"ss%|~#±±±±±±##±±±±±±#~~~|......::::::::.....Gsss",
@@ -758,6 +773,20 @@
{ "monster": "GROUP_FERAL_AGENTS", "x": [ 10, 23 ], "y": [ 10, 23 ], "chance": 2, "repeat": [ 1, 4 ] },
{ "monster": "GROUP_Exodii_Jotunn", "x": [ 26, 38 ], "y": [ 26, 38 ], "chance": 2, "repeat": [ 1, 4 ] }
],
+ "computers": {
+ "7": {
+ "name": "Border Partol OS v0.A17 - Armory Access",
+ "security": 2,
+ "options": [ { "name": "Unlock Armory", "action": "unlock" } ],
+ "failures": [ { "action": "shutdown" }, { "action": "alarm" }, { "action": "manhacks" } ]
+ },
+ "6": {
+ "name": "Border Partol OS v0.A17 - Evidence Locker Access",
+ "security": 3,
+ "options": [ { "name": "Unlock Evidence Locker", "action": "unlock" } ],
+ "failures": [ { "action": "shutdown" }, { "action": "alarm" }, { "action": "manhacks" } ]
+ }
+ },
"place_nested": [
{
"chunks": [ [ "xed_4x4_cr1_l", 20 ], [ "xed_4x4_cr2_l", 20 ], [ "xed_4x4_cr3_l", 20 ] ],
@@ -949,6 +978,7 @@
{
"chunks": [
[ "xed_office_slide_dl", 20 ],
+ [ "xed__contraband_containment", 40 ],
[ "xed_glass_dl", 20 ],
[ "xed_private_dl", 20 ],
[ "xed_crowded_dl", 20 ],
diff --git a/data/mods/Xedra_Evolved/mapgen_palettes/field_office_palette.json b/data/mods/Xedra_Evolved/mapgen_palettes/field_office_palette.json
index e4f22d782c63c..3037079b7d0f3 100644
--- a/data/mods/Xedra_Evolved/mapgen_palettes/field_office_palette.json
+++ b/data/mods/Xedra_Evolved/mapgen_palettes/field_office_palette.json
@@ -25,6 +25,7 @@
" ": "t_region_groundcover_urban",
",": "t_pavement_y",
"_": "t_pavement",
+ "L": "t_door_metal_locked",
"%": [ [ "t_region_shrub_decorative", 16 ], [ "t_region_groundcover_forest", 5 ] ],
"I": "t_region_tree_shade",
"+": "t_door_c",
@@ -67,12 +68,13 @@
"e": "f_fridge",
"^": [ "f_indoor_plant", "f_indoor_plant_y" ],
"r": "f_rack",
+ "g": "f_rack",
"S": "f_sink",
"T": "f_toilet",
"O": [ [ "f_cardboard_box", 6 ], "f_crate_c" ],
"a": "f_trashcan",
"F": "f_filing_cabinet",
- "Q": "f_gun_safe_el",
+ "Q": "f_locker",
"x": "f_console_broken",
"X": "f_generator_broken",
"N": "f_machinery_heavy",
@@ -93,10 +95,11 @@
],
"o": { "item": "oven", "chance": 70 },
"r": [ { "item": "office_supplies", "chance": 65, "repeat": [ 1, 10 ] } ],
+ "g": [ { "item": "xe_border_patrol_evidence", "chance": 65 } ],
"y": { "item": "cleaning", "chance": 60, "repeat": [ 1, 2 ] },
"Y": { "item": "jackets", "chance": 90, "repeat": [ 3, 8 ] },
"a": { "item": "trash", "chance": 70, "repeat": [ 2, 5 ] },
- "Q": { "item": "guns_smg_rare", "chance": 70, "repeat": [ 1, 3 ] },
+ "Q": { "item": "nested_fn_p90", "chance": 70, "repeat": [ 1, 3 ] },
"t": { "item": "dining", "chance": 40, "repeat": [ 1, 2 ] },
"F": { "item": "file_room", "chance": 70, "repeat": [ 1, 10 ] },
".": { "item": "office_mess", "chance": 1 }
diff --git a/data/mods/Xedra_Evolved/mutations/mutations.json b/data/mods/Xedra_Evolved/mutations/mutations.json
index 80e87d8a082c6..620a86562fe8d 100644
--- a/data/mods/Xedra_Evolved/mutations/mutations.json
+++ b/data/mods/Xedra_Evolved/mutations/mutations.json
@@ -269,6 +269,7 @@
"name": { "str": "Saint's blood" },
"points": 0,
"description": "Through a complicated ritual utilizing a saint's relic, you have transubstantiated your own blood with the holy blood of the saints. It'll prevent you from becoming infected with vampirism while you live, effects postmortem unknown.",
+ "starting_trait": false,
"valid": false,
"purifiable": false,
"types": [ "BLOOD" ]
@@ -282,5 +283,16 @@
"starting_trait": false,
"valid": false,
"flags": [ "UNCANNY_DODGE" ]
+ },
+ {
+ "type": "mutation",
+ "id": "EATER_SIXTH_SENSE",
+ "name": { "str": "Eater's Sixth Sense" },
+ "points": 0,
+ "description": "You are no longer limited to the five senses common to most humans in your hunt for the unnatural.",
+ "starting_trait": false,
+ "valid": false,
+ "purifiable": false,
+ "enchantments": [ "EATER_SIXTH_SENSE" ]
}
]
diff --git a/data/mods/classic_zombies/alberta_regional_map_settings.json b/data/mods/classic_zombies/alberta_regional_map_settings.json
index 8c10bb534a5ee..7e00ba356372e 100644
--- a/data/mods/classic_zombies/alberta_regional_map_settings.json
+++ b/data/mods/classic_zombies/alberta_regional_map_settings.json
@@ -1122,7 +1122,8 @@
"public_works": 200,
"office_tower": 150,
"office_tower_2": 150,
- "office_tower_large": 500,
+ "office_skyscraper": 300,
+ "office_tower_large": 300,
"office_tower_hiddenlab": 50,
"mall": 100,
"home_improvement_superstore_new": 150,
diff --git a/data/mods/desert_region/desert_regional_map_settings.json b/data/mods/desert_region/desert_regional_map_settings.json
index d5a64e9e84c70..8da94f9340179 100644
--- a/data/mods/desert_region/desert_regional_map_settings.json
+++ b/data/mods/desert_region/desert_regional_map_settings.json
@@ -764,7 +764,8 @@
"public_works": 200,
"office_tower": 150,
"office_tower_2": 150,
- "office_tower_large": 500,
+ "office_skyscraper": 300,
+ "office_tower_large": 300,
"office_tower_hiddenlab": 50,
"mall": 100,
"home_improvement_superstore_new": 150,
diff --git a/object_creator/creator_main.cpp b/object_creator/creator_main.cpp
index 3fa3224db107c..dd85ab9472ee5 100644
--- a/object_creator/creator_main.cpp
+++ b/object_creator/creator_main.cpp
@@ -20,6 +20,8 @@
#include
#include
+#include
+#include
#ifdef _WIN32
#include
@@ -108,10 +110,23 @@ int main( int argc, char *argv[] )
MAP_SHARING::setDefaults();
+ QApplication app( argc, argv );
+ //Create a splash screen that tells the user we're loading
+ //First we create a pixmap with the desired size
+ QPixmap splash( QSize(640, 480) );
+ splash.fill(Qt::gray);
+
+ //Then we create the splash screen and show it
+ QSplashScreen splashscreen( splash );
+ splashscreen.show();
+ splashscreen.showMessage( "Initializing Object Creator...", Qt::AlignCenter );
+ //let the thread sleep for two seconds to show the splashscreen
+ std::this_thread::sleep_for( std::chrono::seconds( 2 ) );
+ app.processEvents();
+
QSettings settings( QSettings::IniFormat, QSettings::UserScope,
"CleverRaven", "Cataclysm - DDA" );
-
cli_opts cli;
rng_set_engine_seed( cli.seed );
@@ -138,6 +153,7 @@ int main( int argc, char *argv[] )
world_generator = std::make_unique();
world_generator->init();
+
std::vector mods;
mods.push_back( mod_id( "dda" ) );
if( settings.contains( "mods/include" ) ) {
@@ -150,7 +166,8 @@ int main( int argc, char *argv[] )
g->load_core_data( ui );
g->load_world_modfiles( ui );
+
+ splashscreen.finish( nullptr ); //Destroy the splashscreen
- QApplication app( argc, argv );
creator::main_window().execute( app );
}
diff --git a/object_creator/creator_main_window.cpp b/object_creator/creator_main_window.cpp
index 4c104abc03173..c298f8bba5f91 100644
--- a/object_creator/creator_main_window.cpp
+++ b/object_creator/creator_main_window.cpp
@@ -1,13 +1,12 @@
#include "creator_main_window.h"
-
-#include "spell_window.h"
-#include "item_group_window.h"
#include "enum_conversions.h"
#include "translations.h"
#include
#include
#include
+#include
+#include
namespace io
@@ -30,29 +29,39 @@ namespace io
int creator::main_window::execute( QApplication &app )
{
-
//Create the main window
QMainWindow creator_main_window;
+ //Create a splash screen that tells the user we're loading
+ //First we create a pixmap with the desired size
+ QPixmap splash( QSize(640, 480) );
+ splash.fill(Qt::gray);
+ //Then we create the splash screen and show it
+ QSplashScreen splashscreen( splash );
+ splashscreen.show();
+ splashscreen.showMessage( "Loading mainwindow...", Qt::AlignCenter );
+ //let the thread sleep for a second to show the splashscreen
+ std::this_thread::sleep_for( std::chrono::seconds( 2 ) );
+ app.processEvents();
//Create a tab widget and add it to the main window
QTabWidget* tabWidget = new QTabWidget(&creator_main_window);
creator_main_window.setCentralWidget(tabWidget);
//Create the spell window and add it as a tab
- spell_window spell_editor;
- tabWidget->addTab(&spell_editor, "Spell");
+ spell_editor = new spell_window();
+ tabWidget->addTab(spell_editor, "Spell");
//Create the item group window and add it as a tab
- item_group_window item_group_editor;
- tabWidget->addTab(&item_group_editor, "Item group");
+ item_group_editor = new item_group_window();
+ tabWidget->addTab(item_group_editor, "Item group");
//Create the mod selection window and add it as a tab
mod_selection = new mod_selection_window();
tabWidget->addTab(mod_selection, "Mod selection");
-
- //Make the main window maximized
- creator_main_window.showMaximized();
+ creator_main_window.showMaximized();
+ splashscreen.finish( &creator_main_window ); //Destroy the splashscreen
+
return app.exec();
}
diff --git a/object_creator/creator_main_window.h b/object_creator/creator_main_window.h
index a288218b8c94c..e43ed0a2a481c 100644
--- a/object_creator/creator_main_window.h
+++ b/object_creator/creator_main_window.h
@@ -3,6 +3,9 @@
#include "enum_traits.h"
#include "mod_selection_window.h"
+#include "item_group_window.h"
+#include "spell_window.h"
+#include //include thread for the sleep_for function
class QApplication;
@@ -14,6 +17,8 @@ class main_window
int execute( QApplication &app );
private:
mod_selection_window* mod_selection;
+ item_group_window* item_group_editor;
+ spell_window* spell_editor;
};
enum class jsobj_type {
diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp
index 19ca68b3030ff..5abb83afab6aa 100644
--- a/src/activity_actor.cpp
+++ b/src/activity_actor.cpp
@@ -3031,7 +3031,7 @@ void safecracking_activity_actor::do_turn( player_activity &act, Character &who
{
bool can_crack = who.has_flag( json_flag_SUPER_HEARING );
// short-circuit to avoid the more expensive iteration over items
- can_crack = can_crack || who.has_item_with_flag( flag_SAFECRACK );
+ can_crack = can_crack || who.cache_has_item_with( flag_SAFECRACK );
if( !can_crack ) {
// We lost our cracking tool somehow, bail out.
diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp
index af0fc5c676ef0..6d642bf0f29af 100644
--- a/src/activity_item_handling.cpp
+++ b/src/activity_item_handling.cpp
@@ -1143,9 +1143,7 @@ static activity_reason_info can_do_activity_there( const activity_id &act, Chara
return activity_reason_info::fail( do_activity_reason::NO_ZONE );
}
- if( you.has_item_with( []( const item & itm ) {
- return itm.has_flag( json_flag_MOP );
- } ) ) {
+ if( you.cache_has_item_with( json_flag_MOP ) ) {
return activity_reason_info::ok( do_activity_reason::NEEDS_MOP );
} else {
return activity_reason_info::fail( do_activity_reason::NEEDS_MOP );
@@ -1326,17 +1324,14 @@ static activity_reason_info can_do_activity_there( const activity_id &act, Chara
if( seed.is_empty() ) {
return activity_reason_info::fail( do_activity_reason::ALREADY_DONE );
}
- std::vector- seed_inv = you.items_with( []( const item & itm ) {
- return itm.is_seed();
- } );
- for( const item *elem : seed_inv ) {
- if( elem->typeId() == itype_id( seed ) ) {
- return activity_reason_info::ok( do_activity_reason::NEEDS_PLANTING );
- }
+ if( you.cache_has_item_with( "is_seed", &item::is_seed, [&seed]( const item & it ) {
+ return it.typeId() == itype_id( seed );
+ } ) ) {
+ return activity_reason_info::ok( do_activity_reason::NEEDS_PLANTING );
}
// didn't find the seed, but maybe there are overlapping farm zones
// and another of the zones is for a seed that we have
- // so loop again, and return false once all zones done.
+ // so loop again, and return false once all zones are done.
}
} else {
@@ -2913,12 +2908,11 @@ static bool generic_multi_activity_do(
for( const zone_data &zone : zones ) {
const itype_id seed =
dynamic_cast( zone.get_options() ).get_seed();
- std::vector
- seed_inv = you.items_with( [seed]( const item & itm ) {
- return itm.typeId() == itype_id( seed );
- } );
- // we don't have the required seed, even though we should at this point.
- // move onto the next tile, and if need be that will prompt a fetch seeds activity.
+ std::vector
- seed_inv = you.cache_get_items_with( "is_seed", itype_id( seed ), {},
+ &item::is_seed );
if( seed_inv.empty() ) {
+ // we don't have the required seed, even though we should at this point.
+ // move onto the next tile, and if need be that will prompt a fetch seeds activity.
continue;
}
// TODO: fix point types
diff --git a/src/bionics.cpp b/src/bionics.cpp
index ed777737546ad..3b7bd291077aa 100644
--- a/src/bionics.cpp
+++ b/src/bionics.cpp
@@ -1140,9 +1140,7 @@ bool Character::activate_bionic( bionic &bio, bool eff_only, bool *close_bionics
bio.powered = g->remoteveh() != nullptr || !get_value( "remote_controlling" ).empty();
}
} else if( bio.info().is_remote_fueled ) {
- std::vector
- cables = items_with( []( const item & it ) {
- return it.has_flag( flag_CABLE_SPOOL );
- } );
+ std::vector
- cables = cache_get_items_with( flag_CABLE_SPOOL );
bool has_cable = !cables.empty();
bool free_cable = false;
bool success = false;
@@ -1150,7 +1148,7 @@ bool Character::activate_bionic( bionic &bio, bool eff_only, bool *close_bionics
add_msg_if_player( m_info,
_( "You need a jumper cable connected to a power source to drain power from it." ) );
} else {
- for( item *cable : cables ) {
+ for( const item *cable : cables ) {
if( !cable->link || cable->link->has_no_links() ) {
free_cable = true;
} else if( cable->link->has_states( link_state::no_link, link_state::bio_cable ) ) {
@@ -3368,10 +3366,9 @@ std::vector
- Character::get_cable_ups()
{
std::vector
- stored_fuels;
- const std::vector
- cables = items_with( []( const item & it ) {
+ int n = cache_get_items_with( flag_CABLE_SPOOL, []( const item & it ) {
return it.link && it.link->has_states( link_state::ups, link_state::bio_cable );
- } );
- int n = cables.size();
+ } ).size();
if( n == 0 ) {
return stored_fuels;
}
@@ -3401,10 +3398,9 @@ std::vector
- Character::get_cable_solar()
{
std::vector
- solar_sources;
- const std::vector
- cables = items_with( []( const item & it ) {
+ int n = cache_get_items_with( flag_CABLE_SPOOL, []( const item & it ) {
return it.link && it.link->has_states( link_state::solarpack, link_state::bio_cable );
- } );
- int n = cables.size();
+ } ).size();
if( n == 0 ) {
return solar_sources;
}
@@ -3428,11 +3424,12 @@ std::vector
- Character::get_cable_solar()
return solar_sources;
}
-std::vector Character::get_cable_vehicle()
+std::vector Character::get_cable_vehicle() const
{
std::vector remote_vehicles;
- const std::vector
- cables = items_with( []( const item & it ) {
+ std::vector cables = cache_get_items_with( flag_CABLE_SPOOL,
+ []( const item & it ) {
return it.link && it.link->has_state( link_state::bio_cable ) &&
( it.link->has_state( link_state::vehicle_battery ) ||
it.link->has_state( link_state::vehicle_port ) );
diff --git a/src/bodygraph.cpp b/src/bodygraph.cpp
index 5ba87b345a158..48b05ccef6265 100644
--- a/src/bodygraph.cpp
+++ b/src/bodygraph.cpp
@@ -491,7 +491,7 @@ void bodygraph_display::prepare_infotext( bool reset_pos )
info_txt.emplace_back( string_format( "%s: %d%%", colorize( _( "Wetness" ), c_magenta ),
static_cast( info.wetness * 100.0f ) ) );
// part temperature
- const bool temp_precise = u->has_item_with_flag( STATIC( flag_id( "THERMOMETER" ) ) ) ||
+ const bool temp_precise = u->cache_has_item_with( STATIC( flag_id( "THERMOMETER" ) ) ) ||
u->has_flag( STATIC( json_character_flag( "THERMOMETER" ) ) );
const units::temperature temp = units::from_fahrenheit( info.temperature.first / 50.0 );
info_txt.emplace_back( string_format( "%s: %s", colorize( _( "Body temp" ), c_magenta ),
diff --git a/src/character.cpp b/src/character.cpp
index 4435d2b870095..15997d9bff9af 100644
--- a/src/character.cpp
+++ b/src/character.cpp
@@ -1273,7 +1273,7 @@ int Character::overmap_sight_range( float light_level ) const
float multiplier = mutation_value( "overmap_multiplier" );
// Binoculars double your sight range.
// When adding checks here, also call game::update_overmap_seen at the place they first become true
- const bool has_optic = has_item_with_flag( flag_ZOOM ) ||
+ const bool has_optic = cache_has_item_with( flag_ZOOM ) ||
has_flag( json_flag_ENHANCED_VISION ) ||
( is_mounted() && mounted_creature->has_flag( mon_flag_MECH_RECON_VISION ) ) ||
get_map().veh_at( pos() ).avail_part_with_feature( "ENHANCED_VISION" ).has_value();
@@ -1321,19 +1321,19 @@ bool Character::sight_impaired() const
bool Character::has_alarm_clock() const
{
map &here = get_map();
- return ( has_item_with_flag( flag_ALARMCLOCK, true ) ||
- ( here.veh_at( pos() ) &&
- !empty( here.veh_at( pos() )->vehicle().get_avail_parts( "ALARMCLOCK" ) ) ) ||
- has_flag( json_flag_ALARMCLOCK ) );
+ return cache_has_item_with_flag( flag_ALARMCLOCK, true ) ||
+ ( here.veh_at( pos() ) &&
+ !empty( here.veh_at( pos() )->vehicle().get_avail_parts( "ALARMCLOCK" ) ) ) ||
+ has_flag( json_flag_ALARMCLOCK );
}
bool Character::has_watch() const
{
map &here = get_map();
- return ( has_item_with_flag( flag_WATCH, true ) ||
- ( here.veh_at( pos() ) &&
- !empty( here.veh_at( pos() )->vehicle().get_avail_parts( "WATCH" ) ) ) ||
- has_flag( json_flag_WATCH ) );
+ return cache_has_item_with_flag( flag_WATCH, true ) ||
+ ( here.veh_at( pos() ) &&
+ !empty( here.veh_at( pos() )->vehicle().get_avail_parts( "WATCH" ) ) ) ||
+ has_flag( json_flag_WATCH );
}
void Character::react_to_felt_pain( int intensity )
@@ -2280,9 +2280,8 @@ void Character::process_turn()
// Didn't just pick something up
last_item = itype_null;
- visit_items( [this]( item * e, item * ) {
- e->process_relic( this, pos() );
- return VisitResponse::NEXT;
+ cache_visit_items_with( "is_relic", &item::is_relic, [this]( item & it ) {
+ it.process_relic( this, pos() );
} );
suffer();
@@ -2974,6 +2973,12 @@ std::list
- Character::remove_worn_items_with( const std::function Character::get_dependent_worn_items( const item &it )
{
std::list
- dependent;
@@ -5842,12 +5847,11 @@ float Character::active_light() const
float lumination = 0.0f;
int maxlum = 0;
- has_item_with( [&maxlum]( const item & it ) {
+ cache_visit_items_with( "is_emissive", &item::is_emissive, [&maxlum]( const item & it ) {
const int lumit = it.getlight_emit();
if( maxlum < lumit ) {
maxlum = lumit;
}
- return false; // continue search, otherwise has_item_with would cancel the search
} );
lumination = static_cast( maxlum );
@@ -7497,18 +7501,17 @@ void Character::recalculate_enchantment_cache()
// start by resetting the cache to all inventory items
*enchantment_cache = inv->get_active_enchantment_cache( *this );
- visit_items( [&]( const item * it, item * ) {
- for( const enchant_cache &ench : it->get_proc_enchantments() ) {
- if( ench.is_active( *this, *it ) ) {
+ cache_visit_items_with( "is_relic", &item::is_relic, [this]( const item & it ) {
+ for( const enchant_cache &ench : it.get_proc_enchantments() ) {
+ if( ench.is_active( *this, it ) ) {
enchantment_cache->force_add( ench );
}
}
- for( const enchantment &ench : it->get_defined_enchantments() ) {
- if( ench.is_active( *this, *it ) ) {
+ for( const enchantment &ench : it.get_defined_enchantments() ) {
+ if( ench.is_active( *this, it ) ) {
enchantment_cache->force_add( ench, *this );
}
}
- return VisitResponse::NEXT;
} );
// get from traits/ mutations
@@ -8927,22 +8930,263 @@ bool Character::in_sleep_state() const
return Creature::in_sleep_state() || activity.id() == ACT_TRY_SLEEP;
}
+void Character::cache_visit_items_with( const itype_id &type,
+ const std::function &do_func )
+{
+ cache_visit_items_with( "HAS TYPE " + type.str(), type, {}, nullptr, do_func );
+}
+
+void Character::cache_visit_items_with( const flag_id &type_flag,
+ const std::function &do_func )
+{
+ cache_visit_items_with( "HAS FLAG " + type_flag.str(), {}, type_flag, nullptr, do_func );
+}
+
+void Character::cache_visit_items_with( const std::string &key, bool( item::*filter_func )() const,
+ const std::function &do_func )
+{
+ cache_visit_items_with( key, {}, {}, filter_func, do_func );
+}
+
+void Character::cache_visit_items_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &do_func )
+{
+ // If the cache already exists, use it. Remove all invalid item references.
+ auto found_cache = inv_search_caches.find( key );
+ if( found_cache != inv_search_caches.end() ) {
+ inv_search_caches[key].items.erase( std::remove_if( inv_search_caches[key].items.begin(),
+ inv_search_caches[key].items.end(), [&do_func]( const safe_reference
- &it ) {
+ if( it ) {
+ do_func( *it );
+ return false;
+ }
+ return true;
+ } ), inv_search_caches[key].items.end() );
+ return;
+ } else {
+ // Otherwise, add a new cache and populate with all appropriate items in the inventory. Empty lists are still created.
+ inv_search_caches[key].type = type;
+ inv_search_caches[key].type_flag = type_flag;
+ inv_search_caches[key].filter_func = filter_func;
+ visit_items( [&]( item * it, item * ) {
+ if( ( !type.is_valid() || it->typeId() == type ) &&
+ ( !type_flag.is_valid() || it->type->has_flag( type_flag ) ) &&
+ ( filter_func == nullptr || ( it->*filter_func )() ) ) {
+
+ inv_search_caches[key].items.push_back( it->get_safe_reference() );
+ do_func( *it );
+ }
+ return VisitResponse::NEXT;
+ } );
+ }
+}
+
+void Character::cache_visit_items_with( const itype_id &type,
+ const std::function &do_func ) const
+{
+ cache_visit_items_with( "HAS TYPE " + type.str(), type, {}, nullptr, do_func );
+}
+
+void Character::cache_visit_items_with( const flag_id &type_flag,
+ const std::function &do_func ) const
+{
+ cache_visit_items_with( "HAS FLAG " + type_flag.str(), {}, type_flag, nullptr, do_func );
+}
+
+void Character::cache_visit_items_with( const std::string &key, bool( item::*filter_func )() const,
+ const std::function &do_func ) const
+{
+ cache_visit_items_with( key, {}, {}, filter_func, do_func );
+}
+
+void Character::cache_visit_items_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &do_func ) const
+{
+ // If the cache already exists, use it. Remove all invalid item references.
+ auto found_cache = inv_search_caches.find( key );
+ if( found_cache != inv_search_caches.end() ) {
+ inv_search_caches[key].items.erase( std::remove_if( inv_search_caches[key].items.begin(),
+ inv_search_caches[key].items.end(), [&do_func]( const safe_reference
- &it ) {
+ if( it ) {
+ do_func( *it );
+ return false;
+ }
+ return true;
+ } ), inv_search_caches[key].items.end() );
+ return;
+ } else {
+ // Otherwise, add a new cache and populate with all appropriate items in the inventory. Empty lists are still created.
+ inv_search_caches[key].type = type;
+ inv_search_caches[key].type_flag = type_flag;
+ inv_search_caches[key].filter_func = filter_func;
+ visit_items( [&]( item * it, item * ) {
+ if( ( !type.is_valid() || it->typeId() == type ) &&
+ ( !type_flag.is_valid() || it->type->has_flag( type_flag ) ) &&
+ ( filter_func == nullptr || ( it->*filter_func )() ) ) {
+
+ inv_search_caches[key].items.push_back( it->get_safe_reference() );
+ do_func( *it );
+ }
+ return VisitResponse::NEXT;
+ } );
+ }
+}
+
+bool Character::cache_has_item_with( const itype_id &type,
+ const std::function &check_func ) const
+{
+ return cache_has_item_with( "HAS TYPE " + type.str(), type, {}, nullptr, check_func );
+}
+
+bool Character::cache_has_item_with( const flag_id &type_flag,
+ const std::function &check_func ) const
+{
+ return cache_has_item_with( "HAS FLAG " + type_flag.str(), {}, type_flag, nullptr, check_func );
+}
+
+bool Character::cache_has_item_with( const std::string &key, bool( item::*filter_func )() const,
+ const std::function &check_func ) const
+{
+ return cache_has_item_with( key, {}, {}, filter_func, check_func );
+}
+
+bool Character::cache_has_item_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &check_func ) const
+{
+ bool aborted = false;
+
+ // If the cache already exists, use it. Stop iterating if the check_func ever returns true. Remove any invalid item references encountered.
+ auto found_cache = inv_search_caches.find( key );
+ if( found_cache != inv_search_caches.end() ) {
+ for( auto iter = found_cache->second.items.begin();
+ iter != found_cache->second.items.end(); ) {
+ if( *iter ) {
+ if( check_func( **iter ) ) {
+ aborted = true;
+ break;
+ }
+ ++iter;
+ } else {
+ iter = inv_search_caches[found_cache->first].items.erase( iter );
+ }
+ }
+ } else {
+ // Otherwise, add a new cache and populate with all appropriate items in the inventory. Empty lists are still created.
+ inv_search_caches[key].type = type;
+ inv_search_caches[key].type_flag = type_flag;
+ inv_search_caches[key].filter_func = filter_func;
+ visit_items( [&]( item * it, item * ) {
+ if( ( !type.is_valid() || it->typeId() == type ) &&
+ ( !type_flag.is_valid() || it->type->has_flag( type_flag ) ) &&
+ ( filter_func == nullptr || ( it->*filter_func )() ) ) {
+
+ inv_search_caches[key].items.push_back( it->get_safe_reference() );
+ // If check_func returns true, stop running it but keep populating the cache.
+ if( !aborted && check_func( *it ) ) {
+ aborted = true;
+ }
+ }
+ return VisitResponse::NEXT;
+ } );
+ }
+ return aborted;
+}
+
bool Character::has_item_with_flag( const flag_id &flag, bool need_charges ) const
{
return has_item_with( [&flag, &need_charges, this]( const item & it ) {
- if( it.is_tool() && need_charges ) {
- return it.has_flag( flag ) && ( it.type->tool->max_charges == 0 ||
- it.ammo_remaining( this ) > 0 );
+ return it.has_flag( flag ) && ( !need_charges || !it.is_tool() ||
+ it.type->tool->max_charges == 0 || it.ammo_remaining( this ) > 0 );
+ } );
+}
+
+bool Character::cache_has_item_with_flag( const flag_id &type_flag, bool need_charges ) const
+{
+ return cache_has_item_with( "HAS FLAG " + type_flag.str(), {}, type_flag, nullptr,
+ [this, &need_charges]( const item & it ) {
+ return !need_charges || !it.is_tool() || it.type->tool->max_charges == 0 ||
+ it.ammo_remaining( this ) > 0;
+ } );
+}
+
+std::vector
- Character::cache_get_items_with( const itype_id &type,
+ const std::function &do_and_check_func )
+{
+ return cache_get_items_with( "HAS TYPE " + type.str(), type, {}, nullptr, do_and_check_func );
+}
+
+std::vector
- Character::cache_get_items_with( const flag_id &type_flag,
+ const std::function &do_and_check_func )
+{
+ return cache_get_items_with( "HAS FLAG " + type_flag.str(), {}, type_flag, nullptr,
+ do_and_check_func );
+}
+
+std::vector
- Character::cache_get_items_with( const std::string &key,
+ bool( item::*filter_func )() const,
+ const std::function &do_and_check_func )
+{
+ return cache_get_items_with( key, {}, {}, filter_func, do_and_check_func );
+}
+
+std::vector
- Character::cache_get_items_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &do_and_check_func )
+{
+ std::vector
- ret;
+ cache_visit_items_with( key, type, type_flag, filter_func, [&ret, &do_and_check_func]( item & it ) {
+ if( do_and_check_func( it ) ) {
+ ret.push_back( &it );
}
- return it.has_flag( flag );
} );
+ return ret;
+}
+
+std::vector Character::cache_get_items_with( const itype_id &type,
+ const std::function &check_func ) const
+{
+ return cache_get_items_with( "HAS TYPE " + type.str(), type, {}, nullptr, check_func );
}
-std::vector Character::all_items_with_flag( const flag_id &flag ) const
+std::vector Character::cache_get_items_with( const flag_id &type_flag,
+ const std::function &check_func ) const
{
- return items_with( [&flag]( const item & it ) {
- return it.has_flag( flag );
+ return cache_get_items_with( "HAS FLAG " + type_flag.str(), {}, type_flag, nullptr, check_func );
+}
+
+std::vector Character::cache_get_items_with( const std::string &key,
+ bool( item::*filter_func )() const,
+ const std::function &check_func ) const
+{
+ return cache_get_items_with( key, {}, {}, filter_func, check_func );
+}
+
+std::vector Character::cache_get_items_with( const std::string &key,
+ const itype_id &type, const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &check_func ) const
+{
+ std::vector ret;
+ cache_visit_items_with( key, type, type_flag, filter_func, [&ret, &check_func]( const item & it ) {
+ if( check_func( it ) ) {
+ ret.push_back( &it );
+ }
} );
+ return ret;
+}
+
+void Character::add_to_inv_search_caches( item &it ) const
+{
+ for( auto &cache : inv_search_caches ) {
+ if( ( cache.second.type.is_valid() && it.typeId() != cache.second.type ) ||
+ ( cache.second.type_flag.is_valid() && !it.type->has_flag( cache.second.type_flag ) ) ||
+ ( cache.second.filter_func && !( it.*cache.second.filter_func )() ) ) {
+ continue;
+ }
+ cache.second.items.push_back( it.get_safe_reference() );
+ }
}
bool Character::has_charges( const itype_id &it, int quantity,
@@ -9012,9 +9256,9 @@ units::energy Character::available_ups() const
available_charges += get_power_level();
}
- for( const item *i : all_items_with_flag( flag_IS_UPS ) ) {
- available_charges += units::from_kilojoule( i->ammo_remaining() );
- }
+ cache_visit_items_with( flag_IS_UPS, [&available_charges]( const item & it ) {
+ available_charges += units::from_kilojoule( it.ammo_remaining() );
+ } );
return available_charges;
}
@@ -9039,15 +9283,14 @@ units::energy Character::consume_ups( units::energy qty, const int radius )
// UPS from inventory
if( qty != 0_kJ ) {
- std::vector ups_items = all_items_with_flag( flag_IS_UPS );
- for( const item *i : ups_items ) {
- if( i->is_tool() && i->type->tool->fuel_efficiency >= 0 ) {
- qty -= const_cast
- ( i )->energy_consume( qty, tripoint_zero, nullptr,
- i->type->tool->fuel_efficiency );
+ cache_visit_items_with( flag_IS_UPS, [&qty]( item & it ) {
+ if( it.is_tool() && it.type->tool->fuel_efficiency >= 0 ) {
+ qty -= it.energy_consume( qty, tripoint_zero, nullptr,
+ it.type->tool->fuel_efficiency );
} else {
- qty -= const_cast
- ( i )->energy_consume( qty, tripoint_zero, nullptr );
+ qty -= it.energy_consume( qty, tripoint_zero, nullptr );
}
- }
+ } );
}
// UPS from nearby map
@@ -9122,21 +9365,24 @@ std::list
- Character::use_charges( const itype_id &what, int qty,
item Character::find_firestarter_with_charges( const int quantity ) const
{
- for( const item *i : all_items_with_flag( flag_FIRESTARTER ) ) {
- if( !i->typeId()->can_have_charges() ) {
- const use_function *usef = i->type->get_use( "firestarter" );
+ item ret;
+ cache_has_item_with( flag_FIRESTARTER, [&]( const item & it ) {
+ if( !it.typeId()->can_have_charges() ) {
+ const use_function *usef = it.type->get_use( "firestarter" );
if( usef != nullptr && usef->get_actor_ptr() != nullptr ) {
const firestarter_actor *actor = dynamic_cast( usef->get_actor_ptr() );
- if( actor->can_use( *this->as_character(), *i, tripoint_zero ).success() ) {
- return *i;
+ if( actor->can_use( *this->as_character(), it, tripoint_zero ).success() ) {
+ ret = it;
+ return true;
}
}
- } else if( i->ammo_sufficient( this, quantity ) ) {
- return *i;
+ } else if( it.ammo_sufficient( this, quantity ) ) {
+ ret = it;
+ return true;
}
- }
-
- return item();
+ return false;
+ } );
+ return ret;
}
bool Character::has_fire( const int quantity ) const
@@ -9146,7 +9392,7 @@ bool Character::has_fire( const int quantity ) const
if( get_map().has_nearby_fire( pos() ) ) {
return true;
}
- if( has_item_with_flag( flag_FIRE ) ) {
+ if( cache_has_item_with( flag_FIRE ) ) {
return true;
}
if( !find_firestarter_with_charges( quantity ).is_null() ) {
@@ -9237,7 +9483,7 @@ void Character::use_fire( const int quantity )
if( get_map().has_nearby_fire( pos() ) ) {
return;
}
- if( has_item_with_flag( flag_FIRE ) ) {
+ if( cache_has_item_with( flag_FIRE ) ) {
return;
}
@@ -9320,9 +9566,18 @@ void Character::enchantment_wear_change()
void Character::on_item_acquire( const item &it )
{
- if( is_avatar() && it.has_item_with( []( const item & it ) {
- return it.has_flag( flag_ZOOM );
- } ) ) {
+ bool check_for_zoom = is_avatar();
+ bool update_overmap_seen = false;
+
+ it.visit_items( [this, &check_for_zoom, &update_overmap_seen]( item * cont_it, item * ) {
+ add_to_inv_search_caches( *cont_it );
+ if( check_for_zoom && !update_overmap_seen && cont_it->has_flag( flag_ZOOM ) ) {
+ update_overmap_seen = true;
+ }
+ return VisitResponse::NEXT;
+ } );
+
+ if( update_overmap_seen ) {
g->update_overmap_seen();
}
}
@@ -11483,27 +11738,6 @@ stat_mod Character::get_pain_penalty() const
return ret;
}
-std::list
- Character::get_radio_items()
-{
- std::list
- rc_items;
- const invslice &stacks = inv->slice();
- for( const auto &stack : stacks ) {
- item &stack_iter = stack->front();
- if( stack_iter.has_flag( flag_RADIO_ACTIVATION ) ) {
- rc_items.push_back( &stack_iter );
- }
- }
-
- worn.append_radio_items( rc_items );
-
- if( is_armed() ) {
- if( weapon.has_flag( flag_RADIO_ACTIVATION ) ) {
- rc_items.push_back( &weapon );
- }
- }
- return rc_items;
-}
-
int Character::get_lift_str() const
{
int str = get_arm_str();
@@ -11904,8 +12138,8 @@ void Character::process_items()
// Load all items that use the UPS and have their own battery to their minimal functional charge,
// The tool is not really useful if its charges are below charges_to_use
- const auto inv_use_ups = items_with( []( const item & itm ) {
- return itm.has_flag( flag_USE_UPS ) && itm.ammo_data();
+ std::vector
- inv_use_ups = cache_get_items_with( flag_USE_UPS, []( item & it ) {
+ return !!it.ammo_data();
} );
if( !inv_use_ups.empty() ) {
const units::energy available_charges = available_ups();
diff --git a/src/character.h b/src/character.h
index e9487b22ad7cc..e9f564a05f9f3 100644
--- a/src/character.h
+++ b/src/character.h
@@ -887,8 +887,6 @@ class Character : public Creature, public visitable
bool takeoff( item_location loc, std::list
- *res = nullptr );
bool takeoff( int pos );
- /** Returns list of rc items in player inventory. **/
- std::list
- get_radio_items();
/** Handles health fluctuations over time */
virtual void update_health();
/** Updates all "biology" by one turn. Should be called once every turn. */
@@ -1644,7 +1642,7 @@ class Character : public Creature, public visitable
/** Returns solar items connected to cable charger bionic */
std::vector
- get_cable_solar();
/** Returns vehicles connected to cable charger bionic */
- std::vector get_cable_vehicle();
+ std::vector get_cable_vehicle() const;
/**Get stat bonus from bionic*/
int get_mod_stat_from_bionic( const character_stat &Stat ) const;
@@ -1963,6 +1961,8 @@ class Character : public Creature, public visitable
*/
std::list
- remove_worn_items_with( const std::function &filter );
+ void clear_worn();
+
// returns a list of all item_location the character has, including items contained in other items.
// only for CONTAINER pocket type; does not look for magazines
std::vector all_items_loc();
@@ -2709,12 +2709,94 @@ class Character : public Creature, public visitable
void stop_hauling();
bool is_hauling() const;
- // Has a weapon, inventory item or worn item with flag
+ /**
+ * @brief Applies a lambda function on all items with the given flag and/or that pass the given boolean item function, using or creating caches from @ref inv_search_caches.
+ * @param type Only process on items of this item type.
+ * @param type_flag Only process on items whose type has this flag.
+ * @param key A string to use as the key in the cache. Should usually be the same name as filter_func.
+ * @param filter_func Only process on items that return true with this boolean item function. This is cached, so avoid using functions with varying results.
+ * @param do_func A lambda function to apply on all items that pass the filters.
+ */
+ void cache_visit_items_with( const itype_id &type,
+ const std::function &do_func );
+ void cache_visit_items_with( const flag_id &type_flag,
+ const std::function &do_func );
+ void cache_visit_items_with( const std::string &key, bool( item::*filter_func )() const,
+ const std::function &do_func );
+ void cache_visit_items_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &do_func );
+ void cache_visit_items_with( const itype_id &type,
+ const std::function &do_func ) const;
+ void cache_visit_items_with( const flag_id &type_flag,
+ const std::function &do_func ) const;
+ void cache_visit_items_with( const std::string &key, bool( item::*filter_func )() const,
+ const std::function &do_func ) const;
+ void cache_visit_items_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &do_func ) const;
+ /**
+ * @brief Returns true if the character has an item with given flag and/or that passes the given boolean item function, using or creating caches from @ref inv_search_caches.
+ * @brief If you want to iterate over the entire cache, `cache_visit_items_with` should be used instead, as it's more optimized for processing entire caches.
+ * @param type Look for items of this item type.
+ * @param type_flag Look for items whose type has this flag.
+ * @param key A string to use as the cache's key. Should usually be the same name as filter_func. Unneeded if checking only for a flag.
+ * @param filter_func Look for items that return true with this boolean item function.
+ * @param check_func An optional lambda function applied to items that pass the flag/bool function filters.
+ * If it returns true, abort iteration and make cache_has_item_with return true. These results are not cached, unlike filter_func.
+ * @return True if the character has an item that passes the criteria, including check_func if provided.
+ */
+ bool cache_has_item_with( const itype_id &type,
+ const std::function &check_func = return_true
- ) const;
+ bool cache_has_item_with( const flag_id &type_flag,
+ const std::function &check_func = return_true
- ) const;
+ bool cache_has_item_with( const std::string &key, bool( item::*filter_func )() const,
+ const std::function &check_func = return_true
- ) const;
+ bool cache_has_item_with( const std::string &key, const itype_id &type, const flag_id &type_flag,
+ bool( item::*filter_func )() const,
+ const std::function &check_func = return_true
- ) const;
+ /**
+ * @brief Find if the character has an item with a specific flag. Can also checks for charges, if needed.
+ */
bool has_item_with_flag( const flag_id &flag, bool need_charges = false ) const;
/**
- * All items that have the given flag (@ref item::has_flag).
- */
- std::vector all_items_with_flag( const flag_id &flag ) const;
+ * @brief Find if the character has an item whose type has a specific flag. Can also checks for charges, if needed. Uses or creates caches from @ref inv_search_caches.
+ */
+ bool cache_has_item_with_flag( const flag_id &type_flag, bool need_charges = false ) const;
+ /**
+ * @brief Returns all items with the given flag and/or that pass the given boolean item function, using or creating caches from @ref inv_search_caches.
+ * @param type Only get items of this item type.
+ * @param type_flag Only get items whose type has this flag.
+ * @param key A string to use as the cache's key. Should usually be the same name as filter_func. Unneeded if checking only for a flag.
+ * @param filter_func Only get items that return true with this boolean item function.
+ * @param do_and_check_func An optional lambda function applied to items that pass the flag/bool function filters.
+ * If it returns true, the item is added to the return vector. These results are not cached, unlike filter_func.
+ * @return A vector of pointers to all items that pass the criteria.
+ */
+ std::vector
- cache_get_items_with( const itype_id &type,
+ const std::function &do_and_check_func = return_true
- );
+ std::vector
- cache_get_items_with( const flag_id &type_flag,
+ const std::function &do_and_check_func = return_true
- );
+ std::vector
- cache_get_items_with( const std::string &key,
+ bool( item::*filter_func )() const,
+ const std::function &do_and_check_func = return_true
- );
+ std::vector
- cache_get_items_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &do_and_check_func = return_true
- );
+ std::vector cache_get_items_with( const itype_id &type,
+ const std::function &check_func = return_true
- ) const;
+ std::vector cache_get_items_with( const flag_id &type_flag,
+ const std::function &check_func = return_true
- ) const;
+ std::vector cache_get_items_with( const std::string &key,
+ bool( item::*filter_func )() const,
+ const std::function &check_func = return_true
- ) const;
+ std::vector cache_get_items_with( const std::string &key, const itype_id &type,
+ const flag_id &type_flag, bool( item::*filter_func )() const,
+ const std::function &check_func = return_true
- ) const;
+ /**
+ * Add an item to existing @ref inv_search_caches that it meets the criteria for. Will NOT create any new caches.
+ */
+ void add_to_inv_search_caches( item &it ) const;
bool has_charges( const itype_id &it, int quantity,
const std::function &filter = return_true
- ) const override;
@@ -2895,6 +2977,9 @@ class Character : public Creature, public visitable
/** Returns true if a gun misfires, jams, or has other problems, else returns false */
bool handle_gun_damage( item &it );
+ /**Handles overheat mechanics for guns, returns true if the gun cant fire due to overheat effects*/
+ bool handle_gun_overheat( item &it );
+
/** Get maximum recoil penalty due to vehicle motion */
double recoil_vehicle() const;
@@ -3848,6 +3933,15 @@ class Character : public Creature, public visitable
mutable bool pseudo_items_valid = false;
mutable std::vector pseudo_items;
+
+ /** Cached results for functions that search through the inventory, like @ref cache_visit_items_with */
+ struct inv_search_cache {
+ itype_id type;
+ flag_id type_flag;
+ bool ( item::*filter_func )() const;
+ std::list> items;
+ };
+ mutable std::unordered_map inv_search_caches;
protected:
// Bionic IDs are unique only within a character. Used to unambiguously identify bionics in a character
bionic_uid weapon_bionic_uid = 0;
diff --git a/src/character_attire.cpp b/src/character_attire.cpp
index 82d734e612384..01c7c65965555 100644
--- a/src/character_attire.cpp
+++ b/src/character_attire.cpp
@@ -1481,9 +1481,9 @@ bool outfit::takeoff( item_location loc, std::list
- *res, Character &guy )
return &it == &wit;
} );
+ it.on_takeoff( guy );
item takeoff_copy( it );
worn.erase( iter );
- takeoff_copy.on_takeoff( guy );
if( res == nullptr ) {
guy.i_add( takeoff_copy, true, &it, &it, true, !guy.has_weapon() );
} else {
@@ -1501,11 +1501,6 @@ void outfit::damage_mitigate( const bodypart_id &bp, damage_unit &dam ) const
}
}
-void outfit::clear()
-{
- worn.clear();
-}
-
bool outfit::empty() const
{
return worn.empty();
@@ -1747,15 +1742,6 @@ std::list
- outfit::use_amount( const itype_id &it, int quantity,
return used;
}
-void outfit::append_radio_items( std::list
- &rc_items )
-{
- for( item &elem : worn ) {
- if( elem.has_flag( flag_RADIO_ACTIVATION ) ) {
- rc_items.push_back( &elem );
- }
- }
-}
-
void outfit::add_dependent_item( std::list
- &dependent, const item &it )
{
// Adds dependent worn items recursively
@@ -2026,8 +2012,9 @@ void outfit::fire_options( Character &guy, std::vector &options,
{
for( item &clothing : worn ) {
- std::vector
- guns = clothing.items_with( []( const item & it ) {
- return it.is_gun();
+ std::vector
- guns = guy.cache_get_items_with( "is_gun", &item::is_gun,
+ [&guy]( const item & it ) {
+ return !guy.is_wielding( it );
} );
if( !guns.empty() && clothing.type->can_use( "holster" ) ) {
diff --git a/src/character_attire.h b/src/character_attire.h
index 5391cc91db2ae..9ff50acc3ce67 100644
--- a/src/character_attire.h
+++ b/src/character_attire.h
@@ -59,6 +59,7 @@ struct dispose_option {
class outfit
{
+ friend class Character;
private:
std::list
- worn;
public:
@@ -173,7 +174,6 @@ class outfit
std::unordered_set where_discomfort( const Character &guy ) const;
// used in game::wield
void insert_item_at_index( const item &clothing, int index );
- void append_radio_items( std::list
- &rc_items );
void check_and_recover_morale( player_morale &test_morale ) const;
void absorb_damage( Character &guy, damage_unit &elem, bodypart_id bp,
std::list
- &worn_remains, bool &armor_destroyed );
@@ -217,7 +217,6 @@ class outfit
void activate_combat_items( npc &guy );
void deactivate_combat_items( npc &guy );
- void clear();
bool empty() const;
item &front();
size_t size() const;
diff --git a/src/character_guns.cpp b/src/character_guns.cpp
index e14acb7716231..958c35a0bbc87 100644
--- a/src/character_guns.cpp
+++ b/src/character_guns.cpp
@@ -80,7 +80,7 @@ void find_ammo_helper( T &src, const item &obj, bool empty, Output out, bool nes
std::vector Character::get_ammo( const ammotype &at ) const
{
- return items_with( [at]( const item & it ) {
+ return cache_get_items_with( "is_ammo", &item::is_ammo, [at]( const item & it ) {
return it.ammo_type() == at;
} );
}
@@ -270,20 +270,22 @@ bool Character::gunmod_remove( item &gun, item &mod )
bool Character::has_gun_for_ammo( const ammotype &at ) const
{
- return has_item_with( [at]( const item & it ) {
- // item::ammo_type considers the active gunmod.
- return it.is_gun() && it.ammo_types().count( at );
+ return cache_has_item_with( "is_gun", &item::is_gun, [&at]( const item & it ) {
+ return it.ammo_types().count( at );
} );
}
bool Character::has_magazine_for_ammo( const ammotype &at ) const
{
- return has_item_with( [&at]( const item & it ) {
+ if( cache_has_item_with( "is_magazine", &item::is_magazine, [&at]( const item & it ) {
+ return !it.has_flag( flag_NO_RELOAD ) && it.ammo_types().count( at );
+ } ) ) {
+ return true;
+ }
+ return cache_has_item_with( "is_gun", &item::is_gun, [&at]( const item & it ) {
return !it.has_flag( flag_NO_RELOAD ) &&
- ( ( it.is_magazine() && it.ammo_types().count( at ) ) ||
- ( it.is_gun() && it.magazine_integral() && it.ammo_types().count( at ) ) ||
- ( it.is_gun() && it.magazine_current() != nullptr &&
- it.magazine_current()->ammo_types().count( at ) ) );
+ ( ( it.magazine_integral() && it.ammo_types().count( at ) ) ||
+ ( it.magazine_current() != nullptr && it.magazine_current()->ammo_types().count( at ) ) );
} );
}
diff --git a/src/character_inventory.cpp b/src/character_inventory.cpp
index 4d46201a94698..6e8ce3d70dc9f 100644
--- a/src/character_inventory.cpp
+++ b/src/character_inventory.cpp
@@ -246,23 +246,25 @@ item_location Character::try_add( item it, int &copies_remaining, const item *av
max_copies = copies_remaining;
}
- item *newit = nullptr;
- pocket.second->add( it, max_copies, &newit );
+ std::vector
- newits;
+ pocket.second->add( it, max_copies, newits );
// Give invlet to the first item created.
if( !first_item_added ) {
- first_item_added = item_location( pocket.first, newit );
+ first_item_added = item_location( pocket.first, newits.front() );
if( invlet ) {
first_item_added->invlet = invlet;
}
}
- if( !invlet && ( !it.count_by_charges() || it.charges == newit->charges ) ) {
- inv->update_invlet( *newit, true, original_inventory_item );
+ if( !invlet ) {
+ inv->update_invlet( *newits.front(), true, original_inventory_item );
}
copies_remaining -= max_copies;
- newit->on_pickup( *this );
+ for( item *it : newits ) {
+ it->on_pickup( *this );
+ }
pocket.first.on_contents_changed();
pocket.second->on_contents_changed();
}
@@ -307,6 +309,12 @@ item_location Character::i_add( item it, int &copies_remaining,
const item *original_inventory_item, const bool allow_drop,
const bool allow_wield, bool ignore_pkt_settings )
{
+ if( it.count_by_charges() ) {
+ it.charges = copies_remaining;
+ copies_remaining = 0;
+ return i_add( it, true, avoid, original_inventory_item,
+ allow_drop, allow_wield, ignore_pkt_settings );
+ }
invalidate_inventory_validity_cache();
invalidate_leak_level_cache();
item_location added = try_add( it, copies_remaining, avoid, original_inventory_item, allow_wield,
diff --git a/src/clzones.cpp b/src/clzones.cpp
index 5c876b40783e3..26b8c87553d75 100644
--- a/src/clzones.cpp
+++ b/src/clzones.cpp
@@ -303,10 +303,7 @@ unload_options::query_unload_result unload_options::query_unload()
plot_options::query_seed_result plot_options::query_seed()
{
Character &player_character = get_player_character();
-
- std::vector
- seed_inv = player_character.items_with( []( const item & itm ) {
- return itm.is_seed();
- } );
+ std::vector
- seed_inv = player_character.cache_get_items_with( "is_seed", &item::is_seed );
zone_manager &mgr = zone_manager::get_manager();
map &here = get_map();
const std::unordered_set zone_src_set =
diff --git a/src/construction.cpp b/src/construction.cpp
index 2378071b1a6a8..693ce6d3c68d3 100644
--- a/src/construction.cpp
+++ b/src/construction.cpp
@@ -1036,6 +1036,8 @@ void place_construction( std::vector const &groups )
for( const auto &it : con.requirements->get_tools() ) {
player_character.consume_tools( it );
}
+ player_character.invalidate_crafting_inventory();
+ player_character.invalidate_weight_carried_cache();
player_character.assign_activity( ACT_BUILD );
player_character.activity.placement = here.getglobal( pnt );
}
diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp
index e4d7c9d0da57c..7d9113c0c77e3 100644
--- a/src/debug_menu.cpp
+++ b/src/debug_menu.cpp
@@ -1923,7 +1923,7 @@ static void character_edit_menu()
break;
}
you.worn.on_takeoff( you );
- you.worn.clear();
+ you.clear_worn();
you.inv->clear();
you.remove_weapon();
break;
diff --git a/src/display.cpp b/src/display.cpp
index 445187daccd63..4e3067f1b1f6d 100644
--- a/src/display.cpp
+++ b/src/display.cpp
@@ -112,7 +112,7 @@ vehicle *display::vehicle_driven( const Character &u )
std::string display::get_temp( const Character &u )
{
std::string temp;
- if( u.has_item_with_flag( json_flag_THERMOMETER ) ||
+ if( u.cache_has_item_with( json_flag_THERMOMETER ) ||
u.has_flag( STATIC( json_character_flag( "THERMOMETER" ) ) ) ) {
temp = print_temperature( get_weather().get_temperature( u.pos() ) );
}
diff --git a/src/faction.cpp b/src/faction.cpp
index 53558619ad1f9..e3f9b16bae389 100644
--- a/src/faction.cpp
+++ b/src/faction.cpp
@@ -623,8 +623,8 @@ int npc::faction_display( const catacurses::window &fac_w, const int width ) con
std::string can_see;
nc_color see_color;
- bool u_has_radio = player_character.has_item_with_flag( json_flag_TWO_WAY_RADIO, true );
- bool guy_has_radio = has_item_with_flag( json_flag_TWO_WAY_RADIO, true );
+ bool u_has_radio = player_character.cache_has_item_with_flag( json_flag_TWO_WAY_RADIO, true );
+ bool guy_has_radio = cache_has_item_with_flag( json_flag_TWO_WAY_RADIO, true );
// is the NPC even in the same area as the player?
if( rl_dist( player_abspos, global_omt_location() ) > 3 ||
( rl_dist( player_character.pos(), pos() ) > SEEX * 2 || !player_character.sees( pos() ) ) ) {
diff --git a/src/game.cpp b/src/game.cpp
index 5182b23f697ef..6bd104ece458c 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -2398,14 +2398,7 @@ tripoint game::mouse_edge_scrolling_overmap( input_context &ctxt )
return ret.first;
}
-static input_context default_mode_input_context = create_default_mode_input_context();
-
-input_context &get_default_mode_input_context()
-{
- return default_mode_input_context;
-}
-
-input_context create_default_mode_input_context()
+input_context get_default_mode_input_context()
{
input_context ctxt( "DEFAULTMODE", keyboard_mode::keycode );
// Because those keys move the character, they don't pan, as their original name says
@@ -11428,7 +11421,7 @@ void game::water_affect_items( Character &ch ) const
&& !loc.protected_from_liquids() ) {
wet.emplace_back( loc );
} else if( loc->typeId() == itype_towel && !loc.protected_from_liquids() ) {
- loc->convert( itype_towel_wet ).active = true;
+ loc->convert( itype_towel_wet, &ch ).active = true;
}
}
diff --git a/src/game.h b/src/game.h
index 6cd3cff6f1370..014c5a155b51c 100644
--- a/src/game.h
+++ b/src/game.h
@@ -57,8 +57,7 @@ extern int savegame_loading_version;
class input_context;
-input_context create_default_mode_input_context();
-input_context &get_default_mode_input_context();
+input_context get_default_mode_input_context();
enum quit_status {
QUIT_NO = 0, // Still playing
diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp
index a12ec3dd22bc2..d2bb7293f98fc 100644
--- a/src/game_inventory.cpp
+++ b/src/game_inventory.cpp
@@ -880,7 +880,7 @@ static std::string get_consume_needs_hint( Character &you )
int kcal_spent_today = you.as_avatar()->get_daily_spent_kcal( false );
int kcal_spent_yesterday = you.as_avatar()->get_daily_spent_kcal( true );
bool has_fitness_band = you.is_wearing( itype_fitness_band ) || you.has_bionic( bio_fitnessband );
- bool has_tracker = has_fitness_band || you.has_item_with_flag( json_flag_CALORIES_INTAKE );
+ bool has_tracker = has_fitness_band || you.cache_has_item_with( json_flag_CALORIES_INTAKE );
std::string kcal_estimated_intake;
if( kcal_ingested_today == 0 ) {
diff --git a/src/handle_action.cpp b/src/handle_action.cpp
index 26a1407db1ddc..61f2d8610cdce 100644
--- a/src/handle_action.cpp
+++ b/src/handle_action.cpp
@@ -1283,7 +1283,7 @@ static void loot()
Character &player_character = get_player_character();
int flags = 0;
zone_manager &mgr = zone_manager::get_manager();
- const bool has_fertilizer = player_character.has_item_with_flag( flag_FERTILIZER );
+ const bool has_fertilizer = player_character.cache_has_item_with( flag_FERTILIZER );
// reset any potentially disabled zones from a past activity
mgr.reset_disabled();
diff --git a/src/iexamine.cpp b/src/iexamine.cpp
index fb4c984cf3f61..88d8471467385 100644
--- a/src/iexamine.cpp
+++ b/src/iexamine.cpp
@@ -722,7 +722,7 @@ class atm_menu
_( "You need a charged cash card before you can deposit money!" ) );
}
- if( card_count >= 1 && you.has_item_with_flag( flag_OLD_CURRENCY ) ) {
+ if( card_count >= 1 && you.cache_has_item_with( flag_OLD_CURRENCY ) ) {
add_choice( exchange_cash, _( "Exchange Cash for eCash (1%% fee)" ) );
}
@@ -805,9 +805,8 @@ class atm_menu
//!Move money from bank account onto cash card.
bool do_withdraw_money() {
- std::vector
- cash_cards_on_hand = you.items_with( []( const item & i ) {
- return i.typeId() == itype_cash_card;
- } );
+ std::vector
- cash_cards_on_hand = you.cache_get_items_with( "is_cash_card",
+ &item::is_cash_card );
if( cash_cards_on_hand.empty() ) {
//Just in case we run into an edge case
popup( _( "You do not have a cash card to withdraw money!" ) );
@@ -866,9 +865,8 @@ class atm_menu
return false;
}
} else {
- const std::vector
- cash_cards = you.items_with( []( const item & i ) {
- return i.typeId() == itype_cash_card;
- } );
+ const std::vector
- cash_cards = you.cache_get_items_with( "is_cash_card",
+ &item::is_cash_card );
if( cash_cards.empty() ) {
popup( _( "You do not have a cash card." ) );
return false;
@@ -915,9 +913,8 @@ class atm_menu
//!Move the money from all the cash cards in inventory to a single card.
bool do_transfer_all_money() {
item *dst;
- std::vector
- cash_cards_on_hand = you.items_with( []( const item & i ) {
- return i.typeId() == itype_cash_card;
- } );
+ std::vector
- cash_cards_on_hand = you.cache_get_items_with( "is_cash_card",
+ &item::is_cash_card );
if( you.activity.id() == ACT_ATM ) {
dst = you.activity.targets.front().get_item();
you.activity.set_to_null(); // stop for now, if required, it will be created again.
@@ -930,7 +927,7 @@ class atm_menu
if( cash_cards_on_hand.empty() ) {
return false;
}
- dst = cash_cards_on_hand.front();
+ dst = *cash_cards_on_hand.begin();
}
for( item *i : cash_cards_on_hand ) {
@@ -1754,7 +1751,7 @@ void iexamine::safe( Character &you, const tripoint &examp )
{
bool has_cracking_tool = you.has_flag( json_flag_SUPER_HEARING );
// short-circuit to avoid the more expensive iteration over items
- has_cracking_tool = has_cracking_tool || you.has_item_with_flag( flag_SAFECRACK );
+ has_cracking_tool = has_cracking_tool || you.cache_has_item_with( flag_SAFECRACK );
if( !has_cracking_tool ) {
you.moves -= to_moves( 10_seconds );
@@ -2526,9 +2523,7 @@ void iexamine::dirtmound( Character &you, const tripoint &examp )
add_msg(m_info, _("It is too dark to plant anything now."));
return;
}*/
- std::vector
- seed_inv = you.items_with( []( const item & itm ) {
- return itm.is_seed();
- } );
+ std::vector
- seed_inv = you.cache_get_items_with( "is_seed", &item::is_seed );
if( seed_inv.empty() ) {
add_msg( m_info, _( "You have no seeds to plant." ) );
return;
@@ -2768,7 +2763,7 @@ void iexamine::fertilize_plant( Character &you, const tripoint &tile,
itype_id iexamine::choose_fertilizer( Character &you, const std::string &pname,
bool ask_player )
{
- std::vector f_inv = you.all_items_with_flag( flag_FERTILIZER );
+ std::vector
- f_inv = you.cache_get_items_with( flag_FERTILIZER );
if( f_inv.empty() ) {
add_msg( m_info, _( "You have no fertilizer for the %s." ), pname );
return itype_id();
@@ -2776,7 +2771,7 @@ itype_id iexamine::choose_fertilizer( Character &you, const std::string &pname,
std::vector f_types;
std::vector f_names;
- for( const item *&f : f_inv ) {
+ for( const item * const &f : f_inv ) {
if( std::find( f_types.begin(), f_types.end(), f->typeId() ) == f_types.end() ) {
f_types.push_back( f->typeId() );
f_names.push_back( f->tname() );
@@ -3508,9 +3503,7 @@ void iexamine::fvat_empty( Character &you, const tripoint &examp )
if( !brew_present ) {
add_msg( _( "This keg is empty." ) );
// TODO: Allow using brews from crafting inventory
- const auto b_inv = you.items_with( []( const item & it ) {
- return it.is_brewable();
- } );
+ const auto b_inv = you.cache_get_items_with( "is_brewable", &item::is_brewable );
if( b_inv.empty() ) {
add_msg( m_info, _( "You have no brew to ferment." ) );
return;
@@ -4694,9 +4687,9 @@ static int findBestGasDiscount( Character &you )
{
int discount = 0;
- for( const item *it : you.all_items_with_flag( flag_GAS_DISCOUNT ) ) {
- discount = std::max( discount, getGasDiscountCardQuality( *it ) );
- }
+ you.cache_visit_items_with( flag_GAS_DISCOUNT, [&discount]( const item & it ) {
+ discount = std::max( discount, getGasDiscountCardQuality( it ) );
+ } );
return discount;
}
@@ -4993,9 +4986,7 @@ void iexamine::pay_gas( Character &you, const tripoint &examp )
}
if( refund == choice ) {
- std::vector
- cash_cards = you.items_with( []( const item & i ) {
- return i.typeId() == itype_cash_card;
- } );
+ std::vector
- cash_cards = you.cache_get_items_with( "is_cash_card", &item::is_cash_card );
if( cash_cards.empty() ) {
popup( _( "You do not have a cash card to refund money!" ) );
return;
diff --git a/src/iexamine.h b/src/iexamine.h
index d3fcd32583e47..fb88e2af56c19 100644
--- a/src/iexamine.h
+++ b/src/iexamine.h
@@ -6,6 +6,7 @@
#include
#include
#include
+#include
#include
#include
diff --git a/src/item.cpp b/src/item.cpp
index efebb660d9572..8a12530d81d7b 100644
--- a/src/item.cpp
+++ b/src/item.cpp
@@ -138,6 +138,8 @@ static const efftype_id effect_shakes( "shakes" );
static const efftype_id effect_sleep( "sleep" );
static const efftype_id effect_weed_high( "weed_high" );
+static const fault_id fault_overheat_safety( "fault_overheat_safety" );
+
static const furn_str_id furn_f_metal_smoking_rack_active( "f_metal_smoking_rack_active" );
static const furn_str_id furn_f_smoking_rack_active( "f_smoking_rack_active" );
static const furn_str_id furn_f_water_mill_active( "f_water_mill_active" );
@@ -158,6 +160,7 @@ static const itype_id itype_battery( "battery" );
static const itype_id itype_blood( "blood" );
static const itype_id itype_brass_catcher( "brass_catcher" );
static const itype_id itype_bullet_crossbow( "bullet_crossbow" );
+static const itype_id itype_cash_card( "cash_card" );
static const itype_id itype_cig_butt( "cig_butt" );
static const itype_id itype_cig_lit( "cig_lit" );
static const itype_id itype_cigar_butt( "cigar_butt" );
@@ -611,7 +614,7 @@ item item::make_corpse( const mtype_id &mt, time_point turn, const std::string &
return result;
}
-item &item::convert( const itype_id &new_type )
+item &item::convert( const itype_id &new_type, Character *carrier )
{
// Carry over relative rot similar to crafting
const double rel_rot = get_relative_rot();
@@ -633,6 +636,9 @@ item &item::convert( const itype_id &new_type )
countdown_point = calendar::turn + type->countdown_interval;
active = true;
}
+ if( carrier ) {
+ carrier->on_item_acquire( *this );
+ }
return *this;
}
@@ -1453,6 +1459,9 @@ bool item::stacks_with( const item &rhs, bool check_components, bool combine_liq
if( techniques != rhs.techniques ) {
return false;
}
+ if( overheat_symbol() != rhs.overheat_symbol() ) {
+ return false;
+ }
// Guns with enough fouling to change the indicator symbol don't stack
if( dirt_symbol() != rhs.dirt_symbol() ) {
return false;
@@ -6111,13 +6120,20 @@ nc_color item::color_in_inventory( const Character *const ch ) const
// Likewise, ammo is green if you have guns that use it
// ltred if you have the gun but no mags
// Gun with integrated mag counts as both
- bool has_gun = player_character.has_item_with( [this]( const item & i ) {
- return i.is_gun() && i.ammo_types().count( ammo_type() );
+ bool has_gun = player_character.cache_has_item_with( "is_gun", &item::is_gun,
+ [this]( const item & i ) {
+ return i.ammo_types().count( ammo_type() );
+ } );
+ bool has_mag = player_character.cache_has_item_with( "is_gun", &item::is_gun,
+ [this]( const item & i ) {
+ return i.magazine_integral() && i.ammo_types().count( ammo_type() );
} );
- bool has_mag = player_character.has_item_with( [this]( const item & i ) {
- return ( i.is_gun() && i.magazine_integral() && i.ammo_types().count( ammo_type() ) ) ||
- ( i.is_magazine() && i.ammo_types().count( ammo_type() ) );
+ has_mag = has_mag ? true :
+ player_character.cache_has_item_with( "is_magazine", &item::is_magazine,
+ [this]( const item & i ) {
+ return i.ammo_types().count( ammo_type() );
} );
+
if( has_gun && has_mag ) {
ret = c_green;
} else if( has_gun || has_mag ) {
@@ -6126,8 +6142,9 @@ nc_color item::color_in_inventory( const Character *const ch ) const
} else if( is_magazine() ) {
// Magazines are green if you have guns and ammo for them
// ltred if you have one but not the other
- bool has_gun = player_character.has_item_with( [this]( const item & it ) {
- return it.is_gun() && it.magazine_compatible().count( typeId() ) > 0;
+ bool has_gun = player_character.cache_has_item_with( "is_gun", &item::is_gun,
+ [this]( const item & it ) {
+ return it.magazine_compatible().count( typeId() ) > 0;
} );
bool has_ammo = !player_character.find_ammo( *this, false, -1 ).empty();
if( has_gun && has_ammo ) {
@@ -6397,6 +6414,32 @@ std::string item::dirt_symbol() const
}
}
+std::string item::overheat_symbol() const
+{
+
+ if( !is_gun() || type->gun->overheat_threshold <= 0.0 ) {
+ return "";
+ }
+ if( faults.count( fault_overheat_safety ) ) {
+ return string_format( _( "\u2588VNT " ) );
+ }
+ switch( std::min( 5, static_cast( get_var( "gun_heat",
+ 0 ) / ( type->gun->overheat_threshold ) * 5.0 ) ) ) {
+ case 1:
+ return "";
+ case 2:
+ return string_format( _( "\u2583HEAT " ) );
+ case 3:
+ return string_format( _( "\u2585HEAT " ) );
+ case 4:
+ return string_format( _( "\u2587HEAT! " ) ); // NOLINT(cata-text-style)
+ case 5:
+ return string_format( _( "\u2588HEAT!! " ) ); // NOLINT(cata-text-style)
+ default:
+ return "";
+ }
+}
+
std::string item::degradation_symbol() const
{
const int inc = max_damage() / 5;
@@ -6438,6 +6481,7 @@ std::string item::tname( unsigned int quantity, bool with_prefix, unsigned int t
}
}
damtext += dirt_symbol();
+ damtext += overheat_symbol();
if( get_option( "ASTERISK_POSITION" ) == "prefix" && with_prefix ) {
if( is_favorite ) {
@@ -8427,6 +8471,11 @@ bool item::is_money() const
return ammo_types().count( ammo_money );
}
+bool item::is_cash_card() const
+{
+ return typeId() == itype_cash_card;
+}
+
bool item::is_software() const
{
if( const std::optional &cont = type->default_container ) {
@@ -12323,7 +12372,7 @@ int item::processing_speed() const
if( active || ethereal || wetness || link ||
has_flag( flag_RADIO_ACTIVATION ) || has_relic_recharge() ||
- has_fault_flag( flag_BLACKPOWDER_FOULING_DAMAGE ) ) {
+ has_fault_flag( flag_BLACKPOWDER_FOULING_DAMAGE ) || get_var( "gun_heat", 0 ) > 0 ) {
// Unless otherwise indicated, update every turn.
return 1;
}
@@ -12847,11 +12896,11 @@ bool item::process_litcig( map &here, Character *carrier, const tripoint &pos )
carrier->add_msg_if_player( m_neutral, _( "You finish your %s." ), tname() );
}
if( typeId() == itype_cig_lit ) {
- convert( itype_cig_butt );
+ convert( itype_cig_butt, carrier );
} else if( typeId() == itype_cigar_lit ) {
- convert( itype_cigar_butt );
+ convert( itype_cigar_butt, carrier );
} else { // joint
- convert( itype_joint_roach );
+ convert( itype_joint_roach, carrier );
if( carrier != nullptr ) {
carrier->add_effect( effect_weed_high, 1_minutes ); // one last puff
here.add_field( pos + point( rng( -1, 1 ), rng( -1, 1 ) ), field_type_id( "fd_weedsmoke" ), 2 );
@@ -12973,15 +13022,15 @@ bool item::process_extinguish( map &here, Character *carrier, const tripoint &po
// cig dies out
if( has_flag( flag_LITCIG ) ) {
if( typeId() == itype_cig_lit ) {
- convert( itype_cig_butt );
+ convert( itype_cig_butt, carrier );
} else if( typeId() == itype_cigar_lit ) {
- convert( itype_cigar_butt );
+ convert( itype_cigar_butt, carrier );
} else { // joint
- convert( itype_joint_roach );
+ convert( itype_joint_roach, carrier );
}
} else { // transform (lit) items
if( type->revert_to ) {
- convert( *type->revert_to );
+ convert( *type->revert_to, carrier );
} else {
type->invoke( carrier, *this, pos, "transform" );
}
@@ -12992,9 +13041,14 @@ bool item::process_extinguish( map &here, Character *carrier, const tripoint &po
return false;
}
+bool item::can_link_up() const
+{
+ return !!link || type->can_use( "link_up" );
+}
+
void item::set_link_traits( const bool assign_t_state )
{
- if( !link || !type->can_use( "link_up" ) ) {
+ if( !can_link_up() ) {
return;
}
@@ -13006,7 +13060,7 @@ void item::set_link_traits( const bool assign_t_state )
link->s_bub_pos = tripoint_min;
for( const item *cable : cables() ) {
- if( !cable->type->can_use( "link_up" ) ) {
+ if( !cable->can_link_up() ) {
continue;
}
const link_up_actor *actor = static_cast
@@ -13076,10 +13130,10 @@ bool item::process_link( map &here, Character *carrier, const tripoint &pos )
}
}
const item_filter used_ups = [&]( const item & itm ) {
- return itm.has_flag( flag_IS_UPS ) && itm.get_var( "cable" ) == "plugged_in";
+ return itm.get_var( "cable" ) == "plugged_in";
};
if( link->s_state == link_state::ups ) {
- if( carrier == nullptr || !carrier->has_item_with( used_ups ) ) {
+ if( carrier == nullptr || !carrier->cache_has_item_with( flag_IS_UPS, used_ups ) ) {
add_msg_if_player_sees( pos, m_bad,
string_format( is_cable_item ? _( "The %s has come loose from the UPS." ) :
_( "The %s's cable has come loose from the UPS." ), type_name() ) );
@@ -13395,7 +13449,8 @@ bool item::process_linked_item( Character *carrier, const tripoint & /*pos*/,
active = false;
return false;
}
- bool has_connected_cable = carrier->has_item_with( [&required_state]( const item & it ) {
+ bool has_connected_cable = carrier->cache_has_item_with( "can_link_up", &item::can_link_up,
+ [&required_state]( const item & it ) {
return it.link && it.link->has_state( required_state );
} );
if( !has_connected_cable ) {
@@ -13405,11 +13460,11 @@ bool item::process_linked_item( Character *carrier, const tripoint & /*pos*/,
return false;
}
-bool item::process_wet( Character * /*carrier*/, const tripoint & /*pos*/ )
+bool item::process_wet( Character *carrier, const tripoint & /*pos*/ )
{
if( item_counter == 0 ) {
if( type->revert_to ) {
- convert( *type->revert_to );
+ convert( *type->revert_to, carrier );
}
unset_flag( flag_WET );
active = false;
@@ -13479,6 +13534,32 @@ bool item::process_blackpowder_fouling( Character *carrier )
return false;
}
+bool item::process_gun_cooling( Character *carrier )
+{
+ double heat = get_var( "gun_heat", 0 );
+ double threshold = type->gun->overheat_threshold;
+ heat -= type->gun->cooling_value;
+ set_var( "gun_heat", std::max( 0.0, heat ) );
+ if( faults.count( fault_overheat_safety ) && heat < threshold * 0.2 ) {
+ faults.erase( fault_overheat_safety );
+ if( carrier ) {
+ carrier->add_msg_if_player( m_good, _( "Your %s beeps as its cooling cycle concludes." ), tname() );
+ }
+ }
+ if( carrier ) {
+ if( heat > threshold ) {
+ carrier->add_msg_if_player( m_bad,
+ _( "You can feel the struggling systems of your %s beneath the blare of the overheat alarm." ),
+ tname() );
+ } else if( heat > threshold * 0.8 ) {
+ carrier->add_msg_if_player( m_bad, _( "Your %s frantically sounds an overheat alarm." ), tname() );
+ } else if( heat > threshold * 0.6 ) {
+ carrier->add_msg_if_player( m_warning, _( "Your %s sounds a heat warning chime!" ), tname() );
+ }
+ }
+ return false;
+}
+
bool item::process( map &here, Character *carrier, const tripoint &pos, float insulation,
temperature_flag flag, float spoil_multiplier_parent, bool recursive )
{
@@ -13563,7 +13644,7 @@ bool item::process_internal( map &here, Character *carrier, const tripoint &pos,
}
countdown_point = calendar::turn_max;
if( type->revert_to ) {
- convert( *type->revert_to );
+ convert( *type->revert_to, carrier );
active = needs_processing();
} else {
@@ -13641,6 +13722,9 @@ bool item::process_internal( map &here, Character *carrier, const tripoint &pos,
if( has_fault_flag( flag_BLACKPOWDER_FOULING_DAMAGE ) ) {
return process_blackpowder_fouling( carrier );
}
+ if( get_var( "gun_heat", 0 ) > 0 ) {
+ return process_gun_cooling( carrier );
+ }
}
return false;
@@ -14541,6 +14625,11 @@ item *item::get_item_with( const std::function &filter )
return contents.get_item_with( filter );
}
+const item *item::get_item_with( const std::function &filter ) const
+{
+ return contents.get_item_with( filter );
+}
+
size_t item::num_item_stacks() const
{
return contents.num_item_stacks();
diff --git a/src/item.h b/src/item.h
index d683885bf7de7..d0579b4c71fdd 100644
--- a/src/item.h
+++ b/src/item.h
@@ -234,9 +234,10 @@ class item : public visitable
/**
* Filter converting this instance to another type preserving all other aspects
* @param new_type the type id to convert to
+ * @param carrier A pointer to the character that's carrying the item, nullptr if none, which is the default.
* @return same instance to allow method chaining
*/
- item &convert( const itype_id &new_type );
+ item &convert( const itype_id &new_type, Character *carrier = nullptr );
/**
* Filter converting this instance to the inactive type
@@ -351,6 +352,7 @@ class item : public visitable
bool ready_to_revive( map &here, const tripoint &pos ) const;
bool is_money() const;
+ bool is_cash_card() const;
bool is_software() const;
bool is_software_storage() const;
@@ -372,6 +374,11 @@ class item : public visitable
*/
std::string dirt_symbol() const;
+ /**
+ * Returns a symbol for indicating the overheat level for a gun.
+ */
+ std::string overheat_symbol() const;
+
/**
* Returns a symbol indicating the current degradation of the item.
*/
@@ -1458,6 +1465,11 @@ class item : public visitable
void serialize( JsonOut &jsout ) const;
void deserialize( const JsonObject &data );
};
+ /**
+ * @brief Returns true if the item is/has a cable that can link up to other things.
+ */
+ bool can_link_up() const;
+
/**
* @brief Sets max_length and efficiency of a link, taking cable extensions into account.
* @brief max_length is set to the sum of all cable lengths.
@@ -2861,6 +2873,7 @@ class item : public visitable
item &only_item();
const item &only_item() const;
item *get_item_with( const std::function &filter );
+ const item *get_item_with( const std::function &filter ) const;
/**
* returns the number of items stacks in contents
@@ -2954,6 +2967,7 @@ class item : public visitable
bool process_link( map &here, Character *carrier, const tripoint &pos );
bool process_linked_item( Character *carrier, const tripoint &pos, link_state required_state );
bool process_blackpowder_fouling( Character *carrier );
+ bool process_gun_cooling( Character *carrier );
bool process_tool( Character *carrier, const tripoint &pos );
public:
diff --git a/src/item_contents.cpp b/src/item_contents.cpp
index e524447895185..289c9461be219 100644
--- a/src/item_contents.cpp
+++ b/src/item_contents.cpp
@@ -1589,6 +1589,21 @@ item *item_contents::get_item_with( const std::function
return nullptr;
}
+const item *item_contents::get_item_with( const std::function &filter )
+const
+{
+ for( const item_pocket &pocket : contents ) {
+ if( pocket.is_type( item_pocket::pocket_type::CABLE ) ) {
+ continue;
+ }
+ const item *it = pocket.get_item_with( filter );
+ if( it != nullptr ) {
+ return it;
+ }
+ }
+ return nullptr;
+}
+
void item_contents::remove_items_if( const std::function &filter )
{
for( item_pocket &pocket : contents ) {
diff --git a/src/item_contents.h b/src/item_contents.h
index 51e188a6ec7c3..8b9389a687bd3 100644
--- a/src/item_contents.h
+++ b/src/item_contents.h
@@ -320,6 +320,7 @@ class item_contents
const item &only_item() const;
const item &first_item() const;
item *get_item_with( const std::function &filter );
+ const item *get_item_with( const std::function &filter ) const;
void remove_items_if( const std::function &filter );
// whether the contents has a pocket with the associated type
diff --git a/src/item_factory.cpp b/src/item_factory.cpp
index d34c05a6bbc49..73851c4db812b 100644
--- a/src/item_factory.cpp
+++ b/src/item_factory.cpp
@@ -2724,6 +2724,9 @@ void Item_factory::load( islot_gun &slot, const JsonObject &jo, const std::strin
assign( jo, "min_cycle_recoil", slot.min_cycle_recoil, strict, 0 );
assign( jo, "ammo_effects", slot.ammo_effects, strict );
assign( jo, "ammo_to_fire", slot.ammo_to_fire, strict, 0 );
+ assign( jo, "heat_per_shot", slot.heat_per_shot, strict, 0.0 );
+ assign( jo, "cooling_value", slot.cooling_value, strict, 0.0 );
+ assign( jo, "overheat_threshold", slot.overheat_threshold, strict, -1.0 );
if( jo.has_array( "valid_mod_locations" ) ) {
slot.valid_mod_locations.clear();
diff --git a/src/item_pocket.cpp b/src/item_pocket.cpp
index d3ec2bca61840..3e88db7b738da 100644
--- a/src/item_pocket.cpp
+++ b/src/item_pocket.cpp
@@ -1917,6 +1917,16 @@ item *item_pocket::get_item_with( const std::function &fil
return nullptr;
}
+const item *item_pocket::get_item_with( const std::function &filter ) const
+{
+ for( const item &it : contents ) {
+ if( filter( it ) ) {
+ return ⁢
+ }
+ }
+ return nullptr;
+}
+
void item_pocket::remove_items_if( const std::function &filter )
{
contents.remove_if( filter );
@@ -2062,13 +2072,10 @@ void item_pocket::add( const item &it, item **ret )
}
}
-void item_pocket::add( const item &it, const int copies, item **ret )
+void item_pocket::add( const item &it, const int copies, std::vector- &added )
{
- std::list
- ::iterator first = contents.insert( contents.end(), copies, it );
- if( ret == nullptr ) {
- restack();
- } else {
- *ret = restack( &*first );
+ for( auto iter = contents.insert( contents.end(), copies, it ); iter != contents.end(); iter++ ) {
+ added.push_back( &*iter );
}
}
diff --git a/src/item_pocket.h b/src/item_pocket.h
index 4f65ea5a585c5..a4426cbc18b62 100644
--- a/src/item_pocket.h
+++ b/src/item_pocket.h
@@ -310,6 +310,7 @@ class item_pocket
void clear_items();
bool has_item( const item &it ) const;
item *get_item_with( const std::function &filter );
+ const item *get_item_with( const std::function &filter ) const;
void remove_items_if( const std::function &filter );
/**
* Is part of the recursive call of item::process. see that function for additional comments
@@ -336,7 +337,7 @@ class item_pocket
* may create a new pocket
*/
void add( const item &it, item **ret = nullptr );
- void add( const item &it, int copies, item **ret );
+ void add( const item &it, int copies, std::vector
- &added );
bool can_unload_liquid() const;
int fill_with( const item &contained, Character &guy, int amount = 0,
diff --git a/src/itype.h b/src/itype.h
index 88168f67ed237..4b28aac4eb531 100644
--- a/src/itype.h
+++ b/src/itype.h
@@ -755,6 +755,24 @@ struct islot_gun : common_ranged_data {
int ammo_to_fire = 1;
+ /**
+ * The amount by which the item's overheat value is reduced every turn. Used in
+ * overheat-based guns.
+ */
+ double cooling_value = 100.0;
+
+ /**
+ * Used only in overheat-based guns. No melting LMG barrels yet.
+ */
+ double heat_per_shot = 0.0;
+
+ /**
+ * Used in overheat-based guns.
+ * Heat value at which critical overheat faults might occur.
+ * A value beneath 0.0 means that the gun cannot overheat.
+ */
+ double overheat_threshold = -1.0;
+
std::map> cached_ammos;
/**
diff --git a/src/iuse.cpp b/src/iuse.cpp
index c5062d8b16209..e918e67e73447 100644
--- a/src/iuse.cpp
+++ b/src/iuse.cpp
@@ -458,8 +458,8 @@ void remove_radio_mod( item &it, Character &p )
// Checks that the player can smoke
std::optional iuse::can_smoke( const Character &you )
{
- auto cigs = you.items_with( []( const item & it ) {
- return it.active && it.has_flag( flag_LITCIG );
+ auto cigs = you.cache_get_items_with( flag_LITCIG, []( const item & it ) {
+ return it.active;
} );
if( !cigs.empty() ) {
@@ -2360,7 +2360,7 @@ std::optional iuse::rm13armor_off( Character *p, item *it, const tripoint &
p->add_msg_if_player( _( "Vision enhancement system: ONLINE." ) );
p->add_msg_if_player( _( "Electro-reactive armor system: ONLINE." ) );
p->add_msg_if_player( _( "All systems nominal." ) );
- it->convert( itype_id( oname ) ).active = true;
+ it->convert( itype_id( oname ), p ).active = true;
p->calc_encumbrance();
return 1;
}
@@ -2382,7 +2382,7 @@ std::optional iuse::rm13armor_on( Character *p, item *it, const tripoint &
p->add_msg_if_player( _( "RivOS v2.19 shutdown sequence initiated." ) );
p->add_msg_if_player( _( "Shutting down." ) );
p->add_msg_if_player( _( "Your RM13 combat armor turns off." ) );
- it->convert( itype_id( oname ) ).active = false;
+ it->convert( itype_id( oname ), p ).active = false;
p->calc_encumbrance();
}
return 1;
@@ -2396,7 +2396,7 @@ std::optional iuse::unpack_item( Character *p, item *it, const tripoint & )
std::string oname = it->typeId().str() + "_on";
p->moves -= to_moves( 10_seconds );
p->add_msg_if_player( _( "You unpack your %s for use." ), it->tname() );
- it->convert( itype_id( oname ) ).active = false;
+ it->convert( itype_id( oname ), p ).active = false;
// Check if unpacking led to invalid container state
p->invalidate_inventory_validity_cache();
return 0;
@@ -2457,7 +2457,7 @@ std::optional iuse::pack_item( Character *p, item *it, const tripoint & )
}
p->moves -= to_moves( 10_seconds );
p->add_msg_if_player( _( "You pack your %s for storage." ), it->tname() );
- it->convert( itype_id( oname ) ).active = false;
+ it->convert( itype_id( oname ), p ).active = false;
}
return 0;
}
@@ -2493,7 +2493,7 @@ std::optional iuse::water_purifier( Character *p, item *it, const tripoint
p->moves -= to_moves( 2_seconds );
for( item *water : liquids ) {
- water->convert( itype_water_clean ).poison = 0;
+ water->convert( itype_water_clean, p ).poison = 0;
}
return charges_of_water;
}
@@ -2504,7 +2504,7 @@ std::optional iuse::radio_off( Character *p, item *it, const tripoint & )
p->add_msg_if_player( _( "It's dead." ) );
} else {
p->add_msg_if_player( _( "You turn the radio on." ) );
- it->convert( itype_radio_on ).active = true;
+ it->convert( itype_radio_on, p ).active = true;
}
return 1;
}
@@ -2512,9 +2512,7 @@ std::optional iuse::radio_off( Character *p, item *it, const tripoint & )
std::optional iuse::directional_antenna( Character *p, item *, const tripoint & )
{
// Find out if we have an active radio
- auto radios = p->items_with( []( const item & it ) {
- return it.typeId() == itype_radio_on;
- } );
+ auto radios = p->cache_get_items_with( itype_radio_on );
// If we don't wield the radio, also check on the ground
if( radios.empty() ) {
map_stack items = get_map().i_at( p->pos() );
@@ -3019,7 +3017,7 @@ static int toolweapon_off( Character &p, item &it, const bool fast_startup,
}
sounds::sound( p.pos(), volume, sounds::sound_t::combat, msg_success );
// 4 is the length of "_off".
- it.convert( itype_id( it.typeId().str().substr( 0, it.typeId().str().size() - 4 ) + "_on" ) );
+ it.convert( itype_id( it.typeId().str().substr( 0, it.typeId().str().size() - 4 ) + "_on" ), &p );
it.active = true;
return 1;
} else {
@@ -3109,7 +3107,7 @@ static int toolweapon_running( Character *p, item &it, const tripoint &pos,
if( p ) {
p->add_msg_if_player( _( "Your %s gurgles in the water and stops." ), it.tname() );
}
- it.convert( *it.type->revert_to ).active = false;
+ it.convert( *it.type->revert_to, p ).active = false;
} else if( one_in( sound_chance ) ) {
sounds::ambient_sound( pos, volume, sounds::sound_t::activity, sound );
}
@@ -3125,7 +3123,7 @@ std::optional iuse::toolweapon_deactivate( Character *p, item *it, const tr
sfx::fade_audio_channel( sfx::channel::chainsaw_theme, 3000 );
}
p->add_msg_if_player( _( "Your %s goes quiet." ), it->tname() );
- it->convert( *it->type->revert_to ).active = false;
+ it->convert( *it->type->revert_to, p ).active = false;
return 0; // Don't consume charges when turning off.
}
@@ -3370,7 +3368,7 @@ std::optional iuse::geiger( Character *p, item *it, const tripoint & )
break;
case 2:
p->add_msg_if_player( _( "The geiger counter's scan LED turns on." ) );
- it->convert( itype_geiger_on ).active = true;
+ it->convert( itype_geiger_on, p ).active = true;
break;
default:
return std::nullopt;
@@ -3692,7 +3690,7 @@ std::optional iuse::molotov_lit( Character *p, item *it, const tripoint &po
// 20% chance of going out harmlessly.
if( one_in( 5 ) ) {
p->add_msg_if_player( _( "Your lit Molotov goes out." ) );
- it->convert( itype_molotov ).active = false;
+ it->convert( itype_molotov, p ).active = false;
}
return 0;
}
@@ -3707,7 +3705,7 @@ std::optional iuse::firecracker_pack( Character *p, item *it, const tripoin
return std::nullopt;
}
p->add_msg_if_player( _( "You light the pack of firecrackers." ) );
- it->convert( itype_firecracker_pack_act );
+ it->convert( itype_firecracker_pack_act, p );
it->countdown_point = calendar::turn + 27_seconds;
it->set_age( 0_turns );
it->active = true;
@@ -3744,7 +3742,7 @@ std::optional iuse::firecracker( Character *p, item *it, const tripoint & )
return std::nullopt;
}
p->add_msg_if_player( _( "You light the firecracker." ) );
- it->convert( itype_firecracker_act );
+ it->convert( itype_firecracker_act, p );
it->countdown_point = calendar::turn + 2_seconds;
it->active = true;
return 1;
@@ -3761,7 +3759,7 @@ std::optional iuse::mininuke( Character *p, item *it, const tripoint & )
p->add_msg_if_player( _( "You set the timer to %s." ),
to_string( time_duration::from_turns( time ) ) );
get_event_bus().send( p->getID() );
- it->convert( itype_mininuke_act );
+ it->convert( itype_mininuke_act, p );
it->countdown_point = calendar::turn + time_duration::from_seconds( time );
it->active = true;
return 1;
@@ -3888,7 +3886,7 @@ std::optional iuse::shocktonfa_off( Character *p, item *it, const tripoint
return std::nullopt;
} else {
p->add_msg_if_player( _( "You turn the light on." ) );
- it->convert( itype_shocktonfa_on ).active = true;
+ it->convert( itype_shocktonfa_on, p ).active = true;
return 1;
}
}
@@ -3904,7 +3902,7 @@ std::optional iuse::shocktonfa_on( Character *p, item *it, const tripoint &
} else {
if( !it->ammo_sufficient( p ) ) {
p->add_msg_if_player( m_info, _( "Your tactical tonfa is out of power." ) );
- it->convert( itype_shocktonfa_off ).active = false;
+ it->convert( itype_shocktonfa_off, p ).active = false;
} else {
int choice = uilist( _( "tactical tonfa" ), {
_( "Zap something" ), _( "Turn off light" )
@@ -3916,7 +3914,7 @@ std::optional iuse::shocktonfa_on( Character *p, item *it, const tripoint &
}
case 1: {
p->add_msg_if_player( _( "You turn off the light." ) );
- it->convert( itype_shocktonfa_off ).active = false;
+ it->convert( itype_shocktonfa_off, p ).active = false;
}
}
}
@@ -3936,13 +3934,13 @@ std::optional iuse::mp3( Character *p, item *it, const tripoint & )
} else {
p->add_msg_if_player( m_info, _( "You put in the earbuds and start listening to music." ) );
if( it->typeId() == itype_mp3 ) {
- it->convert( itype_mp3_on ).active = true;
+ it->convert( itype_mp3_on, p ).active = true;
} else if( it->typeId() == itype_smart_phone ) {
- it->convert( itype_smartphone_music ).active = true;
+ it->convert( itype_smartphone_music, p ).active = true;
} else if( it->typeId() == itype_afs_atomic_smartphone ) {
- it->convert( itype_afs_atomic_smartphone_music ).active = true;
+ it->convert( itype_afs_atomic_smartphone_music, p ).active = true;
} else if( it->typeId() == itype_afs_wraitheon_smartphone ) {
- it->convert( itype_afs_atomic_wraitheon_music ).active = true;
+ it->convert( itype_afs_atomic_wraitheon_music, p ).active = true;
}
p->mod_moves( -200 );
}
@@ -4027,16 +4025,16 @@ std::optional iuse::mp3_deactivate( Character *p, item *it, const tripoint
if( it->typeId() == itype_mp3_on ) {
p->add_msg_if_player( _( "The mp3 player turns off." ) );
- it->convert( itype_mp3 ).active = false;
+ it->convert( itype_mp3, p ).active = false;
} else if( it->typeId() == itype_smartphone_music ) {
p->add_msg_if_player( _( "The phone turns off." ) );
- it->convert( itype_smart_phone ).active = false;
+ it->convert( itype_smart_phone, p ).active = false;
} else if( it->typeId() == itype_afs_atomic_smartphone_music ) {
p->add_msg_if_player( _( "The phone turns off." ) );
- it->convert( itype_afs_atomic_smartphone ).active = false;
+ it->convert( itype_afs_atomic_smartphone, p ).active = false;
} else if( it->typeId() == itype_afs_atomic_wraitheon_music ) {
p->add_msg_if_player( _( "The phone turns off." ) );
- it->convert( itype_afs_wraitheon_smartphone ).active = false;
+ it->convert( itype_afs_wraitheon_smartphone, p ).active = false;
}
p->mod_moves( -200 );
music::deactivate_music_id( music::music_id::mp3 );
@@ -4139,7 +4137,7 @@ std::optional iuse::solarpack( Character *p, item *it, const tripoint & )
p->add_msg_if_player(
_( "You unfold the solar array from the pack. You still need to connect it with a cable." ) );
- it->convert( itype_id( it->typeId().str() + "_on" ) );
+ it->convert( itype_id( it->typeId().str() + "_on" ), p );
return 0;
}
@@ -4160,7 +4158,7 @@ std::optional iuse::solarpack_off( Character *p, item *it, const tripoint &
// 3 = "_on"
it->convert( itype_id( it->typeId().str().substr( 0,
- it->typeId().str().size() - 3 ) ) ).active = false;
+ it->typeId().str().size() - 3 ) ), p ).active = false;
p->process_items(); // Process carried items to disconnect any connected cables
return 0;
}
@@ -4309,8 +4307,8 @@ std::optional iuse::portable_game( Character *p, item *it, const tripoint &
p->add_msg_if_player( _( "You and your friend play on your %s for a while." ), it_name );
}
for( npc *n : friends_w_game ) {
- std::vector
- nit = n->items_with( [&it]( const item & i ) {
- return i.typeId() == it->typeId() && i.ammo_sufficient( nullptr );
+ std::vector
- nit = n->cache_get_items_with( it->typeId(), []( const item & i ) {
+ return i.ammo_sufficient( nullptr );
} );
n->assign_activity( game_act );
n->activity.targets.emplace_back( *n, nit.front() );
@@ -4494,7 +4492,7 @@ std::optional iuse::vortex( Character *p, item *it, const tripoint & )
}
p->add_msg_if_player( m_warning, _( "Air swirls all over…" ) );
p->moves -= to_moves( 1_seconds );
- it->convert( itype_spiral_stone );
+ it->convert( itype_spiral_stone, p );
mon->friendly = -1;
return 1;
}
@@ -5080,7 +5078,7 @@ static bool heat_item( Character &p )
std::optional iuse::heatpack( Character *p, item *it, const tripoint & )
{
if( heat_item( *p ) ) {
- it->convert( itype_heatpack_used );
+ it->convert( itype_heatpack_used, p );
}
return 0;
}
@@ -5182,7 +5180,7 @@ int iuse::towel_common( Character *p, item *it, bool )
if( it && it->typeId() == itype_towel ) {
it->item_counter = to_turns( 30_minutes );
// change "towel" to a "towel_wet" (different flavor text/color)
- it->convert( itype_towel_wet );
+ it->convert( itype_towel_wet, p );
}
// default message
@@ -7169,7 +7167,7 @@ std::optional iuse::radiocar( Character *p, item *it, const tripoint & )
return std::nullopt;
}
- it->convert( itype_radio_car_on ).active = true;
+ it->convert( itype_radio_car_on, p ).active = true;
p->add_msg_if_player(
_( "You turned on your RC car; now place it on the ground, and use your radio control to play." ) );
@@ -7225,7 +7223,7 @@ std::optional iuse::radiocaron( Character *p, item *it, const tripoint & )
{
if( !it->ammo_sufficient( p ) ) {
// Deactivate since other mode has an iuse too.
- it->convert( itype_radio_car ).active = false;
+ it->convert( itype_radio_car, p ).active = false;
return 0;
}
@@ -7238,7 +7236,7 @@ std::optional iuse::radiocaron( Character *p, item *it, const tripoint & )
}
if( choice == 0 ) {
- it->convert( itype_radio_car ).active = false;
+ it->convert( itype_radio_car, p ).active = false;
p->add_msg_if_player( _( "You turned off your RC car." ) );
return 1;
@@ -7351,31 +7349,31 @@ std::optional iuse::radiocontrol( Character *p, item *it, const tripoint &
} else {
const flag_id signal( "RADIOSIGNAL_" + std::to_string( choice ) );
- auto item_list = p->get_radio_items();
- for( item *&elem : item_list ) {
- if( elem->has_flag( flag_BOMB ) && elem->has_flag( signal ) ) {
+ if( p->cache_has_item_with( flag_BOMB, [&p, &signal]( const item & it ) {
+ if( it.has_flag( flag_RADIO_ACTIVATION ) && it.has_flag( signal ) ) {
p->add_msg_if_player( m_warning,
_( "The %s in your inventory would explode on this signal. Place it down before sending the signal." ),
- elem->display_name() );
- return std::nullopt;
+ it.display_name() );
+ return true;
}
+ return false;
+ } ) ) {
+ return std::nullopt;
}
- std::vector
- radio_containers = p->items_with( []( const item & itm ) {
- return itm.has_flag( flag_RADIO_CONTAINER );
- } );
-
- for( item *items : radio_containers ) {
- item *itm = items->get_item_with( [&]( const item & c ) {
- return c.has_flag( flag_BOMB ) && c.has_flag( signal );
+ if( p->cache_has_item_with( flag_RADIO_CONTAINER, [&p, &signal]( const item & it ) {
+ const item *rad_cont = it.get_item_with( [&signal]( const item & c ) {
+ return c.has_flag( flag_BOMB ) && c.has_flag( signal );
} );
-
- if( itm != nullptr ) {
+ if( rad_cont != nullptr ) {
p->add_msg_if_player( m_warning,
_( "The %1$s in your %2$s would explode on this signal. Place it down before sending the signal." ),
- itm->display_name(), items->display_name() );
- return std::nullopt;
+ rad_cont->display_name(), it.display_name() );
+ return true;
}
+ return false;
+ } ) ) {
+ return std::nullopt;
}
p->add_msg_if_player( _( "Click." ) );
@@ -7711,7 +7709,7 @@ std::optional iuse::multicooker( Character *p, item *it, const tripoint &po
it->erase_var( "DISH" );
it->erase_var( "COOKTIME" );
it->erase_var( "RECIPE" );
- it->convert( itype_multi_cooker );
+ it->convert( itype_multi_cooker, p );
}
return 0;
}
@@ -7830,7 +7828,7 @@ std::optional iuse::multicooker( Character *p, item *it, const tripoint &po
p->add_msg_if_player( m_good,
_( "The screen flashes blue symbols and scales as the multi-cooker begins to shake." ) );
- it->convert( itype_multi_cooker_filled ).active = true;
+ it->convert( itype_multi_cooker_filled, p ).active = true;
it->ammo_consume( charges_to_start - charge_buffer, pos, p );
p->practice( skill_cooking, meal->difficulty * 3 ); //little bonus
@@ -7917,7 +7915,7 @@ std::optional iuse::multicooker_tick( Character *p, item *it, const tripoin
if( it->ammo_remaining( p, true ) < charge_buffer ) {
it->active = false;
it->erase_var( "RECIPE" );
- it->convert( itype_multi_cooker );
+ it->convert( itype_multi_cooker, p );
//drain the buffer amount given at activation
it->ammo_consume( charge_buffer, pos, p );
p->add_msg_if_player( m_info,
@@ -7951,7 +7949,7 @@ std::optional iuse::multicooker_tick( Character *p, item *it, const tripoin
it->active = false;
it->erase_var( "COOKTIME" );
- it->convert( itype_multi_cooker );
+ it->convert( itype_multi_cooker, p );
if( it->can_contain( meal ).success() ) {
it->put_in( meal, item_pocket::pocket_type::CONTAINER );
} else {
diff --git a/src/iuse_actor.cpp b/src/iuse_actor.cpp
index b80b2f65c2e86..8dc4cb50278f7 100644
--- a/src/iuse_actor.cpp
+++ b/src/iuse_actor.cpp
@@ -284,7 +284,7 @@ void iuse_transform::do_transform( Character *p, item &it ) const
// defined here to allow making a new item assigned to the pointer
item obj_it;
if( container.is_empty() ) {
- obj = &it.convert( target );
+ obj = &it.convert( target, p );
if( ammo_qty >= 0 || !random_ammo_qty.empty() ) {
int qty;
if( !random_ammo_qty.empty() ) {
@@ -306,7 +306,7 @@ void iuse_transform::do_transform( Character *p, item &it ) const
}
}
} else {
- obj = &it.convert( container );
+ obj = &it.convert( container, p );
int count = std::max( ammo_qty, 1 );
item cont;
if( target->count_by_charges() ) {
@@ -1879,7 +1879,7 @@ std::optional fireweapon_off_actor::use( Character *p, item &it,
p->add_msg_if_player( "%s", success_message );
}
- it.convert( target_id );
+ it.convert( target_id, p );
it.active = true;
} else if( !failure_message.empty() ) {
p->add_msg_if_player( m_bad, "%s", failure_message );
@@ -3433,7 +3433,7 @@ int heal_actor::finish_using( Character &healer, Character &patient, item &it,
// If the item is a tool, `make` it the new form
// Otherwise it probably was consumed, so create a new one
if( it.is_tool() ) {
- it.convert( used_up_item_id );
+ it.convert( used_up_item_id, &healer );
for( const auto &flag : used_up_item_flags ) {
it.set_flag( flag );
}
@@ -4448,10 +4448,8 @@ std::optional link_up_actor::use( Character *p, item &it, const tripoint &p
link_menu.addentry( 20, has_loose_end, -1, _( "Attach to Cable Charger System CBM" ) );
}
}
- if( targets.count( link_state::ups ) > 0 ) {
- if( !( p->all_items_with_flag( flag_IS_UPS ) ).empty() ) {
- link_menu.addentry( 21, has_loose_end, -1, _( "Attach to UPS" ) );
- }
+ if( targets.count( link_state::ups ) > 0 && p->cache_has_item_with( flag_IS_UPS ) ) {
+ link_menu.addentry( 21, has_loose_end, -1, _( "Attach to UPS" ) );
}
if( targets.count( link_state::solarpack ) > 0 ) {
const bool has_solar_pack_on = p->worn_with_flag( flag_SOLARPACK_ON );
@@ -4541,7 +4539,7 @@ std::optional link_up_actor::use( Character *p, item &it, const tripoint &p
link_menu.addentry( 20, has_loose_end && !it.link->has_state( link_state::bio_cable ),
-1, _( "Attach loose end to Cable Charger System CBM" ) );
}
- if( targets.count( link_state::ups ) > 0 && !( p->all_items_with_flag( flag_IS_UPS ) ).empty() ) {
+ if( targets.count( link_state::ups ) > 0 && p->cache_has_item_with( flag_IS_UPS ) ) {
link_menu.addentry( 21, has_loose_end && it.link->has_state( link_state::bio_cable ),
-1, _( "Attach loose end to UPS" ) );
}
@@ -5080,7 +5078,7 @@ std::optional link_up_actor::link_extend_cable( Character *p, item &it,
return false;
}
if( !inv.has_flag( flag_CABLE_SPOOL ) ) {
- return can_extend_devices && inv.type->can_use( "link_up" );
+ return can_extend_devices && inv.can_link_up();
}
return can_extend.find( inv.typeId().c_str() ) != can_extend.end() && &inv != ⁢
};
@@ -5088,7 +5086,7 @@ std::optional link_up_actor::link_extend_cable( Character *p, item &it,
_( "You don't have a compatible cable." ) );
} else {
const auto filter = [&it]( const item & inv ) {
- if( !inv.has_flag( flag_CABLE_SPOOL ) || !inv.type->can_use( "link_up" ) ||
+ if( !inv.has_flag( flag_CABLE_SPOOL ) || !inv.can_link_up() ||
( inv.link && ( it.link_length() >= 0 || inv.link->has_state( link_state::needs_reeling ) ) ) ) {
return false;
}
@@ -5178,7 +5176,7 @@ std::optional