diff --git a/Makefile b/Makefile index 69fde8e45530d..1bd4d45b91eb8 100644 --- a/Makefile +++ b/Makefile @@ -852,6 +852,7 @@ endif ifdef LUA mkdir -p $(DATA_PREFIX)/lua install --mode=644 lua/autoexec.lua $(DATA_PREFIX)/lua + install --mode=644 lua/log.lua $(DATA_PREFIX)/lua install --mode=644 lua/class_definitions.lua $(DATA_PREFIX)/lua endif install --mode=644 data/changelog.txt data/cataicon.ico data/fontdata.json \ @@ -888,6 +889,7 @@ endif ifdef LUA mkdir -p $(DATA_PREFIX)/lua install --mode=644 lua/autoexec.lua $(DATA_PREFIX)/lua + install --mode=644 lua/log.lua $(DATA_PREFIX)/lua install --mode=644 lua/class_definitions.lua $(DATA_PREFIX)/lua endif install --mode=644 data/changelog.txt data/cataicon.ico data/fontdata.json \ diff --git a/build-scripts/validate_pr_in_jenkins b/build-scripts/validate_pr_in_jenkins index 8f4095d8e4eba..a20f75c56fff3 100755 --- a/build-scripts/validate_pr_in_jenkins +++ b/build-scripts/validate_pr_in_jenkins @@ -5,7 +5,7 @@ if [ -z "$ghprbPullId" ]; then exit 0; fi allowed_section_titles='Features|Content|Interface|Mods|Balance|Bugfixes|Performance|Infrastructure|Build|I18N' echo 'Validating Summary line from pull request.' -echo "$ghprbPullLongDescription" | grep -P '(^|\\r\\n)\s*(```)?SUMMARY: ((None)|(('"${allowed_section_titles}"') \\?"(.*?)\\?"))(```)?\s*(\\r\\n|$)' +echo "$ghprbPullLongDescription" | grep -P '(^|\\r\\n)\s*(`){0,3}SUMMARY: ((None)|(('"${allowed_section_titles}"') \\?"(.*?)\\?"))(`){0,3}\s*(\\r\\n|$)' if [ $? -eq 0 ]; then echo 'Summary looks good.' exit 0 diff --git a/data/core/tips.json b/data/core/tips.json new file mode 100644 index 0000000000000..55108ea3f1a3c --- /dev/null +++ b/data/core/tips.json @@ -0,0 +1,177 @@ +[ + { + "type": "snippet", + "category": "tip", + "text": [ "Fires can spread easily, especially with abundance of fuel." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Even without electricity ovens can be useful fire containers." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Light itself doesn't draw zombies, it's sight, noise or smell." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Moose may not be your friend." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Turnout gear protects from fire but not from overheating." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Peek around corners. You may see your enemy before it sees you." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Cold food lasts longer. Find a cool basement or make a root cellar." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "You died? That's a part of the experience. Try again with what you've learned." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Freezing food? Put it by a fire or heat it up in a pan." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Underground cave or a basement is always cool, but never freezes." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Afraid of wild life? Yell untill it goes away. But beware of what comes instead." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Animals and zombies are not friends. You can take advantage of that." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Door is not the only way in. Or out if that matters." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Don't fight against the odds. There's no shame in running to survive." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "You don't have to sit next to fire to use it." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Many items have special actions. Try to find out what they do." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Dangerous place is not always equal to good loot. Use your head." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Getting in is not a problem. Think of way out and don't get cornered." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "There is often more then one way to achieve something. Think outside of the box." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Survival order: shelter, water, food, then everything else." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Balance armor versus encumbrance. Even dropping a backpack can help in melee." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Scared of melee? Throw some things at enemies and use reach weapons like spears." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Makeshift weapons can break easily, but they are weapons, and can be made again." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Not much survives a car at 120mph. Can you?" ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "You don't want an overgrown cockroach in your rotten food. Get rid of it." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Medicine can help you survive in a pinch but avoid overdose and addictions." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Use your map wisely. Prioritize looting places that will get yout what you need." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Wounds heal over time. Bandaging and disinfecting can speed up the process." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Don't get grabbed by zombies. Their bites can be infectious." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Feeling odd after waking up? Try eating healthier and your health may improve." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Eat well or your health might suffer. Fast food is only good in a pinch." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Nature can provide. You can live off the land if you learn how." ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Raw food and water from unsafe sources can't be healthy? Right?" ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Why walk all day to nearest town when you can adapt a vehicle?" ] + }, + { + "type": "snippet", + "category": "tip", + "text": [ "Food from before cataclysm won't last forever. Keep that in mind." ] + } +] diff --git a/data/json/construction.json b/data/json/construction.json index 31583ad3c8289..8a4f11503e060 100644 --- a/data/json/construction.json +++ b/data/json/construction.json @@ -1723,7 +1723,7 @@ "components" : [ [ [ "2x4", 14 ] ], [ [ "nail", 12 ] ], - [ [ "scrap", 6 ], [ "sheet_metal", 2 ] ], + [ [ "sheet_metal_small", 12 ] ], [ [ "water_faucet", 1 ] ] ], "pre_special" : "check_empty", @@ -1735,17 +1735,14 @@ "required_skills" : [ [ "fabrication", 2 ], [ "cooking", 2 ] ], "time" : 120, "qualities": [ - [ - { "id": "HAMMER", "level": 2 } - ], - [ - { "id": "SAW_W", "level": 1 } - ] + [ { "id": "HAMMER", "level": 2 } ], + [ { "id": "SAW_M", "level": 2 } ], + [ { "id": "SAW_W", "level": 1 } ] ], "components" : [ [ [ "2x4", 18 ] ], [ [ "nail", 14 ] ], - [ [ "scrap", 8 ], [ "sheet_metal", 3 ] ], + [ [ "sheet_metal", 1 ] ], [ [ "water_faucet", 1 ] ] ], "pre_special" : "check_empty", diff --git a/data/json/furniture.json b/data/json/furniture.json index eaf02ba423a3c..34896fe3079c9 100644 --- a/data/json/furniture.json +++ b/data/json/furniture.json @@ -451,8 +451,9 @@ "deconstruct": { "items": [ { "item": "sheet_metal", "count": [ 2, 6 ] }, - { "item": "scrap", "count": [ 2, 6 ] }, + { "item": "sheet_metal_small", "count": [ 0, 4 ] }, { "item": "steel_chunk", "count": [ 2, 3 ] }, + { "item": "scrap", "count": [ 2, 6 ] }, { "item": "element", "count": [ 1, 4 ] }, { "item": "cable", "charges": [ 1, 3 ] }, { "item": "pilot_light", "count": 1 } @@ -465,10 +466,11 @@ "sound": "metal screeching!", "sound_fail": "clang!", "items": [ - { "item": "scrap", "count": [ 0, 6 ] }, + { "item": "sheet_metal", "count": [ 1, 4 ] }, + { "item": "sheet_metal_small", "count": [ 8, 12 ] }, { "item": "steel_chunk", "count": [ 0, 3 ] }, + { "item": "scrap", "count": [ 0, 6 ] }, { "item": "element", "count": [ 1, 3 ] }, - { "item": "sheet_metal", "count": [ 2, 6 ] }, { "item": "cable", "charges": [ 1, 3 ] }, { "item": "pilot_light", "count": 1 } ] @@ -902,7 +904,8 @@ { "item": "2x4", "count": 1 }, { "item": "nail", "charges": [ 1, 5 ] }, { "item": "splinter", "count": 2 }, - { "item": "scrap", "count": [ 1, 3 ] } + { "item": "sheet_metal_small", "count": [ 6, 10 ] }, + { "item": "scrap", "count": [ 4, 10 ] } ] } }, @@ -1049,14 +1052,25 @@ "move_cost_mod": -1, "required_str": 9, "flags": [ "CONTAINER", "PLACE_ITEM", "BLOCKSDOOR" ], - "deconstruct": { "items": [ { "item": "sheet_metal", "count": [ 1, 2 ] }, { "item": "pipe", "count": [ 4, 8 ] } ] }, + "deconstruct": { + "items": [ + { "item": "sheet_metal", "count": [ 1, 2 ] }, + { "item": "sheet_metal_small", "count": [ 0, 4 ] }, + { "item": "pipe", "count": [ 4, 8 ] } + ] + }, "max_volume": 8000, "bash": { "str_min": 12, "str_max": 40, "sound": "metal screeching!", "sound_fail": "clang!", - "items": [ { "item": "scrap", "count": [ 2, 8 ] }, { "item": "steel_chunk", "count": [ 0, 3 ] }, { "item": "pipe", "count": 1 } ] + "items": [ + { "item": "scrap", "count": [ 2, 8 ] }, + { "item": "steel_chunk", "count": [ 2, 4 ] }, + { "item": "sheet_metal_small", "count": [ 6, 10 ] }, + { "item": "pipe", "count": 1 } + ] } }, { @@ -1069,14 +1083,25 @@ "move_cost_mod": -1, "required_str": 8, "flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "PLACE_ITEM", "BLOCKSDOOR", "MOUNTABLE" ], - "deconstruct": { "items": [ { "item": "pipe", "count": [ 6, 12 ] }, { "item": "sheet_metal", "count": [ 1, 2 ] } ] }, + "deconstruct": { + "items": [ + { "item": "pipe", "count": [ 6, 12 ] }, + { "item": "sheet_metal", "count": [ 1, 2 ] }, + { "item": "sheet_metal_small", "count": [ 0, 4 ] } + ] + }, "max_volume": 7000, "bash": { "str_min": 6, "str_max": 30, "sound": "metal screeching!", "sound_fail": "clang!", - "items": [ { "item": "scrap", "count": [ 2, 8 ] }, { "item": "steel_chunk", "count": [ 0, 3 ] }, { "item": "pipe", "count": 1 } ] + "items": [ + { "item": "scrap", "count": [ 2, 8 ] }, + { "item": "steel_chunk", "count": [ 2, 4 ] }, + { "item": "sheet_metal_small", "count": [ 6, 10 ] }, + { "item": "pipe", "count": 1 } + ] } }, { @@ -1115,6 +1140,7 @@ { "item": "pipe", "count": 1 }, { "item": "scrap", "count": [ 2, 6 ] }, { "item": "steel_chunk", "count": [ 1, 3 ] }, + { "item": "sheet_metal_small", "count": [ 0, 4 ] }, { "item": "sheet_metal", "count": [ 2, 6 ] }, { "item": "cable", "charges": [ 1, 15 ] }, { "item": "hose", "count": [ 1, 2 ] }, @@ -1130,7 +1156,8 @@ "items": [ { "item": "scrap", "count": [ 2, 7 ] }, { "item": "steel_chunk", "count": [ 0, 3 ] }, - { "item": "sheet_metal", "count": [ 2, 6 ] }, + { "item": "sheet_metal_small", "count": [ 8, 12 ] }, + { "item": "sheet_metal", "count": [ 1, 4 ] }, { "item": "cable", "charges": [ 1, 15 ] }, { "item": "hose", "count": [ 0, 2 ] }, { "item": "cu_pipe", "count": [ 1, 4 ] }, @@ -1153,8 +1180,9 @@ "items": [ { "item": "scrap", "count": [ 2, 6 ] }, { "item": "steel_chunk", "count": [ 1, 3 ] }, - { "item": "element", "count": [ 2, 3 ] }, + { "item": "sheet_metal_small", "count": [ 0, 4 ] }, { "item": "sheet_metal", "count": [ 2, 6 ] }, + { "item": "element", "count": [ 2, 3 ] }, { "item": "cable", "charges": [ 1, 15 ] }, { "item": "motor_small", "charges": 1 }, { "item": "cu_pipe", "count": [ 1, 3 ] } @@ -1168,8 +1196,9 @@ "items": [ { "item": "scrap", "count": [ 0, 6 ] }, { "item": "steel_chunk", "count": [ 0, 3 ] }, + { "item": "sheet_metal_small", "count": [ 8, 12 ] }, + { "item": "sheet_metal", "count": [ 1, 4 ] }, { "item": "element", "count": [ 1, 3 ] }, - { "item": "sheet_metal", "count": [ 2, 6 ] }, { "item": "cable", "charges": [ 1, 15 ] } ] } @@ -1912,7 +1941,8 @@ { "item": "2x4", "count": 14 }, { "item": "nail", "charges": [ 6, 12 ] }, { "item": "water_faucet", "count": 1 }, - { "item": "sheet_metal", "count": 2 } + { "item": "sheet_metal_small", "count": [ 4, 10 ] }, + { "item": "scrap", "count": [ 5, 10 ] } ] }, "bash": { @@ -1924,6 +1954,8 @@ { "item": "2x4", "count": [ 4, 8 ] }, { "item": "nail", "charges": [ 4, 8 ] }, { "item": "water_faucet", "prob": 50 }, + { "item": "sheet_metal_small", "count": [ 2, 6 ] }, + { "item": "scrap", "count": [ 5, 10 ] }, { "item": "splinter", "count": 1 } ] } @@ -1944,7 +1976,8 @@ { "item": "2x4", "count": 14 }, { "item": "nail", "charges": [ 6, 12 ] }, { "item": "water_faucet", "count": 1 }, - { "item": "sheet_metal", "count": 2 } + { "item": "sheet_metal_small", "count": [ 4, 10 ] }, + { "item": "scrap", "count": [ 5, 10 ] } ] }, "bash": { @@ -1956,6 +1989,8 @@ { "item": "2x4", "count": [ 4, 8 ] }, { "item": "nail", "charges": [ 4, 8 ] }, { "item": "water_faucet", "prob": 50 }, + { "item": "sheet_metal_small", "count": [ 2, 6 ] }, + { "item": "scrap", "count": [ 5, 10 ] }, { "item": "splinter", "count": 1 } ] } @@ -1976,7 +2011,8 @@ { "item": "2x4", "count": 18 }, { "item": "nail", "charges": [ 7, 14 ] }, { "item": "water_faucet", "count": 1 }, - { "item": "sheet_metal", "count": 3 } + { "item": "sheet_metal_small", "count": [ 12, 20 ] }, + { "item": "scrap", "count": [ 5, 10 ] } ] }, "bash": { @@ -1988,6 +2024,8 @@ { "item": "2x4", "count": [ 6, 12 ] }, { "item": "nail", "charges": [ 4, 8 ] }, { "item": "water_faucet", "prob": 50 }, + { "item": "sheet_metal_small", "count": [ 6, 12 ] }, + { "item": "scrap", "count": [ 10, 20 ] }, { "item": "splinter", "count": 1 } ] } @@ -2043,7 +2081,7 @@ "str_max": 40, "sound": "smash!", "sound_fail": "whump.", - "items": [ { "item": "sheet_metal", "count": [ 1, 3 ] }, { "item": "pipe", "count": [ 1, 3 ] } ] + "items": [ { "item": "sheet_metal_small", "count": [ 3, 7 ] }, { "item": "pipe", "count": [ 1, 3 ] } ] } }, { @@ -2124,7 +2162,8 @@ "id": "f_flower_tulip", "name": "tulip", "symbol": "f", - "color": "light_magenta", + "looks_like": "f_mutpoppy", + "color": "magenta", "move_cost_mod": 0, "required_str": -1, "flags": [ "TRANSPARENT", "TINY", "FLAMMABLE_ASH" ], @@ -2136,6 +2175,7 @@ "id": "f_flower_spurge", "name": "spurge flower", "symbol": "f", + "looks_like": "f_dandelion", "color": "light_green", "move_cost_mod": 0, "required_str": -1, @@ -2996,9 +3036,9 @@ "sound": "metal screeching!", "sound_fail": "clang!", "items": [ - { "item": "scrap", "count": [ 0, 3 ] }, - { "item": "steel_chunk", "count": [ 0, 2 ] }, - { "item": "sheet_metal", "count": [ 0, 2 ] } + { "item": "scrap", "count": [ 5, 15 ] }, + { "item": "steel_chunk", "count": [ 2, 6 ] }, + { "item": "sheet_metal_small", "count": [ 2, 6 ] } ] } }, @@ -3147,7 +3187,11 @@ "str_max": 50, "sound": "metal screeching!", "sound_fail": "clang!", - "items": [ { "item": "scrap", "count": [ 1, 3 ] }, { "item": "pipe", "count": [ 1, 3 ] } ] + "items": [ + { "item": "scrap", "count": [ 4, 8 ] }, + { "item": "pipe", "count": [ 1, 3 ] }, + { "item": "sheet_metal_small", "count": [ 4, 8 ] } + ] } }, { diff --git a/data/json/item_actions.json b/data/json/item_actions.json index 93b1e90e85691..ad43c3f62c89d 100644 --- a/data/json/item_actions.json +++ b/data/json/item_actions.json @@ -54,7 +54,7 @@ },{ "type" : "item_action", "id" : "HOTPLATE", - "name" : "Heat up food" + "name" : "Heat up food (with it)" },{ "type" : "item_action", "id" : "MISC_REPAIR", @@ -406,7 +406,7 @@ },{ "type" : "item_action", "id" : "HEAT_FOOD", - "name" : "Heat up food" + "name" : "Heat up food (in it)" },{ "type" : "item_action", "id" : "HONEYCOMB", diff --git a/data/json/item_groups.json b/data/json/item_groups.json index 1d18ee618bb69..d34fb5d8cd954 100644 --- a/data/json/item_groups.json +++ b/data/json/item_groups.json @@ -557,7 +557,8 @@ ["cookbook_sushi", 5], ["scots_cookbook", 6], ["food_processor", 30 ], - ["eclipse_glasses", 1] + ["eclipse_glasses", 1], + ["thermos", 15] ] },{ "type" : "item_group", @@ -1140,7 +1141,8 @@ ["eboshi", 1], ["kariginu", 1], ["kimono", 5], - ["eclipse_glasses", 1] + ["eclipse_glasses", 1], + ["thermos", 20] ] },{ "type" : "item_group", @@ -1535,7 +1537,8 @@ ["weeks_old_newspaper", 5], ["newest_newspaper", 10], ["survnote", 2], - ["eclipse_glasses", 1] + ["eclipse_glasses", 1], + ["thermos", 10] ] }, { @@ -2620,7 +2623,8 @@ ["striped_pants", 1], ["razor_blade", 10], ["survnote", 5], - ["eclipse_glasses", 1] + ["eclipse_glasses", 1], + ["thermos", 30] ] },{ "type" : "item_group", @@ -3503,7 +3507,8 @@ ["pie_human", 5], ["bobburger", 5], ["cheeseburgerhuman", 5], - ["survnote", 5] + ["survnote", 5], + ["thermos", 25] ] },{ "type" : "item_group", @@ -3768,7 +3773,8 @@ ["holybook_scientology", 1], ["recipe_medicalmut", 1], ["survnote", 1], - ["tourist_table", 1] + ["tourist_table", 1], + ["thermos", 10] ] },{ "type" : "item_group", @@ -4317,7 +4323,9 @@ ["katana_inferior", 2], ["cestus", 2], ["mace", 20], + ["mace_inferior", 25], ["morningstar", 10], + ["morningstar_inferior", 15], ["glaive", 10], ["rapier", 3], ["cavalry_sabre", 3], @@ -4339,6 +4347,7 @@ ["warhammer", 10], ["halberd", 5], ["pike", 5], + ["pike_inferior", 10], ["spear_steel", 5], ["helmet_plate", 1], ["armor_plate", 2], @@ -4347,6 +4356,7 @@ ["quiver_large", 1], ["baldric", 4], ["nodachi", 1], + ["nodachi_inferior", 2], ["gambeson", 3], ["tunic", 1], ["armor_lightplate", 1], @@ -4392,6 +4402,8 @@ ["battleaxe_inferior", 30], ["cutlass_inferior", 30], ["scimitar_inferior", 30], + ["mace_inferior", 30], + ["morningstar_inferior", 30], ["trex_gun", 1], ["combination_gun", 1], ["700nx", 1], @@ -4748,7 +4760,8 @@ ["kimono", 3], ["l-stick", 1], ["solarpack", 5], - ["tourist_table", 10] + ["tourist_table", 10], + ["thermos", 25] ] },{ "type" : "item_group", @@ -5224,6 +5237,30 @@ ["slime_scrap", 8], ["chem_nitric_acid", 5] ] + },{ + "type" : "item_group", + "id" : "mut_iv", + "items":[ + ["iv_mutagen", 10], + ["iv_mutagen_plant", 2], + ["iv_mutagen_insect", 2], + ["iv_mutagen_spider", 2], + ["iv_mutagen_fish", 2], + ["iv_mutagen_slime", 2], + ["iv_mutagen_rat", 2], + ["iv_mutagen_beast", 2], + ["iv_mutagen_cattle", 2], + ["iv_mutagen_cephalopod", 2], + ["iv_mutagen_bird", 2], + ["iv_mutagen_lizard", 2], + ["iv_mutagen_troglobite", 2], + ["iv_mutagen_ursine", 2], + ["iv_mutagen_feline", 2], + ["iv_mutagen_lupine", 2], + ["iv_mutagen_mouse", 2], + ["iv_purifier", 20], + ["syringe", 10] + ] },{ "type" : "item_group", "id" : "teleport", @@ -7677,7 +7714,8 @@ ["knife_swissarmy", 5], ["roadmap", 1], ["touristmap", 1], - ["eclipse_glasses", 1] + ["eclipse_glasses", 1], + ["thermos", 5] ] },{ "type" : "item_group", @@ -8263,7 +8301,8 @@ ["bone", 2], ["syringe", 1], ["spike", 1], - ["tanbark", 2] + ["tanbark", 2], + ["thermos", 1] ] },{ "type" : "item_group", @@ -8638,7 +8677,11 @@ ["battleaxe_fake", 6], ["battleaxe_inferior", 10], ["mace", 1], + ["mace_fake", 2], + ["mace_inferior", 3], ["morningstar", 2], + ["morningstar_fake", 3], + ["morningstar_inferior", 4], ["warhammer", 2], ["scythe_war", 2], ["pike", 2], @@ -8798,7 +8841,8 @@ ["heavy_flashlight", 10], ["mag_fieldrepair", 20], ["mag_comic", 20], - ["mag_guns", 20] + ["mag_guns", 20], + ["thermos", 15] ] },{ "type" : "item_group", @@ -9514,47 +9558,46 @@ "id": "mail", "type": "item_group", "items": [ - [ "mag_tv", 35 ], - [ "mag_dude", 35 ], - [ "mag_beauty", 40 ], - [ "mag_glam", 40 ], - [ "mag_barter", 35 ], - [ "mag_computer", 35 ], - [ "mag_electronics", 35 ], - [ "mag_mechanics", 35 ], - [ "mag_survival", 35 ], - [ "mag_traps", 20 ], + [ "mag_tv", 15 ], + [ "mag_dude", 10 ], + [ "mag_beauty", 15 ], + [ "mag_glam", 15 ], + [ "mag_barter", 15 ], + [ "mag_computer", 15 ], + [ "mag_electronics", 15 ], + [ "mag_mechanics", 15 ], + [ "mag_survival", 15 ], + [ "mag_traps", 10 ], [ "fun_survival", 10 ], [ "mag_bashing", 10 ], [ "mag_cutting", 10 ], [ "mag_stabbing", 10 ], [ "mag_melee", 10 ], - [ "mag_unarmed", 20 ], + [ "mag_unarmed", 15 ], [ "mag_launcher", 10 ], - [ "mag_pistol", 15 ], - [ "mag_rifle", 20 ], - [ "mag_shotgun", 20 ], + [ "mag_pistol", 10 ], + [ "mag_rifle", 10 ], + [ "mag_shotgun", 10 ], [ "mag_smg", 10 ], - [ "mag_news", 35 ], - [ "mag_cars", 35 ], - [ "mag_cooking", 30 ], - [ "weeks_old_newspaper", 90 ], - [ "newest_newspaper", 100 ], - [ "news_regional", 75 ], - [ "mag_carpentry", 30 ], - [ "mag_comic", 30 ], + [ "mag_news", 15 ], + [ "mag_cars", 15 ], + [ "mag_cooking", 15 ], + { "item": "weeks_old_newspaper", "prob": 95, "count-min": 3, "count-max": 5}, + { "item": "newest_newspaper", "prob": 100, "count-min": 3, "count-max": 5}, + [ "news_regional", 70 ], + [ "mag_carpentry", 10 ], + [ "mag_comic", 15 ], [ "mag_animecon", 10 ], - [ "mag_guns", 20 ], - [ "mag_archery", 20 ], - [ "mag_dodge", 20 ], - [ "mag_comic", 20 ], - [ "mag_throwing", 20 ], - [ "mag_gaming", 20 ], + [ "mag_guns", 15 ], + [ "mag_archery", 15 ], + [ "mag_dodge", 15 ], + [ "mag_throwing", 10 ], + [ "mag_gaming", 15 ], [ "mag_swimming", 10 ], - [ "flyer", 75 ], - [ "mag_fabrication", 30 ], - [ "mag_tailor", 25 ], - [ "survnote", 1 ], + [ "flyer", 80 ], + [ "mag_fabrication", 15 ], + [ "mag_tailor", 15 ], + [ "survnote", 3 ], [ "touristmap", 3 ], [ "phonebook", 60 ], [ "holybook_bible1", 1 ], diff --git a/data/json/itemgroups/gear.json b/data/json/itemgroups/gear.json index f679f6b031e95..3d7ade6a32c22 100644 --- a/data/json/itemgroups/gear.json +++ b/data/json/itemgroups/gear.json @@ -49,7 +49,8 @@ ["pocket_survival", 5], ["pocket_firearms", 5], ["newest_newspaper", 75], - ["flyer", 10] + ["flyer", 10], + ["thermos", 5] ] }, { diff --git a/data/json/itemgroups/mansion.json b/data/json/itemgroups/mansion.json index 515559c6b9903..cf3c47d27ea6d 100644 --- a/data/json/itemgroups/mansion.json +++ b/data/json/itemgroups/mansion.json @@ -278,11 +278,11 @@ "type": "item_group", "subtype": "distribution", "items": [ - [ "null", 488 ], - { "group": "soa_decor", "prob": 75 }, - { "group": "soa_plate", "prob": 9 }, - { "group": "soa_mail", "prob": 8 }, - { "group": "soa_samurai", "prob": 8 } + [ "null", 7 ], + { "group": "soa_decor", "prob": 3 }, + { "group": "soa_plate", "prob": 2 }, + { "group": "soa_mail", "prob": 1 }, + { "group": "soa_samurai", "prob": 1 } ] }, { @@ -295,13 +295,11 @@ "id": "soa_weapons_decor", "type": "item_group", "subtype": "distribution", - "items": [ [ "pike", 50 ], { "group": "broadsword+scabbard", "prob": 17 }, [ "mace", 6 ], [ "morningstar", 5 ] ] - }, - { - "id": "broadsword+scabbard", - "type": "item_group", - "subtype": "collection", - "items": [ [ "broadsword", 100 ], [ "scabbard", 100 ] ] + "items": [ + { "group": "soa_fake_weapon_decor", "prob": 3 }, + { "group": "soa_poor_weapon_decor", "prob": 3 }, + { "group": "soa_real_weapon_decor", "prob": 3 } + ] }, { "id": "soa_plate", @@ -313,7 +311,11 @@ "id": "soa_weapons_plate", "type": "item_group", "subtype": "distribution", - "items": [ [ "mace", 50 ], [ "morningstar", 17 ], [ "battleaxe", 6 ], { "group": "broadsword+scabbard", "prob": 5 } ] + "items": [ + { "group": "soa_fake_weapon_plate", "prob": 3 }, + { "group": "soa_poor_weapon_plate", "prob": 3 }, + { "group": "soa_real_weapon_plate", "prob": 3 } + ] }, { "id": "soa_mail", @@ -325,7 +327,11 @@ "id": "soa_weapons_mail", "type": "item_group", "subtype": "distribution", - "items": [ [ "mace", 50 ], [ "pike", 17 ], [ "battleaxe", 6 ], { "group": "broadsword+scabbard", "prob": 5 } ] + "items": [ + { "group": "soa_fake_weapon_mail", "prob": 3 }, + { "group": "soa_poor_weapon_mail", "prob": 3 }, + { "group": "soa_real_weapon_mail", "prob": 3 } + ] }, { "id": "soa_samurai", @@ -337,7 +343,29 @@ "id": "soa_weapons_samurai", "type": "item_group", "subtype": "distribution", - "items": [ { "group": "samurai_sword_set", "prob": 73 }, [ "bokken", 6 ], [ "nodachi", 5 ] ] + "items": [ + { "group": "soa_fake_weapon_samurai", "prob": 3 }, + { "group": "soa_poor_weapon_samurai", "prob": 3 }, + { "group": "soa_real_weapon_samurai", "prob": 3 } + ] + }, + { + "id": "broadsword+scabbard", + "type": "item_group", + "subtype": "collection", + "items": [ [ "broadsword", 100 ], [ "scabbard", 100 ] ] + }, + { + "id": "broadsword_fake+scabbard", + "type": "item_group", + "subtype": "collection", + "items": [ [ "broadsword_fake", 100 ], [ "scabbard", 100 ] ] + }, + { + "id": "broadsword_inferior+scabbard", + "type": "item_group", + "subtype": "collection", + "items": [ [ "broadsword_inferior", 100 ], [ "scabbard", 100 ] ] }, { "id": "samurai_sword_set", @@ -345,6 +373,120 @@ "subtype": "collection", "items": [ [ "katana", 100 ], [ "wakizashi", 34 ], [ "tanto", 12 ] ] }, + { + "id": "samurai_sword_set_fake", + "type": "item_group", + "subtype": "collection", + "items": [ [ "katana_fake", 100 ], [ "wakizashi_fake", 34 ], [ "tanto_fake", 12 ] ] + }, + { + "id": "samurai_sword_set_inferior", + "type": "item_group", + "subtype": "collection", + "items": [ [ "katana_inferior", 100 ], [ "wakizashi_inferior", 34 ], [ "tanto_inferior", 12 ] ] + }, + { + "id": "soa_fake_weapon_decor", + "type": "item_group", + "subtype": "distribution", + "items": [ + [ "pike_fake", 50 ], + { "group": "broadsword_fake+scabbard", "prob": 17 }, + [ "mace_fake", 6 ], + [ "morningstar_fake", 5 ] + ] + }, + { + "id": "soa_poor_weapon_decor", + "type": "item_group", + "subtype": "distribution", + "items": [ + [ "pike_inferior", 50 ], + { "group": "broadsword_inferior+scabbard", "prob": 17 }, + [ "mace_inferior", 6 ], + [ "morningstar_inferior", 5 ] + ] + }, + { + "id": "soa_real_weapon_decor", + "type": "item_group", + "subtype": "distribution", + "items": [ [ "pike", 50 ], { "group": "broadsword+scabbard", "prob": 17 }, [ "mace", 6 ], [ "morningstar", 5 ] ] + }, + { + "id": "soa_fake_weapon_plate", + "type": "item_group", + "subtype": "distribution", + "items": [ + [ "pike_fake", 17 ], + { "group": "broadsword_fake+scabbard", "prob": 5 }, + [ "mace_fake", 50 ], + [ "morningstar_fake", 6 ] + ] + }, + { + "id": "soa_poor_weapon_plate", + "type": "item_group", + "subtype": "distribution", + "items": [ + [ "pike_inferior", 17 ], + { "group": "broadsword_inferior+scabbard", "prob": 5 }, + [ "mace_inferior", 50 ], + [ "morningstar_inferior", 6 ] + ] + }, + { + "id": "soa_real_weapon_plate", + "type": "item_group", + "subtype": "distribution", + "items": [ [ "pike", 17 ], { "group": "broadsword+scabbard", "prob": 5 }, [ "mace", 50 ], [ "morningstar", 6 ] ] + }, + { + "id": "soa_fake_weapon_mail", + "type": "item_group", + "subtype": "distribution", + "items": [ + [ "pike_fake", 17 ], + { "group": "broadsword_fake+scabbard", "prob": 5 }, + [ "mace_fake", 50 ], + [ "battleaxe_fake", 6 ] + ] + }, + { + "id": "soa_poor_weapon_mail", + "type": "item_group", + "subtype": "distribution", + "items": [ + [ "pike_inferior", 50 ], + { "group": "broadsword_inferior+scabbard", "prob": 5 }, + [ "mace_inferior", 50 ], + [ "battleaxe_inferior", 6 ] + ] + }, + { + "id": "soa_real_weapon_mail", + "type": "item_group", + "subtype": "distribution", + "items": [ [ "pike", 50 ], { "group": "broadsword+scabbard", "prob": 5 }, [ "mace", 50 ], [ "battleaxe", 6 ] ] + }, + { + "id": "soa_fake_weapon_samurai", + "type": "item_group", + "subtype": "distribution", + "items": [ { "group": "samurai_sword_set_fake", "prob": 7 }, [ "bokken_fake", 6 ], [ "nodachi_fake", 5 ] ] + }, + { + "id": "soa_poor_weapon_samurai", + "type": "item_group", + "subtype": "distribution", + "items": [ { "group": "samurai_sword_set_inferior", "prob": 7 }, [ "bokken_inferior", 6 ], [ "nodachi_inferior", 5 ] ] + }, + { + "id": "soa_real_weapon_samurai", + "type": "item_group", + "subtype": "distribution", + "items": [ { "group": "samurai_sword_set", "prob": 7 }, [ "bokken", 6 ], [ "nodachi", 5 ] ] + }, { "id": "toy_box", "type": "item_group", diff --git a/data/json/items/ammo.json b/data/json/items/ammo.json index fcb42342be213..ce9b2acef0b70 100644 --- a/data/json/items/ammo.json +++ b/data/json/items/ammo.json @@ -710,10 +710,10 @@ "name" : "modified mininuke", "symbol" : "*", "color" : "green", - "description" : "A heavily modified handheld nuclear device. Intended to be fired from a specialized launcher, its case has been cut down and it has been rigged to explode on impact. While it is somewhat lighter than before, it can no longer be triggered manually.", + "description" : "A heavily modified handheld nuclear device on a rocket. Intended to be fired from a specialized launcher, it has been rigged to explode on impact instead of on a timer. It can fly further than the explosion will reach, probably.", "material" : "plastic", - "volume" : 3, - "weight" : 3816, + "volume" : 388, + "weight" : 34500, "bashing" : 8, "ammo_type" : "mininuke_mod", "damage" : 14, diff --git a/data/json/items/armor.json b/data/json/items/armor.json index 79752f2005959..608df5e6044b5 100644 --- a/data/json/items/armor.json +++ b/data/json/items/armor.json @@ -699,6 +699,25 @@ "material_thickness": 2, "flags": [ "BELTED" ] }, + { + "id": "backpack_giant", + "type": "ARMOR", + "name": "giant novelty backpack", + "description": "A huge fabric backpack made mostly as a joke before the cataclysm. Now, it's still rather silly, but it can store a lot of stuff.", + "weight": 1200, + "volume": 35, + "price": 4500, + "material": [ "cotton" ], + "symbol": "[", + "color": "green", + "covers": [ "TORSO", "LEGS" ], + "coverage": 75, + "encumbrance": 100, + "storage": 140, + "warmth": 5, + "material_thickness": 2, + "flags": [ "BELTED" ] + }, { "id": "backpack_leather", "type": "ARMOR", diff --git a/data/json/items/biosignatures.json b/data/json/items/biosignatures.json index ac30e848bed12..f465a87474322 100644 --- a/data/json/items/biosignatures.json +++ b/data/json/items/biosignatures.json @@ -10,7 +10,7 @@ "symbol": "%", "quench": -3, "healthy": -10, - "nutrition": 3, + "calories": 26, "description": "Bird dropping, feathers, and soiled bits of rubbish.", "price": 0, "material": "feces", diff --git a/data/json/items/chemicals_and_resources.json b/data/json/items/chemicals_and_resources.json index 8feb082a16d84..6d569997d2037 100644 --- a/data/json/items/chemicals_and_resources.json +++ b/data/json/items/chemicals_and_resources.json @@ -167,7 +167,8 @@ "phase" : "liquid", "charges" : 2, "category" : "chems", - "fun" : -30 + "fun" : -30, + "freezing_point": 17 }, { "type" : "COMESTIBLE", @@ -188,7 +189,8 @@ "phase" : "liquid", "charges" : 2, "category" : "chems", - "fun" : -30 + "fun" : -30, + "freezing_point": -108 }, { "type" : "COMESTIBLE", @@ -204,7 +206,7 @@ "symbol" : "~", "quench" : -10, "healthy" : -2, - "nutrition" : 30, + "calories" : 260, "description" : "A nutrient rich elixir for plants.", "price" : 1000, "volume" : 1, @@ -227,7 +229,7 @@ "symbol" : "~", "quench" : -10, "healthy" : -2, - "nutrition" : 5, + "calories" : 43, "description" : "Nutrient rich granules for plants.", "price" : 1000, "//" : "This comes out as one charge in the bag, and the price is accurate-KA101", "material" : "powder", @@ -276,6 +278,7 @@ "volume" : 1, "phase" : "liquid", "category" : "chems", + "freezing_point": 28, "fun" : -1 }, { diff --git a/data/json/items/comestibles.json b/data/json/items/comestibles.json index 97e0b8dae2159..7c72a314bcca7 100644 --- a/data/json/items/comestibles.json +++ b/data/json/items/comestibles.json @@ -26,7 +26,7 @@ "symbol": "~", "quench": 35, "healthy": 2, - "nutrition": 4, + "calories": 35, "description": "Freshly-squeezed from real oranges! Tasty and nutritious.", "price": 90, "material": "fruit", @@ -48,7 +48,7 @@ "symbol": "~", "quench": 35, "healthy": 3, - "nutrition": 4, + "calories": 35, "description": "Pressed from fresh apples. Tasty and nutritious.", "price": 85, "material": "fruit", @@ -69,7 +69,7 @@ "symbol": "~", "quench": 35, "healthy": 1, - "nutrition": 4, + "calories": 35, "description": "Lemon juice mixed with water and sugar to dull the sourness. Delicious and refreshing.", "price": 80, "material": "fruit", @@ -90,7 +90,7 @@ "symbol": "~", "quench": 37, "healthy": 2, - "nutrition": 3, + "calories": 26, "description": "Made from real Massachusetts cranberries. Delicious and nutritious.", "price": 80, "material": "fruit", @@ -109,7 +109,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 60, - "nutrition": 2, + "calories": 17, "description": "Consisting of a special blend of electrolytes and simple sugars, this beverage tastes like bottled sweat but rehydrates the body faster than water.", "price": 55, "volume": 1, @@ -132,7 +132,7 @@ "quench": 15, "healthy": -1, "addiction_potential": 2, - "nutrition": 1, + "calories": 9, "description": "Popular among those who need to stay up late working.", "price": 170, "material": "junk", @@ -156,7 +156,7 @@ "quench": 45, "healthy": -6, "addiction_potential": 9, - "nutrition": 2, + "calories": 17, "description": "According to the label, this loathsome-tasting beverage is called ATOMIC POWER THIRST. Alongside the lengthy health warning, it promises to make the consumer UNCOMFORTABLY ENERGETIC using ELECTROLYTES and THE POWER OF THE ATOM.", "price": 1500, "//": "Check whether Rivtech-Expensive applies to their energy drinks", @@ -181,7 +181,7 @@ "quench": 18, "healthy": -1, "addiction_potential": 2, - "nutrition": 3, + "calories": 26, "description": "Things go better with cola. Sugar water with caffeine added.", "price": 95, "material": "junk", @@ -205,7 +205,7 @@ "quench": 18, "healthy": -1, "addiction_potential": 2, - "nutrition": 3, + "calories": 26, "description": "A caffeinated, carbonated drink, flavored with vanilla.", "price": 95, "material": "junk", @@ -226,7 +226,7 @@ "symbol": "~", "quench": 18, "healthy": -1, - "nutrition": 3, + "calories": 26, "description": "Unlike cola this is caffeine free, however it is still carbonated and has plenty of sugar. Not to mention a lemon-lime taste.", "price": 95, "material": "junk", @@ -247,7 +247,7 @@ "symbol": "~", "quench": 18, "healthy": -1, - "nutrition": 3, + "calories": 26, "description": "Unlike cola this is caffeine free, however it is still carbonated, sweet, and tastes vaguely orange-like.", "price": 95, "material": "junk", @@ -271,7 +271,7 @@ "quench": 14, "healthy": -2, "addiction_potential": 2, - "nutrition": 3, + "calories": 26, "description": "It tastes and looks like windshield wiper fluid, but it's loaded to the brim with sugar and caffeine.", "price": 100, "material": "junk", @@ -293,7 +293,7 @@ "symbol": "~", "quench": 18, "healthy": -1, - "nutrition": 3, + "calories": 26, "description": "Like cola, but without caffeine. Still not that healthy.", "price": 95, "material": "junk", @@ -316,7 +316,7 @@ "quench": 18, "healthy": -1, "addiction_potential": 2, - "nutrition": 3, + "calories": 26, "description": "Originating in Germany almost a century ago, this mix of cola and orange soda tastes great.", "price": 100, "material": "junk", @@ -337,7 +337,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 27, - "nutrition": 3, + "calories": 26, "description": "Mixing cranberry juice and lemon-lime soda works out quite well.", "price": 110, "material": [ "junk", "fruit" ], @@ -358,7 +358,7 @@ "symbol": "~", "quench": 18, "healthy": -1, - "nutrition": 4, + "calories": 35, "description": "A mass-produced grape flavored beverage of artificial origin. Good for when you want something that tastes like fruit, but still don't care about your health.", "price": 85, "material": "junk", @@ -380,7 +380,7 @@ "symbol": "~", "quench": 25, "healthy": 1, - "nutrition": 8, + "calories": 69, "description": "Baby cow food, appropriated for adult humans. Spoils rapidly.", "price": 38, "//": "A 12-charge gallon currently goes for around US$4.", @@ -402,7 +402,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 20, - "nutrition": 11, + "calories": 95, "description": "Baby cow food, appropriated for adult humans. Having been canned, this milk should last for a very long time.", "price": 700, "material": [ "milk", "junk" ], @@ -422,7 +422,7 @@ "symbol": "~", "quench": 6, "healthy": 2, - "nutrition": 68, + "calories": 590, "description": "Contains up to eight vegetables! Nutritious and tasty.", "price": 40, "material": "veggy", @@ -442,7 +442,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 30, - "nutrition": 40, + "calories": 347, "description": "Vegetable stock. Tasty and fairly nutritious.", "price": 350, "material": "veggy", @@ -462,7 +462,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 30, - "nutrition": 20, + "calories": 174, "description": "A tasty and nutritious broth made from bones.", "price": 350, "material": "bone", @@ -491,7 +491,7 @@ "symbol": "~", "quench": 8, "healthy": 1, - "nutrition": 23, + "calories": 200, "description": "A nutritious and delicious hearty vegetable soup.", "price": 400, "material": "veggy", @@ -513,7 +513,7 @@ "symbol": "~", "quench": 8, "healthy": 1, - "nutrition": 40, + "calories": 347, "description": "A nutritious and delicious hearty meat soup.", "price": 400, "material": "flesh", @@ -535,7 +535,7 @@ "symbol": "~", "quench": 8, "healthy": 1, - "nutrition": 38, + "calories": 330, "description": "A nutritious and delicious hearty fish soup.", "price": 400, "material": "flesh", @@ -558,7 +558,7 @@ "symbol": "~", "quench": 13, "healthy": 1, - "nutrition": 35, + "calories": 304, "description": "Spicy, and filled with bits of peppers. It's pretty good.", "price": 750, "material": "veggy", @@ -581,7 +581,7 @@ "symbol": "~", "quench": 13, "healthy": 1, - "nutrition": 50, + "calories": 434, "description": "Spicy, and filled with bits of peppers and meat! It's pretty good.", "price": 750, "material": [ "flesh", "veggy" ], @@ -603,7 +603,7 @@ "symbol": "~", "quench": 8, "healthy": 1, - "nutrition": 35, + "calories": 304, "description": "A nutritious and delicious soup, made of gifts of nature.", "price": 350, "material": [ "flesh", "veggy" ], @@ -633,7 +633,7 @@ "symbol": "~", "quench": 15, "healthy": 2, - "nutrition": 31, + "calories": 269, "description": "Chicken chunks and noodles swimming in a salty broth. Rumored to help cure colds.", "price": 580, "material": [ "flesh", "wheat" ], @@ -655,7 +655,7 @@ "symbol": "~", "quench": 15, "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "A mushy, gray semi-liquid soup made from mushrooms.", "price": 450, "material": "mushroom", @@ -677,7 +677,7 @@ "symbol": "~", "quench": 15, "healthy": 1, - "nutrition": 10, + "calories": 87, "description": "It smells of tomatoes. Not very filling, but it goes well with grilled cheese.", "price": 400, "material": "tomato", @@ -699,7 +699,7 @@ "symbol": "~", "quench": 10, "healthy": 1, - "nutrition": 23, + "calories": 200, "description": "A soup with chicken chunks and balls of dough. Not bad.", "price": 500, "material": [ "flesh", "wheat" ], @@ -724,7 +724,7 @@ "symbol": "~", "quench": 4, "addiction_potential": 5, - "nutrition": 4, + "calories": 35, "description": "Sparkling white wine, made from the world's noblest grape.", "price": 1100, "//": "Booze uses nonstandard charge counts: 15 shots of wine to the 750mL bottle. Priced at 1100 translates to $33 per, because it's still priced per 250 mL charge.", @@ -733,7 +733,8 @@ "phase": "liquid", "charges": 5, "flags": [ "EATEN_COLD" ], - "fun": 15 + "fun": 15, + "freezing_point": 17 }, { "type": "COMESTIBLE", @@ -750,7 +751,7 @@ "symbol": "~", "quench": 4, "addiction_potential": 5, - "nutrition": 4, + "calories": 35, "description": "America's most popular wine, and for good reason.", "price": 1200, "//": "The PLCB can get you some for around $10 per 750mL, but I imagine you want to pay for better ~fermentation~.", @@ -759,7 +760,8 @@ "phase": "liquid", "charges": 5, "flags": [ "EATEN_COLD" ], - "fun": 15 + "fun": 15, + "freezing_point": 17 }, { "type": "COMESTIBLE", @@ -776,14 +778,15 @@ "symbol": "~", "quench": 4, "addiction_potential": 5, - "nutrition": 4, + "calories": 35, "description": "The heavily disputed king of red wines. Pairs well with red meats and pasta.", "price": 1650, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "charges": 5, - "fun": 15 + "fun": 15, + "freezing_point": 17 }, { "type": "COMESTIBLE", @@ -800,7 +803,7 @@ "symbol": "~", "quench": 4, "addiction_potential": 5, - "nutrition": 4, + "calories": 35, "description": "Prized by collectors and adored by critics, it is one of the rarer and more elegant wines.", "price": 2600, "material": [ "alcohol", "water" ], @@ -808,7 +811,8 @@ "phase": "liquid", "charges": 5, "flags": [ "EATEN_COLD" ], - "fun": 16 + "fun": 16, + "freezing_point": 15 }, { "type": "COMESTIBLE", @@ -826,13 +830,14 @@ "quench": -12, "healthy": -2, "addiction_potential": 5, - "nutrition": 4, + "calories": 35, "description": "Made from, by, and for real Southern colonels!", "price": 2100, "//": "Given the comment, presuming we're taking bourbon here.", "material": "alcohol", "volume": 1, - "flags": [ "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "phase": "liquid", "charges": 7, "fun": 15 @@ -853,14 +858,15 @@ "quench": -10, "healthy": -2, "addiction_potential": 5, - "nutrition": 2, + "calories": 17, "description": "In Soviet Russia, vodka drinks you!", "price": 1900, "material": "alcohol", "volume": 1, "phase": "liquid", "charges": 7, - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 15 }, { @@ -879,14 +885,15 @@ "quench": -10, "healthy": -2, "addiction_potential": 5, - "nutrition": 2, + "calories": 17, "description": "Smells faintly of elderberries, but mostly booze.", "price": 1900, "material": "alcohol", "volume": 1, "phase": "liquid", "charges": 7, - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 15 }, { @@ -905,7 +912,7 @@ "quench": -12, "healthy": -2, "addiction_potential": 5, - "nutrition": 2, + "calories": 17, "description": "Drinking this might make you feel like a pirate. Or not.", "price": 2300, "material": "alcohol", @@ -913,7 +920,8 @@ "phase": "liquid", "charges": 7, "fun": 15, - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ] + "flags": [ "EATEN_COLD" ], + "freezing_point": -22 }, { "type": "COMESTIBLE", @@ -931,7 +939,7 @@ "quench": -12, "healthy": -2, "addiction_potential": 6, - "nutrition": 2, + "calories": 17, "description": "Don't eat the worm! Wait, there's no worm in this bottle.", "price": 2600, "material": "alcohol", @@ -939,7 +947,8 @@ "phase": "liquid", "charges": 7, "fun": 18, - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ] + "flags": [ "EATEN_COLD" ], + "freezing_point": -22 }, { "type": "COMESTIBLE", @@ -957,12 +966,13 @@ "quench": -8, "healthy": -2, "addiction_potential": 4, - "nutrition": 2, + "calories": 17, "description": "An orange flavored liquor used in many mixed drinks.", "price": 950, "material": "alcohol", "volume": 1, "flags": [ "EDIBLE_FROZEN" ], + "freezing_point": 0, "phase": "liquid", "charges": 7, "fun": 10 @@ -983,7 +993,7 @@ "quench": 6, "healthy": -4, "addiction_potential": 7, - "nutrition": 2, + "calories": 17, "description": "Really cheap fortified wine.", "price": 158, "material": [ "alcohol", "water" ], @@ -991,7 +1001,8 @@ "phase": "liquid", "charges": 7, "flags": [ "EATEN_COLD" ], - "fun": 10 + "fun": 10, + "freezing_point": 22 }, { "type": "COMESTIBLE", @@ -1009,14 +1020,15 @@ "quench": -12, "healthy": -4, "addiction_potential": 7, - "nutrition": 2, + "calories": 17, "description": "Strong alcoholic drinks, mixed with no regard for taste.", "price": 50, "material": "alcohol", "volume": 1, "phase": "liquid", "stack_size": 7, - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 5 }, { @@ -1035,13 +1047,14 @@ "quench": 16, "healthy": -2, "addiction_potential": 4, - "nutrition": 4, + "calories": 35, "description": "Weak alcoholic drinks, mixed with no regard for taste.", "price": 70, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 4 }, { @@ -1060,7 +1073,7 @@ "quench": 10, "healthy": -2, "addiction_potential": 3, - "nutrition": 2, + "calories": 17, "description": "Cheap booze made from fermented fruit juice. Tastes just like it sounds.", "price": 550, "material": [ "alcohol", "water" ], @@ -1068,7 +1081,8 @@ "phase": "liquid", "charges": 7, "flags": [ "EATEN_COLD" ], - "fun": 2 + "fun": 2, + "freezing_point": 20 }, { "type": "COMESTIBLE", @@ -1086,12 +1100,13 @@ "quench": -5, "healthy": -2, "addiction_potential": 5, - "nutrition": 2, + "calories": 17, "description": "Wine that has been distilled to a higher proof. Great as an after-dinner drink, but packs a punch.", "price": 1300, "material": "alcohol", "volume": 1, - "flags": [ "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "phase": "liquid", "charges": 7, "fun": 12 @@ -1112,7 +1127,7 @@ "quench": 20, "healthy": -2, "addiction_potential": 5, - "nutrition": 15, + "calories": 130, "description": "Sweetened coffee and whiskey topped with milk. Start your day the closeted alcoholic way!", "price": 500, "material": [ "alcohol", "water", "milk" ], @@ -1137,7 +1152,7 @@ "quench": -10, "healthy": -2, "addiction_potential": 5, - "nutrition": 2, + "calories": 17, "description": "A blend of incredibly strong-flavored liquors that somehow tastes like none of them.", "price": 600, "material": [ "alcohol", "water" ], @@ -1162,13 +1177,14 @@ "quench": 25, "healthy": 1, "addiction_potential": 4, - "nutrition": 6, + "calories": 52, "description": "The surreptitious drunkard mechanic's drink of choice.", "price": 600, "material": [ "alcohol", "fruit" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": -29, "fun": 20 }, { @@ -1187,13 +1203,14 @@ "quench": 25, "healthy": 1, "addiction_potential": 4, - "nutrition": 6, + "calories": 52, "description": "Like apple cider, only with vodka.", "price": 500, "material": [ "alcohol", "fruit" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": -29, "fun": 20 }, { @@ -1212,13 +1229,14 @@ "quench": 25, "healthy": -2, "addiction_potential": 4, - "nutrition": 5, + "calories": 43, "description": "Suitable for tropical retreats and Canadian artists alike.", "price": 600, "material": [ "alcohol", "junk" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 20 }, { @@ -1236,13 +1254,14 @@ "symbol": "~", "quench": 18, "addiction_potential": 2, - "nutrition": 4, + "calories": 35, "description": "Best served cold, in a glass, and with a lime - but you're not that lucky.", "price": 110, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 10 }, { @@ -1260,14 +1279,15 @@ "symbol": "~", "quench": 14, "addiction_potential": 2, - "nutrition": 4, + "calories": 35, "description": "Well-aged honey wine, spiced with a hint of hops. Goes down bittersweet.", "price": 1100, "material": [ "alcohol", "honey" ], "volume": 1, "phase": "liquid", "charges": 7, - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 14 }, { @@ -1285,7 +1305,7 @@ "symbol": "~", "quench": 10, "addiction_potential": 1, - "nutrition": 2, + "calories": 17, "description": "A light and delicious wine made from dandelion flowers. Slightly effervescent, it is smooth and crisp.", "price": 1400, "//": "Nope, homebrew is not more expensive than pinot noir, sorry.", @@ -1294,7 +1314,8 @@ "phase": "liquid", "charges": 7, "flags": [ "EATEN_COLD" ], - "fun": 16 + "fun": 16, + "freezing_point": 25 }, { "type": "COMESTIBLE", @@ -1312,7 +1333,7 @@ "quench": 2, "healthy": 1, "addiction_potential": 1, - "nutrition": 2, + "calories": 17, "description": "A potent wine flavored with pine resin. Bold and pungent, its biting taste and strong aroma takes some getting used to.", "price": 1000, "material": [ "alcohol", "water" ], @@ -1320,6 +1341,7 @@ "phase": "liquid", "charges": 7, "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 12 }, { @@ -1337,13 +1359,14 @@ "symbol": "~", "quench": 18, "addiction_potential": 2, - "nutrition": 4, + "calories": 35, "description": "Not the finest drink you've had, but hey, it's alcohol by the gallon.", "price": 500, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 8 }, { @@ -1362,14 +1385,15 @@ "quench": -16, "healthy": -6, "addiction_potential": 7, - "nutrition": 2, + "calories": 17, "description": "Only the strongest, purest, good ol' fashioned hooch. Guaranteed to make you forget about the whole cataclysm thing, or you get your vision back.", "price": 850, "material": "alcohol", "volume": 1, "phase": "liquid", "charges": 7, - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -49, "fun": 12 }, { @@ -1388,13 +1412,14 @@ "quench": 18, "healthy": -1, "addiction_potential": 2, - "nutrition": 4, + "calories": 35, "description": "A pilsner imported from Europe. Best served cold, in a glass - but you're not that lucky.", "price": 260, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 10 }, { @@ -1413,13 +1438,14 @@ "quench": 18, "healthy": -1, "addiction_potential": 2, - "nutrition": 4, + "calories": 35, "description": "A tasty craft beer. Best served cold, in a glass - but you're not that lucky.", "price": 150, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 14 }, { @@ -1438,13 +1464,14 @@ "quench": 18, "healthy": -1, "addiction_potential": 2, - "nutrition": 4, + "calories": 35, "description": "A very flavorful microbrewed beer. Best served cold, in a glass - but you're not that lucky.", "price": 150, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 14 }, { @@ -1463,12 +1490,13 @@ "quench": 18, "healthy": -1, "addiction_potential": 2, - "nutrition": 4, + "calories": 35, "description": "A tasty craft beer, as dark in color as the days ahead.", "price": 160, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", + "freezing_point": 23, "fun": 14, "flags": [ "EATEN_COLD" ] }, @@ -1488,13 +1516,14 @@ "quench": 16, "healthy": -1, "addiction_potential": 2, - "nutrition": 8, + "calories": 69, "description": "A flavorful and filling ale brewed by monks in Belgium. Best served in a goblet.", "price": 130, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": 23, "fun": 14 }, { @@ -1513,14 +1542,15 @@ "quench": 8, "healthy": -1, "addiction_potential": 4, - "nutrition": 6, + "calories": 52, "description": "A very flavorful beer that has been aged in bourbon barrels. It is as black as midnight on a moonless night and has the viscosity of oil. While very tasty, it also has an alcohol content on the level with wine.", "price": 450, "material": [ "alcohol", "water" ], "volume": 1, "phase": "liquid", "fun": 18, - "flags": [ "EATEN_COLD" ] + "flags": [ "EATEN_COLD" ], + "freezing_point": 23 }, { "type": "COMESTIBLE", @@ -1534,7 +1564,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 40, - "nutrition": 3, + "calories": 26, "description": "Tea, the beverage of gentlemen everywhere.", "price": 90, "volume": 1, @@ -1555,7 +1585,7 @@ "symbol": "~", "quench": 50, "healthy": 1, - "nutrition": 5, + "calories": 43, "description": "Clear juice obtained by cooking fruit in a large volume of water.", "price": 62, "material": "fruit", @@ -1579,7 +1609,7 @@ "symbol": "~", "quench": 40, "addiction_potential": 2, - "nutrition": 3, + "calories": 26, "description": "Coffee. The morning ritual of the pre-apocalyptic world.", "price": 100, "material": "water", @@ -1604,7 +1634,7 @@ "quench": 40, "healthy": -5, "addiction_potential": 8, - "nutrition": 4, + "calories": 35, "description": "This serving of coffee has been created using an atomic coffee pot's FULL NUCLEAR brewing cycle. Every possible microgram of caffeine and flavor has been carefully extracted for your enjoyment, using the power of the atom.", "price": 300, "material": "water", @@ -1624,7 +1654,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 36, - "nutrition": 4, + "calories": 35, "description": "A chocolate flavored beverage made of artificial flavoring and milk byproducts. Shelf stable and vaguely appetizing even when lukewarm.", "price": 100, "material": [ "junk", "milk" ], @@ -1645,7 +1675,7 @@ "symbol": "~", "quench": 5, "healthy": -8, - "nutrition": 5, + "calories": 43, "description": "Blood, possibly that of a human. Disgusting!", "price": 0, "material": "hflesh", @@ -1678,7 +1708,7 @@ "symbol": "%", "quench": 18, "healthy": -1, - "nutrition": 4, + "calories": 35, "description": "A fluid bladder from a plant based lifeform. Not very nutritious, but fine to eat anyway.", "price": 0, "material": "veggy", @@ -1696,7 +1726,7 @@ "symbol": "%", "quench": -10, "healthy": -3, - "nutrition": 10, + "calories": 87, "description": "Freshly butchered fat. You could eat it raw, but it is better used as an ingredient in other foods or projects.", "price": 0, "material": "flesh", @@ -1717,7 +1747,7 @@ "symbol": "%", "quench": -10, "healthy": -2, - "nutrition": 18, + "calories": 156, "description": "A smooth white block of cleaned and rendered animal fat. It will remain edible for a very long time, and can be used as an ingredient in many foods and projects.", "price": 500, "//": "*May* have been commercially traded.", @@ -1745,7 +1775,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -3, - "nutrition": 14, + "calories": 122, "description": "Dehydrated fish flakes. With proper storage, this dried food will remain edible for an incredibly long time.", "price": 500, "material": "flesh", @@ -1763,7 +1793,7 @@ "spoils_in": 24, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 16, + "calories": 139, "description": "Reconstituted fish flakes, which are much more enjoyable to eat now that they have been rehydrated.", "price": 500, "material": "flesh", @@ -1786,7 +1816,7 @@ "symbol": "%", "quench": -1, "healthy": 1, - "nutrition": 40, + "calories": 347, "description": "This is a serving of crisply brined and canned fish. Tasty and nutritious.", "price": 250, "//": "Two charges per jar.", @@ -1807,7 +1837,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 26, + "calories": 226, "description": "Low-sodium preserved fish. It was boiled and canned. Contains most of the nutrition, but little of the savor of cooked fish.", "price": 250, "material": "flesh", @@ -1827,7 +1857,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -5, - "nutrition": 22, + "calories": 191, "description": "Fish fillets cured in brine and vacuum-packed. Salty but tasty in a pinch.", "price": 1000, "material": "flesh", @@ -1846,7 +1876,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 28, + "calories": 243, "description": "A delicious golden brown serving of crispy fried fish.", "price": 500, "material": "flesh", @@ -1869,7 +1899,7 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 26, + "calories": 226, "description": "A delicious fish sandwich.", "price": 800, "material": [ "flesh", "wheat" ], @@ -1892,7 +1922,7 @@ "symbol": "%", "quench": -2, "healthy": 1, - "nutrition": 48, + "calories": 417, "description": "Lutefisk is preserved fish that has been dried in a lye solution. Vile and soap-like yet highly nutritious, it is reminiscent of the afterbirth of a dog or the world's largest chunk of phlegm.", "price": 200, "material": "flesh", @@ -1913,7 +1943,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 15, + "calories": 130, "description": "A handful of deep fried chicken. So bad it's good.", "price": 550, "material": [ "flesh", "junk" ], @@ -1934,7 +1964,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 12, + "calories": 104, "description": "Delicious lunch meat. Can be eaten cold.", "price": 3, "//": "*Looking for ~$6 per pound here.", @@ -1955,7 +1985,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 3, + "calories": 26, "description": "A type of lunch meat that comes pre-sliced. Its first name isn't Oscar. Can be eaten cold.", "price": 1000, "material": "flesh", @@ -1982,7 +2012,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "A nutrient rich chunk of plant matter, could be eaten raw or cooked.", "price": 600, "material": "veggy", @@ -2002,14 +2032,14 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 25, + "calories": 217, "description": "An assortment of edible-looking wild plants. Most are quite bitter-tasting. Some are inedible until cooked.", "//": "In real life many root vegetables are mildly toxic until cooked", "price": 60, "material": "veggy", "volume": 1, "fun": -10, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN", "SMOKABLE" ], "rot_spawn": "GROUP_ROTTING_PLANT", "rot_spawn_chance": 5 }, @@ -2023,7 +2053,7 @@ "spoils_in": 80, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 5, + "calories": 43, "description": "A stiff green stalk from a cattail plant. It is starchy and fibrous, but it would be much better if you cooked it.", "price": 0, "material": "veggy", @@ -2043,7 +2073,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 12, + "calories": 104, "description": "A cooked stalk from a cattail plant. Its fibrous outer leaves have been stripped away and now it is quite delicious.", "price": 0, "material": "veggy", @@ -2062,7 +2092,7 @@ "spoils_in": 80, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 22, + "calories": 191, "description": "A stout branching rhizome from a cattail plant. Its crisp white flesh is very starchy and fibrous, but you really ought to cook it before you attempt to eat it.", "price": 0, "material": "veggy", @@ -2082,7 +2112,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 32, + "calories": 278, "description": "Sticky, gooey carbohydrate paste extracted from plants. Spoils rather quickly if not prepared for storage.", "price": 0, "material": "veggy", @@ -2103,7 +2133,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 4, + "calories": 35, "description": "A collection of freshly picked yellow dandelions. In their current raw state they are quite bitter.", "price": 60, "material": "veggy", @@ -2111,7 +2141,7 @@ "stack_size": 4, "charges": 2, "fun": -12, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT", "rot_spawn_chance": 2 }, @@ -2126,13 +2156,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 2, - "nutrition": 20, + "calories": 174, "description": "Cooked leaves from wild dandelions. Tasty and nutritious.", "price": 200, "material": "veggy", "volume": 1, "stack_size": 2, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 1, "rot_spawn": "GROUP_ROTTING_PLANT", "rot_spawn_chance": 5 @@ -2148,14 +2178,14 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "Wild dandelion flowers that have been battered and deep fried. Very tasty and nutritious.", "price": 250, "material": "veggy", "volume": 1, "charges": 4, "stack_size": 2, - "flags": [ "EATEN_HOT", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, "rot_spawn": "GROUP_ROTTING_PLANT", "rot_spawn_chance": 7 @@ -2174,7 +2204,7 @@ "symbol": "~", "quench": 48, "healthy": 1, - "nutrition": 1, + "calories": 9, "description": "A healthy beverage made from dandelion roots steeped in boiling water.", "price": 50, "volume": 1, @@ -2195,7 +2225,7 @@ "use_action": "POISON", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 20, + "calories": 174, "description": "Meat that's obviously unhealthy. You could eat it, but it will poison you.", "price": 0, "material": "flesh", @@ -2216,7 +2246,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 2, + "calories": 17, "description": "A rotten and brittle bone from some unnatural creature or other. Could be used to make some stuff, like charcoal. You could eat it, but it will poison you.", "price": 0, "//": "Not for use in edible recipes, and should require ~200% as much as normal for applicable inedible recipes except for charcoal.", @@ -2244,7 +2274,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -3, - "nutrition": 1, + "calories": 9, "description": "A watery yellow glob of fat from some unnatural creature or other. You could eat it, but it will poison you.", "price": 0, "//": "Not for use in edible recipes, and should require ~200% as much as normal for applicable inedible recipes.", @@ -2266,7 +2296,7 @@ "symbol": "%", "quench": -10, "healthy": -2, - "nutrition": 6, + "calories": 52, "description": "A smooth grayish block of cleaned and rendered monster fat. It will remain 'fresh' for a very long time, and can be used as an ingredient in many projects. You could eat it, but it will poison you.", "price": 0, "//": "Not for use in edible/foodsafe recipes. Inefficiency is handled by tainted tallow recipe requiring 200% as much materials input as regular tallow recipe.", @@ -2286,7 +2316,7 @@ "use_action": "POISON", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 20, + "calories": 174, "description": "A little hunk of glop that fell off a blob monster. It doesn't seem hostile, but it does wiggle occasionally.", "price": 0, "volume": 1, @@ -2304,7 +2334,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Vegetable that looks poisonous. You could eat it, but it will poison you.", "price": 0, "material": "veggy", @@ -2321,7 +2351,7 @@ "spoils_in": 24, "comestible_type": "FOOD", "symbol": ",", - "nutrition": 30, + "calories": 260, "description": "A boiled stomach from an animal, nothing else. It looks all but appetizing.", "price": 750, "material": "flesh", @@ -2348,7 +2378,7 @@ "spoils_in": 24, "comestible_type": "FOOD", "symbol": ",", - "nutrition": 15, + "calories": 130, "description": "A small boiled stomach from an animal, nothing else. It looks all but appetizing.", "price": 375, "material": "flesh", @@ -2376,7 +2406,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 32, + "calories": 278, "healthy": -1, "parasites": 32, "description": "A hefty raw sausage, prepared for smoking.", @@ -2398,7 +2428,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 32, + "calories": 278, "description": "A hefty sausage that has been cured and smoked for long term storage.", "price": 1600, "material": "flesh", @@ -2420,7 +2450,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -2, - "nutrition": 4, + "calories": 35, "description": "A heavily processed sausage, commonplace at baseball games before the cataclysm. It would taste much better prepared.", "price": 800, "material": [ "flesh", "junk" ], @@ -2445,7 +2475,7 @@ "material": [ "flesh", "junk" ], "symbol": "%", "color": "red", - "nutrition": 12, + "calories": 104, "healthy": -1, "fun": 5, "spoils_in": 280, @@ -2465,7 +2495,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 25, + "calories": 217, "description": "Surprisingly, not made from dog. Cooked, this hot dog now tastes much better, but will spoil.", "price": 800, "material": [ "flesh", "junk", "wheat" ], @@ -2488,7 +2518,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 50, + "calories": 434, "description": "A hot dog, served with chili con carne as a topping. Yum!", "price": 900, "material": [ "flesh", "junk", "wheat" ], @@ -2520,7 +2550,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -6, - "nutrition": 4, + "calories": 35, "description": "A heavily processed sausage, dipped in batter and deep fried. It would taste much better prepared.", "price": 900, "material": [ "flesh", "junk" ], @@ -2542,7 +2572,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -2, - "nutrition": 20, + "calories": 174, "description": "A heavily processed sausage, dipped in batter and deep fried. Cooked, this corn dog now tastes much better, but will spoil.", "price": 900, "material": [ "flesh", "junk" ], @@ -2580,7 +2610,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -3, - "nutrition": 38, + "calories": 330, "description": "Sausage covered in a curry ketchup sauce. Fairly spicy and impressive at the same time!", "price": 900, "material": "flesh", @@ -2619,7 +2649,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 6, - "nutrition": 38, + "calories": 330, "description": "Biscuits, meat, and delicious mushroom soup all crammed together into a wonderfully greasy and tasteful mush.", "price": 1000, "material": [ "flesh", "wheat", "mushroom" ], @@ -2640,7 +2670,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 40, + "calories": 347, "description": "A freshly cooked chunk of plant matter, tasty and nutritious.", "price": 700, "material": "veggy", @@ -2659,7 +2689,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 40, + "calories": 347, "description": "Cooked wild edible plants. An interesting mix of flavors.", "price": 700, "material": "veggy", @@ -2678,13 +2708,13 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "An apple a day keeps the doctor away.", "price": 900, "material": "fruit", "volume": 1, "fun": 3, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -2697,7 +2727,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 4, - "nutrition": 12, + "calories": 104, "description": "A long, curved yellow fruit in a peel. Some people like using them in desserts. Those people are probably dead.", "price": 120, "material": "fruit", @@ -2716,13 +2746,13 @@ "symbol": "%", "quench": 8, "healthy": 2, - "nutrition": 14, + "calories": 122, "description": "Sweet citrus fruit. Also comes in juice form.", "price": 180, "material": "fruit", "volume": 1, "fun": 3, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -2736,12 +2766,12 @@ "symbol": "%", "quench": 5, "healthy": 2, - "nutrition": 5, + "calories": 43, "description": "Very sour citrus. Can be eaten if you really want.", "price": 120, "material": "fruit", "volume": 1, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "fun": -4 }, { @@ -2794,7 +2824,7 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 18, + "calories": 156, "description": "Dried strips of sugary fruit paste.", "price": 160, "material": "fruit", @@ -2815,7 +2845,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 8, + "calories": 69, "description": "Betcha can't eat just one.", "price": 180, "material": "junk", @@ -2834,12 +2864,13 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 9, + "calories": 78, "description": "Some fried seeds of a sunflower, pumpkin or other plant. Quite nutritious and tasty.", "price": 80, "material": "veggy", "volume": 1, - "flags": [ "EDIBLE_FROZEN", "SMOKABLE" ], + "flags": [ "SMOKABLE" ], + "freezing_point": -490, "charges": 4, "fun": 3 }, @@ -2855,7 +2886,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 5, + "calories": 43, "description": "A box of sugary breakfast cereal with marshmallows. It takes you back to your childhood.", "price": 400, "material": "junk", @@ -2877,7 +2908,7 @@ "symbol": "%", "quench": -2, "healthy": 1, - "nutrition": 6, + "calories": 52, "description": "A box of whole-grain wheat cereal. It's surprisingly good, and allegedly good for your heart.", "price": 300, "material": "wheat", @@ -2898,7 +2929,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 5, + "calories": 43, "description": "A box of cornflakes. They're not that good, but it beats nothing.", "price": 300, "material": "junk", @@ -2918,7 +2949,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -8, - "nutrition": 10, + "calories": 87, "description": "Dry toaster pastries usually coated with solid frosting and what luck! These are strawberry flavored!", "price": 400, "material": [ "wheat", "junk" ], @@ -2938,7 +2969,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -8, - "nutrition": 10, + "calories": 87, "description": "Dry toaster pastries, usually coated with solid frosting, these are blueberry flavored!", "price": 400, "material": [ "wheat", "junk" ], @@ -2958,7 +2989,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -8, - "nutrition": 10, + "calories": 87, "description": "Dry toaster pastries, usually coated with solid frosting. Sadly, these are not.", "price": 400, "material": [ "wheat", "junk" ], @@ -2979,7 +3010,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 2, + "calories": 17, "description": "A delicious fruit-filled pastry that you can cook in your toaster. It even comes with frosting! Cook it to make it tasty.", "price": 400, "material": [ "wheat", "junk" ], @@ -3001,7 +3032,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 4, - "nutrition": 15, + "calories": 130, "description": "A delicious fruit-filled pastry that you've cooked. It even comes with frosting!", "price": 400, "material": [ "wheat", "junk" ], @@ -3023,7 +3054,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 8, + "calories": 69, "description": "Some plain, salted potato chips.", "price": 135, "material": "junk", @@ -3044,7 +3075,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 8, + "calories": 69, "description": "Oh man, you love these chips! Score!", "price": 180, "//": "Favorite flavor varies.", @@ -3066,7 +3097,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "nutrition": 4, + "calories": 35, "description": "Salted chips made from corn tortillas, could really use some cheese, maybe some beef.", "price": 170, "material": "junk", @@ -3087,7 +3118,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "nutrition": 12, + "calories": 104, "description": "Salted chips made from corn tortillas, now with cheese. Could stand to have some meat.", "price": 250, "material": [ "junk", "milk" ], @@ -3109,7 +3140,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "nutrition": 12, + "calories": 104, "description": "Salted chips made from corn tortillas, now with meat. Could probably use some cheese, though.", "price": 250, "material": [ "junk", "flesh" ], @@ -3140,7 +3171,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "nutrition": 24, + "calories": 208, "description": "Salted chips made from corn tortillas with ground meat and smothered in cheese. Delicious.", "price": 300, "material": [ "flesh", "milk", "junk" ], @@ -3169,7 +3200,7 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 2, + "calories": 17, "description": "Dried kernels from a particular type of corn. Practically inedible raw, they can be cooked to make a tasty snack.", "price": 100, "material": "junk", @@ -3190,13 +3221,13 @@ "symbol": "%", "quench": -1, "healthy": 1, - "nutrition": 10, + "calories": 87, "description": "Plain and unseasoned popcorn. Not as tasty as other kinds, but healthier as a result.", "price": 115, "material": "veggy", "volume": 1, "charges": 3, - "flags": [ "EATEN_HOT", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4 }, { @@ -3212,13 +3243,13 @@ "symbol": "%", "quench": -3, "healthy": -1, - "nutrition": 10, + "calories": 87, "description": "Popcorn with salt added for extra flavor.", "price": 115, "material": "junk", "volume": 1, "charges": 3, - "flags": [ "EATEN_HOT", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 8 }, { @@ -3234,13 +3265,13 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 10, + "calories": 87, "description": "Popcorn with a light covering of butter for extra flavor.", "price": 115, "material": "junk", "volume": 1, "charges": 3, - "flags": [ "EATEN_HOT", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 10 }, { @@ -3255,7 +3286,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -4, - "nutrition": 9, + "calories": 78, "description": "A salty treat of a snack.", "price": 185, "material": [ "wheat", "junk" ], @@ -3275,7 +3306,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 9, + "calories": 78, "description": "A salty treat of a snack, covered in chocolate.", "price": 200, "material": [ "wheat", "junk" ], @@ -3295,7 +3326,7 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 8, + "calories": 69, "description": "Chocolate isn't very healthy, but it does make a delicious treat.", "price": 130, "material": "junk", @@ -3314,7 +3345,7 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 2, + "calories": 17, "description": "A handful of squishy, fluffy, puffy, delicious marshmallows.", "price": 250, "material": "junk", @@ -3335,7 +3366,7 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 24, + "calories": 208, "description": "A pair of graham crackers with some chocolate and a marshmallow between them.", "price": 400, "material": [ "wheat", "junk" ], @@ -3352,14 +3383,14 @@ "spoils_in": 80, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 25, + "calories": 217, "//": "Same as the meat it's been made from. It's additional ingredient compared to smoking, jerking, and dehydrating, so there's no incentive otherwise.", "description": "A dish in which meat or fish is set into a gelatin made from a meat or vegetable stock.", "price": 2500, "material": "flesh", "volume": 1, "charges": 2, - "flags": [ "EATEN_COLD", "NO_FREEZE" ] + "flags": [ "EATEN_COLD", "FREEZERBURN" ] }, { "type": "COMESTIBLE", @@ -3370,13 +3401,13 @@ "spoils_in": 80, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 20, + "calories": 174, "description": "A dish in which vegetables are set into a gelatin made from a plant stock.", "price": 1500, "material": "veggy", "volume": 2, "charges": 2, - "flags": [ "EATEN_COLD", "NO_FREEZE" ] + "flags": [ "EATEN_COLD", "FREEZERBURN" ] }, { "type": "COMESTIBLE", @@ -3400,7 +3431,7 @@ "symbol": "%", "quench": -2, "healthy": -1, - "nutrition": 8, + "calories": 69, "description": "Also known as pork rinds or chicharrones, these are bits of edible fat and skin that have been fried until they are crispy and delicious.", "price": 170, "material": "flesh", @@ -3421,7 +3452,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 37, + "calories": 321, "description": "A concentrated mixture of fat and protein used as a nutritious high-energy food. Composed of meat, tallow, and edible plants, it provides excellent nutrition in an easy to carry form.", "price": 600, "material": [ "flesh", "veggy" ], @@ -3451,7 +3482,7 @@ "symbol": "%", "quench": 1, "healthy": 1, - "nutrition": 27, + "calories": 234, "description": "Bread and vegetables, that's it.", "price": 800, "material": [ "veggy", "wheat" ], @@ -3473,7 +3504,7 @@ "symbol": "%", "quench": -2, "healthy": 1, - "nutrition": 31, + "calories": 269, "description": "A tasty and nutritious mixture of oats, honey, and other ingredients that has been baked until crisp.", "price": 350, "material": [ "wheat", "fruit" ], @@ -3493,7 +3524,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 16, + "calories": 139, "description": "Salty dried pork. Tastes good, but it will make you thirsty.", "price": 220, "material": [ "flesh", "junk" ], @@ -3513,7 +3544,7 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 30, + "calories": 260, "description": "Bread and meat, that's it.", "price": 900, "material": [ "flesh", "wheat" ], @@ -3543,7 +3574,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -10, - "nutrition": 30, + "calories": 260, "description": "Some peanut butter smothered between two pieces of bread. Not very filling and will stick to the roof of your mouth like glue.", "price": 250, "material": "wheat", @@ -3563,7 +3594,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 8, - "nutrition": 45, + "calories": 391, "description": "A delicious peanut butter and jelly sandwich. It reminds you of the times your mother would make you lunch.", "price": 175, "material": [ "fruit", "wheat" ], @@ -3583,7 +3614,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 8, - "nutrition": 45, + "calories": 391, "description": "Some damned fool put honey on this peanut butter sandwich, who in their right mind- oh wait this is pretty good.", "price": 175, "material": [ "wheat", "honey" ], @@ -3603,7 +3634,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 8, - "nutrition": 45, + "calories": 391, "description": "Who knew you could mix maple syrup and peanut butter to create yet another different sandwich?", "price": 175, "material": "wheat", @@ -3625,7 +3656,7 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 2, + "calories": 17, "description": "A big bag of peanut butter cups... your favorite!", "price": 180, "material": "junk", @@ -3647,7 +3678,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 2, + "calories": 17, "description": "A big bag of colorful chocolate filled candies.", "price": 180, "material": "junk", @@ -3669,7 +3700,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 2, + "calories": 17, "description": "A big bag of colorful fruit-flavored chewy candy.", "price": 180, "material": "junk", @@ -3691,7 +3722,7 @@ "symbol": "%", "quench": -6, "healthy": -1, - "nutrition": 5, + "calories": 43, "description": "Thin paper tubes of sweet & sour candy powder. Who thinks of this stuff?", "price": 120, "material": "junk", @@ -3714,7 +3745,7 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 1, + "calories": 9, "description": "This golden, translucent leaf candy is made with pure maple syrup and melt slowly as you savor the taste of real maple.", "price": 600, "material": "junk", @@ -3734,7 +3765,7 @@ "symbol": "%", "quench": 3, "healthy": 2, - "nutrition": 65, + "calories": 564, "description": "A tender piece of meat perfectly seasoned with a thin sweet glaze and its veggie accompaniments. A gourmet dish that is both healthy, sweet and delicious.", "price": 4000, "material": [ "flesh", "veggy" ], @@ -3755,7 +3786,7 @@ "spoils_in": 48, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 38, + "calories": 330, "description": "A sweet and delicious sausage. Better eat it fresh.", "price": 2400, "material": "flesh", @@ -3774,13 +3805,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 14, + "calories": 122, "description": "Mushrooms are tasty, but be careful. Some can poison you, while others are hallucinogenic.", "price": 140, "material": "mushroom", "volume": 1, "fun": -3, - "flags": [ "NO_FREEZE", "SMOKABLE" ], + "flags": [ "FREEZERBURN", "SMOKABLE" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -3795,12 +3826,12 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -5, - "nutrition": 14, + "calories": 122, "description": "Mushrooms are tasty, but be careful. Some can poison you, while others are hallucinogenic.", "price": 140, "material": "mushroom", "volume": 1, - "flags": [ "HIDDEN_POISON", "TRADER_AVOID", "NO_FREEZE" ], + "flags": [ "HIDDEN_POISON", "TRADER_AVOID", "FREEZERBURN" ], "fun": -3 }, { @@ -3814,12 +3845,12 @@ "stim": -4, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 14, + "calories": 122, "description": "Mushrooms are tasty, but be careful. Some can poison you, while others are hallucinogenic.", "price": 140, "material": "mushroom", "volume": 1, - "flags": [ "HIDDEN_HALLU", "NO_FREEZE", "SMOKABLE" ], + "flags": [ "HIDDEN_HALLU", "FREEZERBURN", "SMOKABLE" ], "fun": -3 }, { @@ -3832,13 +3863,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "A tasty cooked wild mushroom.", "price": 150, "material": "mushroom", "volume": 1, "fun": 1, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -3852,13 +3883,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 12, + "calories": 104, "description": "Prized by chefs and woodsmen alike, morel mushrooms are delicious but must be cooked before they are safe to eat.", "price": 2000, "material": "mushroom", "volume": 1, "fun": 1, - "flags": [ "NO_FREEZE", "SMOKABLE" ], + "flags": [ "FREEZERBURN", "SMOKABLE" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -3870,13 +3901,13 @@ "spoils_in": 24, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 18, + "calories": 156, "description": "A tasty cooked morel mushroom.", "price": 1500, "material": "mushroom", "volume": 1, "fun": 4, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -3888,14 +3919,14 @@ "spoils_in": 36, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 16, + "calories": 139, "description": "A delicious serving of fried morsels of morel mushroom.", "price": 1500, "material": "mushroom", "volume": 1, "charges": 2, "fun": 12, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -3909,7 +3940,7 @@ "symbol": "%", "quench": -1, "healthy": 1, - "nutrition": 8, + "calories": 69, "description": "Dried mushrooms are a tasty and healthy addition to many meals.", "price": 180, "material": "mushroom", @@ -3928,7 +3959,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 8, + "calories": 69, "description": "A hallucinogenic mushroom which has been dehydrated for storage. Will still cause hallucinations if eaten.", "price": 180, "material": "mushroom", @@ -3949,7 +3980,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "They're blue, but that doesn't mean they're sad.", "price": 400, "material": "fruit", @@ -3981,7 +4012,7 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "Tasty, juicy berry. Often found growing wild in fields.", "price": 400, "material": "fruit", @@ -4013,7 +4044,7 @@ "symbol": "%", "quench": 2, "healthy": 4, - "nutrition": 5, + "calories": 43, "description": "Sour red berries. Good for your health.", "price": 150, "material": "fruit", @@ -4044,7 +4075,7 @@ "symbol": "%", "quench": 3, "healthy": 2, - "nutrition": 15, + "calories": 130, "description": "A sweet red berry.", "price": 400, "material": "fruit", @@ -4075,7 +4106,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "Huckleberries, often times confused for blueberries.", "price": 400, "material": "fruit", @@ -4107,7 +4138,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "Mulberries, this red variety is unique to east North America and is described to have the strongest flavor of any variety in the world.", "price": 400, "material": "fruit", @@ -4139,7 +4170,7 @@ "symbol": "%", "quench": 2, "healthy": -1, - "nutrition": 16, + "calories": 139, "description": "Elderberries, toxic when eaten raw but great when cooked.", "price": 400, "material": "fruit", @@ -4171,7 +4202,7 @@ "symbol": "%", "quench": 1, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "The fruit of a pollinated rose flower.", "price": 400, "material": "fruit", @@ -4202,7 +4233,7 @@ "symbol": "%", "quench": -1, "healthy": 1, - "nutrition": 15, + "calories": 130, "description": "Left-over from juicing the fruit. Not very tasty, but contains a lot of healthy fiber.", "price": 50, "material": "fruit", @@ -4222,7 +4253,7 @@ "symbol": ",", "quench": -10, "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Raw wheat, not very tasty.", "price": 120, "material": "wheat", @@ -4242,7 +4273,7 @@ "symbol": ",", "quench": -8, "healthy": 1, - "nutrition": 22, + "calories": 191, "description": "Seeds from a wild buckwheat plant. Not particularly good to eat in their raw state, they are commonly cooked or ground into flour.", "price": 90, "material": "veggy", @@ -4262,7 +4293,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 2, - "nutrition": 50, + "calories": 434, "description": "A serving of cooked buckwheat groats. Healthy and nutritious but bland.", "price": 120, "material": "veggy", @@ -4284,7 +4315,7 @@ "symbol": "%", "quench": -1, "healthy": 1, - "nutrition": 5, + "calories": 43, "description": "Tasty crunchy nuts from a pinecone.", "price": 90, "material": "nut", @@ -4305,7 +4336,7 @@ "symbol": "%", "quench": -5, "healthy": 1, - "nutrition": 15, + "calories": 130, "description": "A handful of raw hard nuts from a hickory tree, their shells have been removed.", "price": 0, "flags": [ "EDIBLE_FROZEN" ], @@ -4324,7 +4355,7 @@ "symbol": "%", "quench": -5, "healthy": 1, - "nutrition": 15, + "calories": 130, "description": "A handful roasted nuts from a hickory tree.", "price": 90, "material": "nut", @@ -4343,7 +4374,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 10, - "nutrition": 15, + "calories": 130, "description": "Delicious hickory nut ambrosia. A drink worthy of the gods.", "price": 100, "material": [ "nut", "milk" ], @@ -4351,7 +4382,8 @@ "phase": "liquid", "charges": 4, "flags": [ "EATEN_HOT" ], - "fun": 5 + "fun": 5, + "freezing_point": -80 }, { "type": "COMESTIBLE", @@ -4364,7 +4396,7 @@ "symbol": ",", "quench": -20, "healthy": 1, - "nutrition": 10, + "calories": 87, "description": "A cluster of small cone-like flowers, indispensable for brewing beer.", "price": 20, "material": "veggy", @@ -4383,7 +4415,7 @@ "symbol": ",", "quench": -10, "healthy": 1, - "nutrition": 10, + "calories": 87, "description": "Grainy cereal used for malting. A staple of brewing everywhere. It can also be ground into flour.", "price": 20, "material": "veggy", @@ -4402,7 +4434,7 @@ "stim": 1, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 5, + "calories": 43, "description": "This fleshy root is ripe and flowing with sugars; just takes some processing to extract them.", "price": 50, "material": "veggy", @@ -4422,13 +4454,13 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "nutrition": 13, + "calories": 113, "description": "A crisp head of iceberg lettuce.", "price": 100, "material": "veggy", "volume": 3, "charges": 4, - "flags": [ "NO_FREEZE", "SMOKABLE" ], + "flags": [ "FREEZERBURN", "SMOKABLE" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -4442,7 +4474,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 15, + "calories": 130, "description": "A hearty head of crisp white cabbage.", "price": 100, "material": "veggy", @@ -4463,7 +4495,7 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "Juicy red tomato. It gained popularity in Italy after being brought back from the New World.", "price": 90, "material": "tomato", @@ -4483,7 +4515,7 @@ "symbol": "%", "quench": -6, "healthy": -2, - "nutrition": 1, + "calories": 9, "description": "A tough protective capsule bulging with densely packed fibers and seeds, this cotton boll can be processed into usable material with the right tools.", "price": 100, "material": [ "veggy", "cotton" ], @@ -4504,7 +4536,7 @@ "symbol": "%", "quench": -6, "healthy": -2, - "nutrition": 1, + "calories": 9, "description": "A hard casing filled with coffee seeds ready for roasting. The seeds create a dark black, bitter, caffinated liquid not too much unlike coffee.", "price": 100, "material": [ "veggy" ], @@ -4523,7 +4555,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 2, - "nutrition": 30, + "calories": 260, "description": "It's a bit tough, but quite delicious.", "price": 400, "material": "veggy", @@ -4541,7 +4573,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "A tasty summer squash.", "price": 300, "material": "veggy", @@ -4559,13 +4591,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 5, + "calories": 43, "description": "An aromatic onion used in cooking. Cutting these up can make your eyes sting!", "price": 50, "material": "veggy", "volume": 1, "fun": -1, - "flags": [ "NO_FREEZE", "SMOKABLE" ], + "flags": [ "FREEZERBURN", "SMOKABLE" ], "fun_comment": "Raw onions probably aren't all that tasty to most people.", "rot_spawn": "GROUP_ROTTING_PLANT" }, @@ -4580,7 +4612,7 @@ "symbol": "%", "quench": -18, "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "A pungent garlic bulb. Popular as a seasoning for its strong flavor. Can be disassembled to cloves.", "price": 600, "material": "garlic", @@ -4599,7 +4631,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 5, + "calories": 43, "description": "A healthy root vegetable. Rich in vitamin A!", "price": 200, "material": "veggy", @@ -4620,7 +4652,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Delicious golden kernels.", "price": 170, "//": "Thinking this is a single ear here.", @@ -4639,12 +4671,12 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 5, + "calories": 43, "description": "Spicy chili pepper.", "price": 50, "material": "veggy", "volume": 1, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "fun": -2 }, { @@ -4707,7 +4739,8 @@ "description": "An irradiated onion will remain edible nearly forever. Sterilized using radiation, so it's safe to eat.", "proportional": { "price": 2 }, "spoils_in": 0, - "container": "bag_plastic" + "container": "bag_plastic", + "flags": [ "FREEZERBURN" ] }, { "type": "COMESTIBLE", @@ -4742,7 +4775,7 @@ "symbol": "%", "quench": -2, "healthy": -2, - "nutrition": 50, + "calories": 434, "description": "Now with ONE POUND of meat and ONE POUND of carbs! Not as appetizing or nutritious as it would be if heated up.", "price": 320, "material": [ "flesh", "junk" ], @@ -4761,7 +4794,7 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 36, + "calories": 313, "description": "Now with ONE POUND of meat and ONE POUND of carbs! Nice and heated up. It's tastier and more filling, but will also spoil quickly.", "price": 90, "material": [ "flesh", "junk" ], @@ -4783,7 +4816,7 @@ "symbol": "%", "quench": -12, "healthy": -2, - "nutrition": 15, + "calories": 130, "description": "A small, microwaveable steak & cheese burrito, like those found at gas stations. Not as appetizing or nutritious as it would be if heated up.", "price": 200, "material": [ "flesh", "junk", "milk" ], @@ -4802,7 +4835,7 @@ "symbol": "%", "quench": -12, "healthy": -1, - "nutrition": 50, + "calories": 434, "description": "A small, microwaveable steak & cheese burrito, like those found at gas stations. It's tastier and more filling, but will also spoil quickly.", "price": 90, "material": [ "flesh", "junk", "milk" ], @@ -4822,7 +4855,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 10, + "calories": 87, "description": "It could be eaten raw if you're desperate, but is much better cooked.", "price": 120, "material": "wheat", @@ -4840,7 +4873,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 12, + "calories": 104, "description": "It could be eaten raw if you're desperate, but is much better cooked.", "price": 120, "material": "wheat", @@ -4860,7 +4893,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 12, - "nutrition": 30, + "calories": 260, "description": "Fresh wet noodles. Fairly bland, but fills you up.", "price": 20, "material": "wheat", @@ -4880,7 +4913,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 15, - "nutrition": 33, + "calories": 286, "description": "Fresh wet lasagne. Fairly bland, but fills you up.", "price": 20, "material": "wheat", @@ -4900,7 +4933,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 10, + "calories": 87, "description": "It could be eaten raw if you're desperate, but is much better cooked.", "price": 150, "material": "wheat", @@ -4920,13 +4953,13 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 25, - "nutrition": 50, + "calories": 434, "description": "When the cheese starts flowing, Kraft gets your noodle going.", "price": 380, "material": [ "wheat", "milk" ], "volume": 4, "charges": 2, - "flags": [ "EATEN_HOT", "TRADER_AVOID", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "TRADER_AVOID", "FREEZERBURN" ], "fun": 5, "rot_spawn": "GROUP_CARRION" }, @@ -4942,13 +4975,13 @@ "symbol": "%", "quench": 13, "healthy": 1, - "nutrition": 30, + "calories": 260, "description": "Some mac and cheese with ground meat added, enhancing the flavor and the nutritional value.", "price": 490, "material": [ "wheat", "flesh", "milk" ], "volume": 4, "charges": 4, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, "rot_spawn": "GROUP_CARRION" }, @@ -4970,7 +5003,7 @@ "container": "can_food", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 48, + "calories": 417, "description": "Meat encased in little dough satchels. Tastes fine raw.", "price": 250, "material": [ "flesh", "wheat" ], @@ -4988,13 +5021,13 @@ "container": "cup_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 15, + "calories": 130, "description": "Delicious fermented dairy. It tastes of vanilla.", "price": 190, "material": "milk", "volume": 1, "phase": "liquid", - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "fun": 15, "rot_spawn": "GROUP_CARRION" }, @@ -5008,14 +5041,14 @@ "container": "cup_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 10, + "calories": 87, "description": "Sugary, fermented dairy. A wonderful treat.", "price": 210, "material": [ "milk", "junk" ], "volume": 1, "phase": "liquid", "fun": 20, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_CARRION" }, { @@ -5029,7 +5062,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Tomato sauce, yum yum.", "price": 320, "//": "Small cans--needs upsized after the string freeze.", @@ -5052,7 +5085,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 48, + "calories": 417, "description": "A spicy stew containing chili peppers, meat, tomatoes and beans.", "price": 290, "material": [ "flesh", "veggy", "bean", "tomato" ], @@ -5082,7 +5115,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "Olive oil, basil, garlic, pine nuts. Simple and delicious.", "price": 230, "material": [ "veggy", "nut", "garlic" ], @@ -5102,7 +5135,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 40, + "calories": 347, "description": "Canned beans. A staple among canned goods, these are reputedly good for one's coronary health.", "price": 150, "material": "bean", @@ -5122,7 +5155,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -8, - "nutrition": 50, + "calories": 434, "description": "Greasy Prospector improved pork and beans with hickory smoked pig fat chunks.", "price": 200, "material": [ "flesh", "bean" ], @@ -5143,7 +5176,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 5, - "nutrition": 30, + "calories": 260, "description": "Canned corn in water. Eat up!", "price": 200, "material": "veggy", @@ -5162,7 +5195,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -3, - "nutrition": 48, + "calories": 417, "description": "A canned pork product that is unnaturally pink, oddly rubbery, and not very tasty, this SPAM remains quite filling. Completely unappetizing, but quite filling.", "price": 400, "material": "flesh", @@ -5183,7 +5216,7 @@ "symbol": "%", "quench": 5, "healthy": 1, - "nutrition": 26, + "calories": 226, "description": "Canned pineapple rings in water. Quite tasty.", "price": 400, "material": "fruit", @@ -5202,7 +5235,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 5, - "nutrition": 30, + "calories": 260, "description": "A dense, sweet creamy sauce, often used in curries.", "price": 350, "material": "fruit", @@ -5221,7 +5254,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -8, - "nutrition": 22, + "calories": 191, "description": "Salty little fish. They'll make you thirsty.", "price": 200, "material": "flesh", @@ -5241,7 +5274,7 @@ "container": "can_food", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 24, + "calories": 208, "description": "Now with 95 percent fewer dolphins!", "price": 200, "material": "flesh", @@ -5259,7 +5292,7 @@ "container": "can_food", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 44, + "calories": 382, "description": "Bright pink fish-paste in a can!", "price": 500, "material": "flesh", @@ -5277,7 +5310,7 @@ "container": "can_food", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 46, + "calories": 399, "description": "Bright white chicken-paste.", "price": 400, "material": "flesh", @@ -5296,7 +5329,7 @@ "//": "Small cans--needs properly Jarred after the string freeze.", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 38, + "calories": 330, "description": "Fish fillets pickled in some sort of tangy white sauce.", "price": 310, "material": "flesh", @@ -5316,7 +5349,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 1, - "nutrition": 24, + "calories": 208, "description": "Chopped quahog clams in water.", "price": 500, "material": "flesh", @@ -5335,7 +5368,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "nutrition": 42, + "calories": 365, "description": "Delicious, lumpy, white soup made of clams and potatoes. A taste of the lost glory of New England.", "price": 400, "material": [ "flesh", "milk" ], @@ -5355,7 +5388,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "nutrition": 20, + "calories": 174, "description": "A large chunk of wax filled with honey. Very tasty.", "price": 3500, "material": "honey", @@ -5373,7 +5406,7 @@ "symbol": "%", "quench": -4, "healthy": -1, - "nutrition": 4, + "calories": 35, "description": "A large chunk of beeswax. Not very tasty or nourishing, but okay in an emergency.", "price": 1500, "volume": 1, @@ -5391,7 +5424,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 10, - "nutrition": 10, + "calories": 87, "description": "A translucent hexagonal chunk of wax, filled with dense, milky jelly. Delicious, and rich with the most beneficial substances the hive can produce, it is useful for curing all sorts of afflictions.", "price": 20000, "//": "Didn't precisely exist pre-cataclysm, so tough to price.", @@ -5410,7 +5443,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 10, - "nutrition": 80, + "calories": 694, "description": "A chunk of meat with a coat of royal jelly over it. It's a lot like a honey-baked ham.", "price": 21000, "material": "flesh", @@ -5433,7 +5466,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -12, - "nutrition": 18, + "calories": 156, "description": "A deformed human fetus. Eating this would be the most vile thing you can think of, and might just cause you to mutate.", "price": 0, "material": "hflesh", @@ -5454,7 +5487,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -8, - "nutrition": 32, + "calories": 278, "description": "A misshapen human arm, eating this would be incredibly disgusting and probably cause you to mutate.", "price": 0, "material": "hflesh", @@ -5475,7 +5508,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -8, - "nutrition": 46, + "calories": 399, "description": "A malformed human leg, this would be gross to eat, and probably cause mutations.", "price": 0, "material": "hflesh", @@ -5497,7 +5530,7 @@ "quench": 20, "healthy": -10, "addiction_potential": 5, - "nutrition": 40, + "calories": 347, "description": "This looks like a blueberry the size of your fist, but pinkish in color. It has a strong but delicious aroma, but is clearly either mutated or of alien origin.", "price": 0, "material": "fruit", @@ -5520,7 +5553,7 @@ "quench": 5, "healthy": -10, "addiction_potential": 5, - "nutrition": 20, + "calories": 174, "description": "This looks like a handful of lemon-colored liquid which has taken a set, much like pre-cataclysm jello. It has a strong but delicious aroma, but is clearly either mutated or of alien origin.", "price": 0, "material": "fruit", @@ -5540,7 +5573,7 @@ "symbol": "%", "quench": 80, "healthy": 5, - "nutrition": 80, + "calories": 694, "description": "Humans might call this a Gray Delicious apple: large, gray, and smells even better than the Marloss. If they didn't reject it for its alien origins. But we know better.", "price": 0, "material": "fruit", @@ -5561,7 +5594,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 1, + "calories": 9, "description": "This enriched white flour is useful for baking.", "price": 450, "material": [ "wheat", "powder" ], @@ -5581,7 +5614,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 2, + "calories": 17, "description": "This yellow cornmeal is useful for baking.", "price": 450, "material": [ "veggy", "powder" ], @@ -5600,7 +5633,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 3, + "calories": 26, "description": "Dry flakes of flattened grain. Tasty and nutritious when cooked, it also doubles as food for horses while dry.", "price": 7500, "material": "wheat", @@ -5620,7 +5653,7 @@ "symbol": ",", "quench": -10, "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Raw oats.", "price": 120, "material": "wheat", @@ -5642,7 +5675,7 @@ "symbol": "%", "quench": -4, "healthy": -1, - "nutrition": 1, + "calories": 9, "description": "Dehydrated great northern beans. Tasty and nutritious when cooked, virtually inedible when dry.", "price": 300, "material": "bean", @@ -5663,7 +5696,7 @@ "symbol": "%", "quench": 1, "healthy": 1, - "nutrition": 50, + "calories": 434, "description": "A hearty serving of cooked great northern beans.", "price": 100, "material": "bean", @@ -5682,7 +5715,7 @@ "spoils_in": 360, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 44, + "calories": 382, "description": "Slow-cooked beans with meat. Tasty and very filling.", "price": 700, "material": [ "bean", "flesh" ], @@ -5704,7 +5737,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 39, + "calories": 339, "description": "Slow-cooked beans with vegetables. Tasty and very filling.", "price": 700, "material": [ "veggy", "bean" ], @@ -5727,7 +5760,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -6, - "nutrition": 2, + "calories": 17, "description": "Dehydrated long-grain rice. Tasty and nutritious when cooked, virtually inedible when dry.", "price": 500, "material": "veggy", @@ -5747,12 +5780,12 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 36, + "calories": 313, "description": "A hearty serving of cooked long-grain white rice.", "price": 100, "material": "veggy", "volume": 1, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 2, "rot_spawn": "GROUP_ROTTING_PLANT" }, @@ -5766,14 +5799,14 @@ "spoils_in": 360, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 41, + "calories": 356, "description": "Delicious fried rice with meat. Tasty and very filling.", "price": 700, "material": [ "veggy", "flesh" ], "volume": 1, "charges": 4, "//": "One rice + one protein/veg = 2 servings", - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, "rot_spawn": "GROUP_CARRION" }, @@ -5788,13 +5821,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 36, + "calories": 313, "description": "Delicious fried rice with vegetables. Tasty and very filling.", "price": 700, "material": "veggy", "volume": 1, "charges": 4, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 5, "rot_spawn": "GROUP_ROTTING_PLANT" }, @@ -5809,13 +5842,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 26, + "calories": 226, "description": "A serving of beans and rice that has been cooked together. Delicious and healthy!", "price": 500, "material": [ "veggy", "bean" ], "volume": 1, "charges": 4, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 2, "rot_spawn": "GROUP_CARRION" }, @@ -5830,13 +5863,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 36, + "calories": 313, "description": "Slow-cooked beans and rice with meat and seasonings. Tasty and very filling.", "price": 750, "material": [ "veggy", "bean", "flesh" ], "volume": 1, "charges": 6, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, "rot_spawn": "GROUP_CARRION" }, @@ -5851,13 +5884,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 33, + "calories": 286, "description": "Slow-cooked beans and rice with vegetables and seasonings. Tasty and very filling.", "price": 750, "material": [ "veggy", "bean" ], "volume": 1, "charges": 6, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, "rot_spawn": "GROUP_CARRION" }, @@ -5871,7 +5904,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 48, + "calories": 417, "description": "A filling and nutritious New England classic that has sustained pioneers and captains of industry alike.", "price": 500, "material": "wheat", @@ -5890,7 +5923,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 32, + "calories": 278, "description": "A filling and nutritious New England classic that has been improved with the addition of extra wholesome ingredients.", "price": 550, "material": "wheat", @@ -5927,7 +5960,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 1, + "calories": 9, "description": "A powder-like mix of cultured yeast, good for baking and brewing alike.", "price": 150, "material": "powder", @@ -5979,7 +6012,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -5, - "nutrition": 2, + "calories": 17, "description": "This chitin powder can be used to craft fertilizer and some other things.", "price": 25, "material": "powder", @@ -5998,7 +6031,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 1, + "calories": 9, "description": "A tasty collection of wild herbs including violet, sassafras, mint, clover, purslane, fireweed, and burdock.", "price": 190, "material": "veggy", @@ -6023,7 +6056,7 @@ "symbol": "~", "quench": 44, "healthy": 1, - "nutrition": 3, + "calories": 26, "description": "A healthy beverage made from herbs steeped in boiling water.", "price": 100, "volume": 1, @@ -6064,7 +6097,7 @@ "symbol": "%", "quench": -5, "healthy": -1, - "nutrition": 6, + "calories": 52, "description": "A handful of acorns, still in their shells. Squirrels like them, but they're not very good for you to eat in this state.", "price": 0, "material": "nut", @@ -6084,7 +6117,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 42, + "calories": 365, "description": "A serving of acorns that have been hulled, chopped, and boiled in water before being thoroughly toasted until dry. Filling and nutritious.", "price": 90, "material": "nut", @@ -6101,7 +6134,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 2, + "calories": 17, "description": "Whole fresh eggs, dehydrated into an easy to store powder.", "price": 1120, "material": [ "powder", "egg" ], @@ -6121,13 +6154,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 38, + "calories": 330, "description": "Fluffy and delicious scrambled eggs.", "price": 400, "material": "egg", "volume": 1, "charges": 2, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 3, "rot_spawn": "GROUP_CARRION" }, @@ -6142,13 +6175,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 33, + "calories": 286, "description": "Fluffy and delicious scrambled eggs made more delicious with the addition of other tasty ingredients.", "price": 700, "material": [ "egg", "flesh" ], "volume": 1, "charges": 3, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, "rot_spawn": "GROUP_CARRION" }, @@ -6164,13 +6197,13 @@ "symbol": "o", "quench": -1, "healthy": 1, - "nutrition": 38, + "calories": 330, "description": "A hard boiled egg, still in its shell. Portable and nutritious!", "price": 95, "material": "egg", "volume": 1, "fun": 2, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_CARRION" }, { @@ -6186,7 +6219,7 @@ "symbol": "%", "quench": -2, "healthy": -1, - "nutrition": 31, + "calories": 269, "description": "A thick slab of salty cured bacon. Shelf stable, precooked and ready-to-eat, it tastes better when reheated.", "price": 1900, "material": "flesh", @@ -6206,13 +6239,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -2, - "nutrition": 8, + "calories": 69, "description": "Mildly toxic and not very tasty raw. When cooked, it is delicious.", "price": 90, "material": "veggy", "volume": 1, "fun": -3, - "flags": [ "NO_FREEZE", "SMOKABLE" ], + "flags": [ "FREEZERBURN", "SMOKABLE" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -6226,7 +6259,7 @@ "symbol": "%", "quench": 5, "healthy": 2, - "nutrition": 22, + "calories": 191, "description": "A large vegetable, about the size of your head. Not very tasty raw, but is great for cooking.", "price": 750, "material": "veggy", @@ -6268,7 +6301,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "A delicious baked potato. Got any sour cream?", "price": 150, "material": "veggy", @@ -6289,7 +6322,7 @@ "symbol": "%", "quench": 3, "healthy": 2, - "nutrition": 24, + "calories": 208, "description": "This is a simple dish made by cooking the pumpkin pulp and then mashing.", "price": 50, "material": "veggy", @@ -6306,7 +6339,7 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 20, + "calories": 174, "description": "Simple unleavened bread.", "price": 140, "material": "wheat", @@ -6326,7 +6359,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Healthy and filling.", "price": 190, "material": "wheat", @@ -6347,7 +6380,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "Healthy and filling cornbread.", "price": 150, "material": "veggy", @@ -6368,7 +6401,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "A round, thin flatbread made from finely ground corn flour.", "price": 150, "material": "veggy", @@ -6389,7 +6422,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 33, + "calories": 286, "description": "A tortilla filled with cheese and lightly grilled.", "price": 500, "material": [ "milk" ], @@ -6409,7 +6442,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "A tasty and nutritious fried bread treat.", "price": 550, "material": [ "wheat", "junk" ], @@ -6430,7 +6463,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 22, + "calories": 191, "description": "Fluffy and delicious pancakes with real maple syrup.", "price": 550, "material": "wheat", @@ -6451,7 +6484,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 25, + "calories": 217, "description": "Fluffy and delicious pancakes with real maple syrup, made sweeter and healthier with the addition of wholesome fruit.", "price": 650, "material": [ "wheat", "fruit" ], @@ -6471,7 +6504,7 @@ "spoils_in": 240, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 25, + "calories": 217, "description": "Fluffy and delicious pancakes with real maple syrup, with delicious chocolate baked right in.", "price": 700, "material": [ "wheat", "junk" ], @@ -6492,7 +6525,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 45, + "calories": 391, "description": "Slices of bread dipped in a milk and egg mixture then fried.", "price": 600, "material": [ "wheat", "milk", "egg" ], @@ -6511,7 +6544,7 @@ "spoils_in": 240, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 37, + "calories": 321, "description": "Hey it's waffle time, it's waffle time. Won't you have some waffles of mine?", "price": 550, "material": "wheat", @@ -6531,7 +6564,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 45, + "calories": 391, "description": "Crunchy and delicious waffles with real maple syrup, made sweeter and healthier with the addition of wholesome fruit.", "price": 600, "material": [ "wheat", "fruit" ], @@ -6550,7 +6583,7 @@ "spoils_in": 240, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 40, + "calories": 347, "description": "Crunchy and delicious waffles with real maple syrup, with delicious chocolate baked right in.", "price": 650, "material": [ "wheat", "junk" ], @@ -6571,7 +6604,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -4, - "nutrition": 8, + "calories": 69, "description": "Dry and salty, these crackers will leave you quite thirsty.", "price": 110, "material": "wheat", @@ -6592,7 +6625,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -4, - "nutrition": 8, + "calories": 69, "description": "Dry and sugary, these crackers will leave you thirsty, but go good with some chocolate and marshmallows.", "price": 110, "material": [ "wheat", "junk" ], @@ -6612,7 +6645,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 12, + "calories": 104, "description": "Sweet and delicious cookies, just like grandma used to bake.", "price": 195, "material": [ "wheat", "junk" ], @@ -6636,10 +6669,11 @@ "comestible_type": "DRINK", "container": "bucket", "quench": 45, - "nutrition": 1, + "calories": 9, "fun": 1, "flags": [ "EATEN_COLD" ], - "phase": "liquid" + "phase": "liquid", + "freezing_point": 30 }, { "type": "COMESTIBLE", @@ -6652,14 +6686,15 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 1, - "nutrition": 3, + "calories": 26, "description": "Sweet and delicious, real Vermont maple syrup.", "price": 1900, "material": "junk", "volume": 1, "phase": "liquid", "charges": 5, - "fun": 5 + "fun": 5, + "freezing_point": -70 }, { "type": "COMESTIBLE", @@ -6672,7 +6707,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 3, - "nutrition": 5, + "calories": 43, "description": "A thick syrup produced from shredded sugar beets. Useful in cooking as a sweetener.", "price": 1500, "material": "junk", @@ -6690,7 +6725,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 18, + "calories": 156, "description": "A dry and virtually tasteless bread product capable of remaining edible without spoilage for vast lengths of time.", "price": 500, "material": "wheat", @@ -6711,7 +6746,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 24, + "calories": 208, "description": "Delicious and filling, this home made biscuit is good, and good for you!", "price": 230, "material": "wheat", @@ -6734,7 +6769,7 @@ "symbol": "%", "quench": 5, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "A delicious baked pie with a sweet fruit filling.", "price": 1250, "material": [ "wheat", "fruit" ], @@ -6756,7 +6791,7 @@ "symbol": "%", "quench": 5, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "A delicious baked pie with a delicious vegetable filling.", "price": 1250, "material": [ "wheat", "veggy" ], @@ -6778,7 +6813,7 @@ "symbol": "%", "quench": 5, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "A delicious baked pie with a delicious meat filling.", "price": 1350, "material": [ "wheat", "flesh" ], @@ -6810,7 +6845,7 @@ "symbol": "%", "quench": 4, "healthy": -1, - "nutrition": 16, + "calories": 139, "description": "A sweet and delicious baked pie with pure maple syrup.", "price": 1850, "material": [ "wheat", "milk" ], @@ -6830,7 +6865,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 40, + "calories": 347, "description": "A vegetarian pizza, with delicious tomato sauce and a fluffy crust. Its smell brings back great memories.", "price": 990, "material": [ "wheat", "veggy", "tomato" ], @@ -6851,7 +6886,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 40, + "calories": 347, "description": "A delicious pizza with molten cheese on top.", "price": 990, "material": [ "wheat", "milk" ], @@ -6871,7 +6906,7 @@ "container": "box_small", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 50, + "calories": 434, "description": "A meat pizza, for all the carnivores out there. Chock full of minced meat and heavily seasoned.", "price": 1090, "material": [ "wheat", "flesh" ], @@ -6974,7 +7009,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 40, + "calories": 347, "description": "The irradiated beef main course from an MRE. Sterilized using radiation, so it's safe to eat. Exposed to the atmosphere, it has started to go bad.", "price": 1250, "material": "flesh", @@ -6994,7 +7029,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 33, + "calories": 286, "description": "The irradiated vegetarian main course from an MRE. Sterilized using radiation, so it's safe to eat. Exposed to the atmosphere, it has started to go bad.", "price": 1250, "material": "veggy", @@ -7014,7 +7049,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 35, + "calories": 304, "description": "The irradiated chicken main course from an MRE. Sterilized using radiation, so it's safe to eat. Exposed to the atmosphere, it has started to go bad.", "price": 1250, "material": "flesh", @@ -7033,7 +7068,7 @@ "spoils_in": 80, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 40, + "calories": 347, "description": "Nicknamed the 'Four Fingers of Death' by troops, this is probably the most disgusting thing you've ever eaten. Sterilized using radiation, so it's safe to eat. Exposed to the atmosphere, it has started to go bad.", "price": 500, "material": [ "flesh", "junk" ], @@ -7053,7 +7088,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 10, - "nutrition": 31, + "calories": 269, "description": "The main course from a ravioli MRE, the sauce really helps with the taste. Sterilized using radiation, so it's safe to eat. Exposed to the atmosphere, it has started to go bad.", "price": 1300, "material": [ "flesh", "wheat" ], @@ -7075,7 +7110,7 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 2, + "calories": 17, "description": "Dried leaves of a tropical plant. You can boil them into tea, or you can just eat them raw. They aren't too filling though.", "price": 1030, "material": "veggy", @@ -7117,7 +7152,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 1, + "calories": 9, "description": "Dehydrated milk powder. Mix with water to make drinkable milk.", "price": 1100, "material": [ "powder", "milk" ], @@ -7142,7 +7177,7 @@ "quench": 1, "healthy": -1, "addiction_potential": 1, - "nutrition": 3, + "calories": 26, "description": "A thick syrup made of water and sugar strained through coffee grounds. Can be used to flavor many foods and beverages.", "price": 1300, "material": "junk", @@ -7159,7 +7194,7 @@ "color": "white", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 25, + "calories": 217, "description": "Delicious sponge cake with buttercream icing, it says happy birthday on it.", "price": 1500, "material": [ "wheat", "junk" ], @@ -7182,7 +7217,7 @@ "copy-from": "jihelucake", "stim": 8, "quench": -5, - "nutrition": 20, + "calories": 174, "description": "A cake coated in the thickest icing you've ever seen. Someone has written guff in quotation marks on it...", "price": 2200, "volume": 3, @@ -7198,7 +7233,7 @@ "container": "can_food", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 38, + "calories": 330, "description": "Low-sodium preserved meat. It was boiled and canned. Contains most of the nutrition, but little of the savor of cooked meat.", "price": 250, "material": "flesh", @@ -7220,7 +7255,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 28, + "calories": 243, "description": "This mushy pile of vegetable matter was boiled and canned in an earlier life. Better eat it before it oozes through your fingers.", "price": 250, "material": "veggy", @@ -7241,7 +7276,7 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "This sodden mass of preserved fruit was boiled and canned in an earlier life. Bland, mushy and losing color.", "price": 220, "material": "fruit", @@ -7270,7 +7305,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -5, - "nutrition": 21, + "calories": 182, "description": "Meat slices cured in brine and vacuum-packed. Salty but tasty in a pinch.", "price": 500, "material": "flesh", @@ -7299,7 +7334,7 @@ "symbol": "%", "quench": -5, "healthy": 1, - "nutrition": 31, + "calories": 269, "description": "Vegetable chunks pickled in a salt bath. Goes well with burgers, if only you can find one.", "price": 500, "material": "veggy", @@ -7319,7 +7354,7 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "Fruit slices soaked in a sugar syrup, to preserve freshness and appearance.", "price": 450, "material": "fruit", @@ -7339,13 +7374,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 25, + "calories": 217, "description": "Spaghetti covered with a thick meat sauce. Yum!", "price": 1000, "material": [ "wheat", "flesh" ], "volume": 7, "charges": 8, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 4, "rot_spawn": "GROUP_CARRION" }, @@ -7369,13 +7404,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 2, - "nutrition": 50, + "calories": 434, "description": "Spaghetti, with a generous helping of pesto on top. Yum!", "price": 1000, "material": [ "wheat", "veggy", "nut" ], "volume": 7, "charges": 2, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 15, "rot_spawn": "GROUP_ROTTING_PLANT" }, @@ -7390,13 +7425,13 @@ "symbol": "%", "quench": 5, "healthy": 1, - "nutrition": 38, + "calories": 330, "description": "A very old type of pasta made with several layers of lasagne sheets alternated with sauces and meats.", "price": 1000, "material": [ "flesh", "wheat" ], "volume": 12, "charges": 8, - "flags": [ "EATEN_HOT", "NO_FREEZE" ], + "flags": [ "EATEN_HOT", "FREEZERBURN" ], "fun": 15, "rot_spawn": "GROUP_CARRION" }, @@ -7422,12 +7457,13 @@ "volume": 1, "comestible_type": "DRINK", "container": "bottle_plastic", - "nutrition": 3, + "calories": 26, "spoils_in": 160, "charges": 5, "fun": -1, - "flags": [ "NO_FREEZE" ], - "phase": "liquid" + "flags": [ "FREEZERBURN" ], + "phase": "liquid", + "freezing_point": 25 }, { "id": "ketchup", @@ -7442,7 +7478,7 @@ "volume": 1, "comestible_type": "DRINK", "container": "bottle_plastic", - "nutrition": 3, + "calories": 26, "spoils_in": 600, "charges": 5, "fun": -1, @@ -7463,7 +7499,7 @@ "comestible_type": "DRINK", "container": "bottle_plastic", "fun": -1, - "nutrition": 3, + "calories": 26, "charges": 5, "phase": "liquid" }, @@ -7482,7 +7518,7 @@ "comestible_type": "DRINK", "container": "bottle_plastic", "quench": 2, - "nutrition": 7, + "calories": 61, "charges": 5, "healthy": 1, "fun": 3, @@ -7503,7 +7539,7 @@ "comestible_type": "FOOD", "container": "jar_glass", "quench": 1, - "nutrition": 8, + "calories": 69, "charges": 5, "healthy": 1, "fun": 2 @@ -7523,7 +7559,7 @@ "comestible_type": "DRINK", "container": "jar_glass_sealed", "quench": -2, - "nutrition": 5, + "calories": 43, "charges": 5, "phase": "liquid", "flags": [ "USE_EAT_VERB" ] @@ -7538,7 +7574,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 5, - "nutrition": 25, + "calories": 217, "description": "A pickled cucumber. Rather sour, but tastes good and lasts for a long time.", "price": 250, "material": "veggy", @@ -7558,7 +7594,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 11, + "calories": 95, "description": "This crunchy, sour topping made from lettuce or cabbage is perfect for your hot dogs and hamburgers, or, if you're desperate, straight to your stomach.", "price": 450, "material": "veggy", @@ -7578,7 +7614,7 @@ "symbol": "%", "quench": 5, "healthy": 1, - "nutrition": 30, + "calories": 260, "description": "This is a delicious sautee of lovely diced onions and sauerkraut. The smell alone is enough to make your mouth water.", "price": 500, "material": "veggy", @@ -7597,7 +7633,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 38, + "calories": 330, "description": "A pickled egg. Rather salty, but tastes good and lasts for a long time.", "price": 95, "material": "egg", @@ -7614,12 +7650,12 @@ "color": "white", "comestible_type": "FOOD", "symbol": "`", - "nutrition": 1, + "calories": 9, "description": "A piece of paper. Can be used for fires.", "price": 0, "material": "paper", "volume": 1, - "flags": [ "EDIBLE_FROZEN" ], + "freezing_point": -490, "charges": 50, "fun": -20 }, @@ -7633,7 +7669,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -6, - "nutrition": 28, + "calories": 243, "description": "Having been fried, this SPAM is actually pretty tasty.", "price": 500, "material": "flesh", @@ -7658,7 +7694,7 @@ "quench": 15, "healthy": 3, "addiction_potential": 6, - "nutrition": 8, + "calories": 69, "description": "Strawberries left to ferment with a few other choice ingredients offer up a surprisingly palatable mixture; you barely even have to force yourself to drink it after the first few gulps.", "price": 1600, "material": [ "alcohol", "water", "fruit" ], @@ -7666,7 +7702,8 @@ "phase": "liquid", "charges": 6, "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], - "fun": 8 + "fun": 8, + "freezing_point": -22 }, { "type": "COMESTIBLE", @@ -7684,7 +7721,7 @@ "quench": 15, "healthy": 1, "addiction_potential": 18, - "nutrition": 30, + "calories": 260, "description": "This fermented blueberry mixture is surprisingly hearty, though the soup-like consistency is slightly unsettling no matter how much you drink.", "price": 1400, "material": [ "alcohol", "water", "fruit" ], @@ -7692,7 +7729,8 @@ "phase": "liquid", "charges": 6, "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], - "fun": -12 + "fun": -12, + "freezing_point": -22 }, { "type": "COMESTIBLE", @@ -7716,6 +7754,7 @@ "phase": "liquid", "charges": 4, "flags": [ "EATEN_COLD" ], + "freezing_point": -49, "fun": 30 }, { @@ -7733,7 +7772,7 @@ "quench": -20, "healthy": -10, "addiction_potential": 5, - "nutrition": 10, + "calories": 87, "description": "A frothing slurry of alcohol-soaked zombie flesh and rotten blood, it smells almost as bad as it looks. Has weak mutagenic properties.", "price": 6500, "material": [ "alcohol", "flesh" ], @@ -7741,6 +7780,7 @@ "phase": "liquid", "charges": 2, "flags": [ "EDIBLE_FROZEN" ], + "freezing_point": -22, "fun": -40 }, { @@ -7754,7 +7794,7 @@ "container": "jar_3l_glass", "comestible_type": "DRINK", "symbol": "~", - "nutrition": 18, + "calories": 156, "description": "It's like strawberry jam, only without sugar.", "price": 50, "//": "Cheap for three liters of spread!", @@ -7775,7 +7815,7 @@ "container": "jar_3l_glass", "comestible_type": "DRINK", "symbol": "~", - "nutrition": 18, + "calories": 156, "description": "It's like blueberry jam, only without sugar.", "price": 50, "material": "fruit", @@ -7795,7 +7835,7 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 35, + "calories": 304, "description": "A sandwich of minced meat and cheese with condiments. The apex of pre-cataclysm culinary achievement.", "price": 1000, "material": [ "flesh", "wheat", "milk" ], @@ -7824,7 +7864,7 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 30, + "calories": 260, "description": "A sandwich of minced meat with condiments.", "price": 900, "material": [ "flesh", "wheat" ], @@ -7853,7 +7893,7 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 31, + "calories": 269, "description": "A sandwich, consisting of ground meat and tomato sauce served on a hamburger bun.", "price": 900, "material": [ "flesh", "tomato", "wheat" ], @@ -7883,7 +7923,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -5, - "nutrition": 15, + "calories": 130, "description": "A traditional Mexican dish composed of a corn tortilla folded or rolled around a meat filling.", "price": 210, "material": "flesh", @@ -7912,7 +7952,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "nutrition": 33, + "calories": 286, "description": "A bacon, lettuce, and tomato sandwich on toasted bread.", "price": 400, "material": [ "flesh", "veggy", "wheat", "tomato" ], @@ -7934,7 +7974,7 @@ "container": "bag_plastic", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 30, + "calories": 260, "description": "A block of yellow processed cheese.", "price": 900, "material": "milk", @@ -7954,7 +7994,7 @@ "container": "can_food", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 20, + "calories": 174, "description": "Processed cheese spread.", "price": 650, "material": [ "milk", "junk" ], @@ -7975,7 +8015,7 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 8, - "nutrition": 4, + "calories": 35, "description": "Milk that has been curdled with vinegar and rennet. It still needs to be salted and drained of whey.", "price": 10, "material": "milk", @@ -7996,7 +8036,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -5, - "nutrition": 30, + "calories": 260, "description": "Hard, dry cheese made to last, unlike modern processed cheese. Will make you thirsty though.", "price": 900, "material": "milk", @@ -8020,7 +8060,8 @@ "volume": 1, "phase": "liquid", "charges": 2, - "fun": -4 + "fun": -4, + "freezing_point": 28 }, { "type": "COMESTIBLE", @@ -8033,14 +8074,15 @@ "comestible_type": "DRINK", "symbol": "~", "quench": -1, - "nutrition": 1, + "calories": 9, "description": "Thin yellow vegetable oil used for cooking.", "price": 40, "material": "oil", "volume": 1, "charges": 2, "phase": "liquid", - "fun": -4 + "fun": -4, + "freezing_point": 14 }, { "type": "COMESTIBLE", @@ -8054,7 +8096,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 35, + "calories": 304, "description": "This is a serving of crisply brined and canned vegetable matter. Tasty and nutritious.", "price": 250, "material": "veggy", @@ -8073,7 +8115,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 45, + "calories": 391, "description": "This is a serving of crisply brined and canned meat. Tasty and nutritious.", "price": 250, "material": "flesh", @@ -8104,14 +8146,15 @@ "symbol": "%", "quench": -1, "addiction_potential": 2, - "nutrition": 1, + "calories": 9, "description": "Roasted coffee beans coated with dark chocolate, natural source of concentrated caffeine.", "price": 300, "material": [ "veggy", "junk" ], "volume": 0, "charges": 5, "stack_size": 30, - "fun": 2 + "fun": 2, + "flags": [ "EDIBLE_FROZEN" ] }, { "type": "COMESTIBLE", @@ -8125,11 +8168,12 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 15, + "calories": 130, "description": "So-called ramen noodles. Can be eaten raw.", "price": 200, "material": "wheat", - "volume": 1 + "volume": 1, + "flags": [ "EDIBLE_FROZEN" ] }, { "type": "COMESTIBLE", @@ -8142,13 +8186,13 @@ "symbol": "%", "quench": 7, "healthy": 3, - "nutrition": 13, + "calories": 113, "description": "A juicy, bell-shaped pear. Yum!", "price": 160, "material": "fruit", "volume": 1, "fun": 4, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -8162,12 +8206,12 @@ "symbol": "%", "quench": 18, "healthy": 5, - "nutrition": 35, + "calories": 304, "description": "A citrus fruit, whose taste ranges from sour to semi-sweet.", "price": 180, "material": "fruit", "volume": 1, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "fun": 2 }, { @@ -8178,6 +8222,7 @@ "description": "An irradiated grapefruit will remain edible nearly forever. Sterilized using radiation, so it's safe to eat.", "proportional": { "price": 2 }, "spoils_in": 0, + "flags": [ "FREEZERBURN" ], "container": "bag_plastic" }, { @@ -8188,6 +8233,7 @@ "description": "An irradiated pear will remain edible nearly forever. Sterilized using radiation, so it's safe to eat.", "proportional": { "price": 2 }, "spoils_in": 0, + "flags": [ "FREEZERBURN" ], "container": "bag_plastic" }, { @@ -8242,7 +8288,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 14, + "calories": 122, "description": "A red, sweet fruit that grows in trees.", "price": 110, "material": "fruit", @@ -8272,7 +8318,7 @@ "symbol": "%", "quench": 4, "healthy": 2, - "nutrition": 19, + "calories": 165, "description": "A handful of large, purple plums. Healthy and good for your digestion.", "price": 200, "material": "fruit", @@ -8302,14 +8348,14 @@ "symbol": "%", "quench": 5, "healthy": 2, - "nutrition": 18, + "calories": 156, "description": "A cluster of juicy grapes.", "price": 150, "material": "fruit", "volume": 1, "charges": 2, "fun": 4, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -8334,7 +8380,7 @@ "symbol": "%", "quench": 9, "healthy": 3, - "nutrition": 22, + "calories": 191, "description": "A large, spiky pineapple. A bit sour, though.", "price": 450, "material": "fruit", @@ -8354,7 +8400,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 2, - "nutrition": 10, + "calories": 87, "description": "A fruit with a hard and hairy shell.", "price": 500, "material": "fruit", @@ -8374,7 +8420,7 @@ "symbol": "%", "quench": 4, "healthy": 1, - "nutrition": 14, + "calories": 122, "description": "This fruit's large pit is surrounded by its tasty flesh.", "price": 140, "material": "fruit", @@ -8394,7 +8440,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 6, - "nutrition": 12, + "calories": 104, "description": "Yellow cling peach slices packed in light syrup.", "price": 140, "material": "fruit", @@ -8436,7 +8482,7 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 8, + "calories": 69, "description": "A box of fast-food fried potatoes. Somehow, they're still edible.", "price": 120, "material": "junk", @@ -8458,7 +8504,7 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 6, + "calories": 52, "description": "Deep fried potatoes with a touch of salt. Crunchy and delicious.", "price": 120, "material": "junk", @@ -8480,7 +8526,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 12, + "calories": 104, "description": "A box of fast-food fried potatoes with delicious cheese smothered on top.", "price": 190, "material": [ "junk", "milk" ], @@ -8501,13 +8547,13 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -1, - "nutrition": 8, + "calories": 69, "description": "A box of fast-food fried onions. Crunchy and delicious.", "price": 400, "material": [ "veggy", "junk" ], "volume": 1, "charges": 3, - "flags": [ "EATEN_HOT", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_HOT", "EDIBLE_FROZEN", "FREEZERBURN" ], "fun": 6, "rot_spawn": "GROUP_CARRION" }, @@ -8522,7 +8568,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 1, + "calories": 9, "description": "Tangy yellow powder that smells strongly of lemons. Can be mixed with water to make lemonade.", "price": 10, "material": [ "powder", "fruit" ], @@ -8542,14 +8588,14 @@ "symbol": "%", "quench": 28, "healthy": 1, - "nutrition": 15, + "calories": 130, "description": "A fruit, bigger than your head. It is very juicy!", "price": 1000, "material": "fruit", "volume": 12, "charges": 8, "bashing": 2, - "flags": [ "EATEN_COLD", "NO_FREEZE" ], + "flags": [ "EATEN_COLD", "FREEZERBURN" ], "fun": 4, "rot_spawn": "GROUP_ROTTING_PLANT" }, @@ -8564,14 +8610,14 @@ "symbol": "%", "quench": 4, "healthy": 1, - "nutrition": 9, + "calories": 78, "description": "A large and very sweet fruit.", "price": 1000, "material": "fruit", "volume": 4, "charges": 8, "bashing": 1, - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "FREEZERBURN" ], "fun": 4, "rot_spawn": "GROUP_ROTTING_PLANT" }, @@ -8583,6 +8629,7 @@ "description": "An irradiated watermelon will remain edible nearly forever. Sterilized using radiation, so it's safe to eat.", "proportional": { "price": 2 }, "spoils_in": 0, + "flags": [ "EATEN_COLD", "FREEZERBURN" ], "container": "bag_plastic" }, { @@ -8593,6 +8640,7 @@ "description": "An irradiated melon will remain edible nearly forever. Sterilized using radiation, so it's safe to eat.", "proportional": { "price": 2 }, "spoils_in": 0, + "flags": [ "EATEN_COLD", "FREEZERBURN" ], "container": "bag_plastic" }, { @@ -8608,7 +8656,7 @@ "symbol": "%", "quench": -2, "healthy": -2, - "nutrition": 1, + "calories": 9, "description": "Crunchy sugar in chocolate capsules. Legal and stimmy.", "price": 100, "material": "junk", @@ -8629,7 +8677,7 @@ "symbol": "%", "quench": 3, "healthy": 5, - "nutrition": 15, + "calories": 130, "description": "A darker cousin of raspberry.", "price": 400, "material": "fruit", @@ -8658,7 +8706,7 @@ "container": "jar_3l_glass", "comestible_type": "DRINK", "symbol": "~", - "nutrition": 18, + "calories": 156, "description": "It's like fruit jam, only without sugar.", "price": 50, "material": "fruit", @@ -8677,7 +8725,7 @@ "container": "jar_3l_glass_sealed", "comestible_type": "DRINK", "symbol": "~", - "nutrition": 10, + "calories": 87, "description": "Fresh fruit, cooked with sugar to make them last longer.", "price": 80, "material": "fruit", @@ -8700,7 +8748,7 @@ "symbol": "~", "quench": -2, "healthy": 1, - "nutrition": 6, + "calories": 52, "description": "An extremely sugary tar-like syrup, with a slightly bitter aftertaste.", "price": 200, "material": "junk", @@ -8708,7 +8756,8 @@ "phase": "liquid", "charges": 4, "fun": 2, - "flags": [ "USE_EAT_VERB" ] + "flags": [ "USE_EAT_VERB" ], + "freezing_point": -20 }, { "type": "COMESTIBLE", @@ -8722,7 +8771,7 @@ "symbol": "~", "quench": 20, "healthy": 2, - "nutrition": 4, + "calories": 35, "description": "Freshly-squeezed from real fruit! Tasty and nutritious.", "price": 80, "material": "fruit", @@ -8743,7 +8792,7 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 12, + "calories": 104, "description": "A fleshy fruit with large pit.", "price": 180, "material": "fruit", @@ -8762,7 +8811,7 @@ "symbol": "%", "quench": 12, "healthy": 2, - "nutrition": 27, + "calories": 234, "description": "Under this pomegranate's spongy skin lies hundreds of fleshy seeds.", "price": 190, "material": "fruit", @@ -8781,7 +8830,7 @@ "symbol": "%", "quench": 3, "healthy": 3, - "nutrition": 8, + "calories": 69, "description": "Sour stems of the rhubarb plant, often used in baking pies.", "price": 410, "material": "veggy", @@ -8832,7 +8881,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": -2, - "nutrition": 1, + "calories": 9, "description": "A big bag of soft chocolate-covered peppermint patties... yum!", "price": 130, "material": "junk", @@ -8851,7 +8900,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -3, - "nutrition": 20, + "calories": 174, "description": "Dehydrated meat flakes. With proper storage, this dried food will remain edible for an incredibly long time.", "price": 900, "material": "flesh", @@ -8877,7 +8926,7 @@ "spoils_in": 24, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 22, + "calories": 191, "description": "Reconstituted meat flakes, which are much more enjoyable to eat now that they have been rehydrated.", "price": 900, "material": "flesh", @@ -8906,7 +8955,7 @@ "symbol": "%", "quench": -3, "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Dehydrated vegetable flakes. With proper storage, this dried food will remain edible for an incredibly long time.", "price": 900, "material": "veggy", @@ -8924,7 +8973,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 22, + "calories": 191, "description": "Reconstituted vegetable flakes, which are much more enjoyable to eat now that they have been rehydrated.", "price": 900, "material": "veggy", @@ -8945,7 +8994,7 @@ "symbol": "%", "quench": -2, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "Dehydrated fruit flakes. With proper storage, this dried food will remain edible for an incredibly long time. They are useful for several cooking recipes.", "price": 900, "material": "fruit", @@ -8966,7 +9015,7 @@ "symbol": "%", "quench": 1, "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "Reconstituted fruit flakes, which are much more enjoyable to eat now that they have been rehydrated.", "price": 900, "material": "fruit", @@ -8987,7 +9036,7 @@ "symbol": "%", "quench": 1, "healthy": 1, - "nutrition": 24, + "calories": 208, "description": "Delicious and tender organ meats. First boiled, then breaded and fried. They have interesting flavor and unparalleled texture.", "price": 500, "material": [ "wheat", "flesh" ], @@ -9010,7 +9059,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 48, + "calories": 417, "description": "This traditional Scottish savory pudding is made of meat and offal mixed with oatmeal, which is sewn into an animal's stomach and boiled. Surprisingly tasty and quite filling, it is best served with boiled root vegetables and strong whisky.", "//": "That's whisky without an 'e' because we're talking about Scotch whisky.", "price": 750, @@ -9042,7 +9091,7 @@ "symbol": "~", "quench": 8, "healthy": 1, - "nutrition": 40, + "calories": 347, "description": "A rich and tasty fish chowder from Scotland, made with preserved fish and creamy milk.", "price": 500, "material": [ "flesh", "milk" ], @@ -9063,7 +9112,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -1, - "nutrition": 14, + "calories": 122, "description": "This traditional Scottish treat is a sweet and filling little boiled cake studded with dried fruit.", "price": 195, "material": [ "wheat", "fruit" ], @@ -9086,7 +9135,7 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 2, + "calories": 17, "description": "A handful of candy wafers, in assorted flavors: orange, lemon, lime, clove, chocolate, wintergreen, cinnamon, and licorice. Yum!", "price": 100, "material": "junk", @@ -9106,7 +9155,7 @@ "symbol": "%", "quench": 8, "healthy": 2, - "nutrition": 21, + "calories": 182, "description": "A very sweet and soft tropical fruit.", "price": 250, "material": "fruit", @@ -9125,7 +9174,7 @@ "symbol": "%", "quench": 3, "healthy": 2, - "nutrition": 11, + "calories": 95, "description": "A large, brown and fuzzy-skinned berry. Its delicious insides are green.", "price": 250, "material": "fruit", @@ -9144,7 +9193,7 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 16, + "calories": 139, "description": "A smooth-skinned fruit, related to the peach.", "price": 140, "material": "fruit", @@ -9198,13 +9247,14 @@ "quench": -12, "healthy": -2, "addiction_potential": 5, - "nutrition": 4, + "calories": 35, "description": "Only the finest whiskey straight from the bung.", "price": 300, "price_note": "Priced by the 100 liter barrel, this is multiplied by 400 to achieve the final cost.", "material": "alcohol", "volume": 1, - "flags": [ "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "phase": "liquid", "charges": 7, "fun": 17 @@ -9220,7 +9270,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 30, + "calories": 260, "description": "Filling bread buns, taste good with tea on a Sunday morning breakfast.", "price": 550, "material": "wheat", @@ -9243,7 +9293,7 @@ "symbol": "%", "quench": -1, "healthy": -1, - "nutrition": 2, + "calories": 17, "description": "Candy sticks. Slightly more healthy than tobacco cigarettes, but with no possibility of addiction.", "price": 130, "material": "junk", @@ -9264,12 +9314,13 @@ "symbol": "%", "quench": 15, "healthy": 2, - "nutrition": 45, + "calories": 391, "description": "Salad with all kind of vegetables.", "price": 350, "material": "veggy", "volume": 1, "fun": 1, + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -9283,7 +9334,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -2, - "nutrition": 40, + "calories": 347, "description": "Dried salad packed in a box with mayonnaise and ketchup. Add water to enjoy.", "price": 220, "material": "veggy", @@ -9302,7 +9353,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 16, - "nutrition": 40, + "calories": 347, "description": "Dried salad with water added, not very tasty but still a decent substitution for real salad.", "price": 250, "material": "veggy", @@ -9320,12 +9371,12 @@ "symbol": "%", "quench": 7, "healthy": 1, - "nutrition": 11, + "calories": 95, "description": "Come from the gourd family, not tasty but very juicy.", "price": 300, "material": "veggy", "volume": 1, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -9339,10 +9390,11 @@ "symbol": "%", "quench": 7, "healthy": 1, - "nutrition": 11, + "calories": 95, "description": "An irradiated cucumber will remain edible nearly forever. Sterilized using radiation, so it's safe to eat.", "price": 320, "material": "veggy", + "flags": [ "FREEZERBURN" ], "volume": 1 }, { @@ -9355,12 +9407,12 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 3, - "nutrition": 5, + "calories": 43, "description": "Neither tasty nor very nutritious, but it goes well with salad.", "price": 200, "material": "veggy", "volume": 1, - "flags": [ "NO_FREEZE", "SMOKABLE" ], + "flags": [ "FREEZERBURN", "SMOKABLE" ], "rot_spawn": "GROUP_ROTTING_PLANT" }, { @@ -9372,7 +9424,7 @@ "spoils_in": 720, "comestible_type": "FOOD", "symbol": "%", - "nutrition": 10, + "calories": 87, "description": "The starchy root of a dahlia flower. When cooked, it is delicious.", "price": 100, "material": "veggy", @@ -9389,7 +9441,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 2, - "nutrition": 28, + "calories": 243, "description": "A healthy and delicious baked root bulb from a dahlia plant.", "price": 110, "material": "veggy", @@ -9408,7 +9460,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 3, - "nutrition": 5, + "calories": 43, "description": "An irradiated cluster of celery will remain edible nearly forever. Sterilized using radiation, so it's safe to eat.", "price": 220, "material": "veggy", @@ -9431,6 +9483,7 @@ "charges": 10, "healthy": -1, "fun": -15, + "freezing_point": -22, "phase": "liquid" }, { @@ -9448,7 +9501,7 @@ "comestible_type": "FOOD", "container": "jar_glass", "quench": -10, - "nutrition": 2, + "calories": 17, "charges": 25, "healthy": 1, "fun": -20, @@ -9467,7 +9520,7 @@ "symbol": "%", "quench": -1, "healthy": 1, - "nutrition": 36, + "calories": 313, "description": "A serving of sticky vinegared rice commonly used in sushi.", "price": 100, "material": "veggy", @@ -9488,7 +9541,7 @@ "symbol": "%", "quench": 1, "healthy": 3, - "nutrition": 28, + "calories": 243, "description": "A triangular block of tasty sushi rice with a healthy green vegetable folded around it.", "price": 210, "material": "veggy", @@ -9509,7 +9562,7 @@ "symbol": "%", "quench": 1, "healthy": 3, - "nutrition": 30, + "calories": 260, "description": "Delicious chopped vegetables wrapped in tasty sushi rice and rolled up in a healthy green vegetable.", "price": 290, "material": "veggy", @@ -9529,7 +9582,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 2, - "nutrition": 36, + "calories": 313, "description": "Delicious slivers of thinly sliced raw fish wrapped in tasty sushi rice and rolled up in a healthy green vegetable.", "price": 350, "material": [ "veggy", "flesh" ], @@ -9549,7 +9602,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 40, + "calories": 347, "description": "Delicious slivers of raw meat wrapped in tasty sushi rice and rolled up in a healthy green vegetable.", "price": 370, "material": [ "veggy", "flesh" ], @@ -9569,7 +9622,7 @@ "comestible_type": "FOOD", "symbol": "%", "healthy": 1, - "nutrition": 31, + "calories": 269, "description": "Delicious slivers of thinly sliced raw fish and tasty vegetables.", "price": 600, "material": [ "veggy", "flesh" ], @@ -9590,12 +9643,13 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 38, - "nutrition": 2, + "calories": 17, "description": "Water with sugar or honey added. Tastes okay.", "price": 95, "volume": 1, "phase": "liquid", - "fun": 2 + "fun": 2, + "freezing_point": 22 }, { "type": "COMESTIBLE", @@ -9610,7 +9664,7 @@ "symbol": "%", "quench": -2, "healthy": -2, - "nutrition": 3, + "calories": 26, "description": "Some caramel. Still bad for your health.", "price": 150, "material": "junk", @@ -9629,7 +9683,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": -3, - "nutrition": 20, + "calories": 174, "description": "Pieces of poisonous meat that have been dried to prevent them from rotting away. It will still poison you if you eat this.", "price": 0, "material": "flesh", @@ -9652,7 +9706,7 @@ "symbol": "%", "quench": -3, "healthy": 1, - "nutrition": 20, + "calories": 174, "description": "Pieces of poisonous veggy that have been dried to prevent them from rotting away. It will still poison you if you eat this.", "price": 0, "material": "veggy", @@ -9672,7 +9726,7 @@ "symbol": ",", "quench": -2, "healthy": -1, - "nutrition": 6, + "calories": 52, "description": "A carefully folded raw skin harvested from an animal. You can cure it for storage and tanning, or eat it if you're desperate enough.", "price": 50, "material": "flesh", @@ -9695,7 +9749,7 @@ "symbol": ",", "quench": -2, "healthy": -1, - "nutrition": 6, + "calories": 52, "description": "A carefully folded poisonous raw skin harvested from an unnatural creature. You can cure it for storage and tanning.", "price": 0, "material": "flesh", @@ -9724,7 +9778,7 @@ "symbol": ",", "quench": -20, "healthy": -5, - "nutrition": 6, + "calories": 52, "description": "A carefully folded raw skin harvested from a fur-bearing animal. It still has the fur attached. You can cure it for storage and tanning, or eat it if you're desperate enough.", "price": 50, "material": [ "fur", "flesh" ], @@ -9747,7 +9801,7 @@ "symbol": ",", "quench": -20, "healthy": -5, - "nutrition": 6, + "calories": 52, "description": "A carefully folded raw skin harvested from a fur-bearing unnatural creature. It still has the fur attached and is poisonous. You can cure it for storage and tanning.", "price": 0, "material": [ "fur", "flesh" ], @@ -9770,7 +9824,7 @@ "symbol": "%", "quench": 3, "healthy": 1, - "nutrition": 18, + "calories": 156, "description": "Canned tomato. A staple in many pantries, and useful for many recipes.", "price": 350, "material": "tomato", @@ -9792,7 +9846,7 @@ "quench": 25, "healthy": -10, "addiction_potential": 5, - "nutrition": 3, + "calories": 26, "description": "A thirsty mutant's drink of choice. It tastes horrible but it's probably a lot safer to drink than before.", "price": 1000, "material": [ "alcohol", "junk" ], @@ -9801,6 +9855,7 @@ "charges": 2, "use_action": { "type": "mutagen", "is_weak": true }, "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": -15 }, { @@ -9818,13 +9873,14 @@ "quench": 25, "healthy": -2, "addiction_potential": 5, - "nutrition": 6, + "calories": 52, "description": "This definitely tastes like a hobo drink.", "price": 900, "material": [ "alcohol", "junk" ], "volume": 2, "phase": "liquid", - "flags": [ "EATEN_COLD", "EDIBLE_FROZEN" ], + "flags": [ "EATEN_COLD" ], + "freezing_point": -27, "fun": 20 }, { @@ -9842,7 +9898,7 @@ "quench": 25, "healthy": -1, "addiction_potential": 5, - "nutrition": 4, + "calories": 35, "description": "Not as bad as some might imagine, this drink is pretty popular among young and/or poor people in some countries.", "price": 800, "material": [ "alcohol", "junk" ], @@ -9850,6 +9906,7 @@ "phase": "liquid", "charges": 2, "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 20 }, { @@ -9866,13 +9923,14 @@ "symbol": "~", "quench": 25, "addiction_potential": 4, - "nutrition": 7, + "calories": 61, "description": "This cocktail dates from the Prohibition era. Gin, honey and lemon in a delightful mix.", "price": 850, "material": [ "alcohol", "honey" ], "volume": 2, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 20 }, { @@ -9890,7 +9948,7 @@ "quench": 25, "healthy": -1, "addiction_potential": 4, - "nutrition": 6, + "calories": 52, "description": "A mixed drink made of whiskey and lemon juice.", "price": 800, "//": "Since includes non-alcohol lemonade, 250mL is the serving size, so priced as such.", @@ -9898,6 +9956,7 @@ "volume": 2, "phase": "liquid", "flags": [ "EATEN_COLD" ], + "freezing_point": -22, "fun": 20 }, { @@ -9915,7 +9974,7 @@ "symbol": "~", "quench": 40, "addiction_potential": 2, - "nutrition": 8, + "calories": 69, "description": "Coffee milk is pretty much the official morning drink among many countries.", "price": 480, "material": [ "milk", "water" ], @@ -9938,7 +9997,7 @@ "symbol": "~", "quench": 40, "healthy": 1, - "nutrition": 8, + "calories": 69, "description": "Usually consumed in the mornings, milk tea is common among many countries.", "price": 450, "material": [ "milk", "water" ], @@ -9962,7 +10021,7 @@ "symbol": "~", "quench": 40, "healthy": 1, - "nutrition": 8, + "calories": 69, "description": "A traditional south Asian mixed-spice tea with milk.", "price": 475, "material": [ "milk", "water" ], @@ -10003,7 +10062,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 1, - "nutrition": 70, + "calories": 608, "description": "A delicious grilled cheese sandwich, because everything is better with melted cheese.", "price": 550, "material": [ "milk", "wheat" ], @@ -10035,7 +10094,7 @@ "symbol": "%", "quench": 1, "healthy": 1, - "nutrition": 38, + "calories": 330, "description": "A sandwich of meat, vegetables, and cheese with condiments. Tasty and nutritious!", "price": 1200, "material": [ "flesh", "veggy", "wheat", "milk" ], @@ -10057,7 +10116,7 @@ "symbol": "%", "quench": 2, "healthy": 1, - "nutrition": 26, + "calories": 226, "description": "A refreshing cucumber sandwich. Not very filling, but quite tasty.", "price": 200, "volume": 1, @@ -10079,7 +10138,7 @@ "container": "wrapper", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 65, + "calories": 564, "description": "A simple cheese sandwich.", "price": 500, "material": [ "milk", "wheat" ], @@ -10099,7 +10158,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 1, - "nutrition": 50, + "calories": 434, "description": "A delicious jam sandwich.", "price": 200, "material": [ "fruit", "wheat" ], @@ -10120,7 +10179,7 @@ "symbol": "%", "quench": 1, "healthy": 1, - "nutrition": 50, + "calories": 434, "description": "A delicious honey sandwich.", "price": 500, "material": [ "honey", "wheat" ], @@ -10140,7 +10199,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 1, - "nutrition": 48, + "calories": 417, "description": "A simple sauce sandwich. Not very filling but beats eating just the bread.", "price": 200, "material": "wheat", @@ -10159,7 +10218,7 @@ "symbol": "%", "quench": -3, "healthy": -1, - "nutrition": 17, + "calories": 148, "description": "Flour is a commodity these days and to deal with that, most survivors resort to mix it with leftovers of other ingredients and bake it all into bread. It's filling, and that's what matters.", "price": 2000, "material": [ "junk", "wheat" ], @@ -10184,7 +10243,7 @@ "symbol": "~", "quench": 20, "healthy": 2, - "nutrition": 40, + "calories": 347, "description": "A mixed drink containing all the advantages of its ingredients and none of their disadvantages. It tastes great and it's a good source of nourishment.", "price": 350, "material": [ "alcohol", "honey" ], @@ -10208,7 +10267,7 @@ "quench": 8, "healthy": 1, "addiction_potential": 1, - "nutrition": 15, + "calories": 130, "description": "Droplet shaped ant food. It's like a thick balloon the size of a baseball, filled with sticky liquid. Unlike bee honey, this has mostly a sour taste, probably because ants feed upon a variety of things.", "price": 1000, "material": [ "junk", "honey" ], @@ -10226,7 +10285,7 @@ "container": "can_food", "comestible_type": "FOOD", "symbol": "%", - "nutrition": 48, + "calories": 417, "description": "Delicious cooked dumplings consisting of a meat filling wrapped in thin dough.", "price": 350, "material": [ "flesh", "wheat" ], @@ -10242,7 +10301,7 @@ "name": "thyme", "description": "A stalk of thyme. Smells delicious.", "comestible_type": "FOOD", - "nutrition": 1, + "calories": 9, "fun": -4, "weight": 40, "to_hit": -3, @@ -10258,7 +10317,7 @@ "name": "canola", "description": "A pretty stalk of canola. Its seeds can be pressed into oil.", "comestible_type": "FOOD", - "nutrition": 1, + "calories": 9, "fun": -8, "weight": 40, "to_hit": -3, @@ -10275,7 +10334,7 @@ "description": "A stalk of dogbane. It has very fibrous stems and is mildly poisonous.", "comestible_type": "FOOD", "use_action": "BLECH", - "nutrition": 1, + "calories": 9, "fun": -15, "healthy": -2, "weight": 40, @@ -10292,7 +10351,7 @@ "name": "bee balm", "description": "A snow-white flower also known as wild bergamot. Smells faintly of mint.", "comestible_type": "FOOD", - "nutrition": 1, + "calories": 9, "fun": -5, "weight": 40, "to_hit": -3, @@ -10317,7 +10376,7 @@ "symbol": "~", "quench": 34, "healthy": 1, - "nutrition": 2, + "calories": 17, "description": "A healthy beverage made from bee balm steeped in boiling water. Can be used to reduce negative effects of common cold or flu.", "price": 100, "volume": 1, @@ -10333,7 +10392,7 @@ "description": "A stalk of mugwort. Smells wonderful.", "comestible_type": "FOOD", "spoils_in": 240, - "nutrition": 1, + "calories": 9, "fun": -8, "weight": 40, "to_hit": -3, @@ -10354,14 +10413,14 @@ "comestible_type": "DRINK", "symbol": "~", "quench": 25, - "nutrition": 45, + "calories": 391, "description": "Smooth and rich, this spoon-coating mix of milk, cream, and eggs is a popular traditional holiday drink. While often spiked, it is still delicious on its own. Meant to be stored cold, it will spoil rapidly.", "price": 40, "material": [ "milk", "egg" ], "volume": 1, "phase": "liquid", "charges": 2, - "flags": [ "EATEN_COLD" ], + "flags": [ "EATEN_COLD", "FREEZERBURN" ], "fun": 15 }, { @@ -10379,7 +10438,7 @@ "quench": 25, "healthy": -1, "addiction_potential": 5, - "nutrition": 45, + "calories": 391, "description": "Smooth and rich, this spoon-coating mixture of milk, cream, eggs, and booze is a popular traditional holiday drink. Having been fortified with alcohol, it will keep for a long time.", "price": 45, "//": "A 12-charge gallon currently goes for around US$4, and eggnog is a bit more expensive than that.", @@ -10387,8 +10446,9 @@ "volume": 1, "phase": "liquid", "charges": 2, - "flags": [ "EATEN_COLD" ], - "fun": 20 + "flags": [ "EATEN_COLD", "FREEZERBURN" ], + "fun": 20, + "freezing_point": 12 }, { "id": "hot_chocolate", @@ -10406,7 +10466,7 @@ "symbol": "~", "color": "brown", "comestible_type": "DRINK", - "nutrition": 9, + "calories": 78, "quench": 35, "fun": 8, "spoils_in": 24, @@ -10428,7 +10488,7 @@ "symbol": "~", "color": "brown", "comestible_type": "DRINK", - "nutrition": 9, + "calories": 78, "quench": 35, "fun": 10, "spoils_in": 24, @@ -10476,7 +10536,7 @@ "material": "wheat", "symbol": "%", "color": "brown", - "nutrition": 20, + "calories": 174, "fun": 15, "spoils_in": 420, "use_action": "WEED_BROWNIE", @@ -10491,7 +10551,7 @@ "color": "black_red", "symbol": "%", "healthy": -10, - "nutrition": 40, + "calories": 347, "quench": 20, "description": "A thick, hulking mass of flesh superficially resembling a mammalian heart, covered in ribbed grooves and easily the size of your head. It's still full of, er, whatever passes for blood in jabberwocks, and is heavy in your hands. After everything you've seen lately, you can't help but remember old sayings about eating the hearts of your enemies...", "price": 6500, @@ -10509,7 +10569,7 @@ "color": "black_red", "symbol": "%", "healthy": -5, - "nutrition": 25, + "calories": 217, "description": "A huge strip of muscle - all that remains of a putrid heart that has been sliced open and drained of blood. It could be eaten if you're hungry, but looks *disgusting*.", "price": 1000, "material": [ "flesh" ], diff --git a/data/json/items/comestibles/brewing.json b/data/json/items/comestibles/brewing.json index 8d429a3722cec..0fec6d6cba89a 100644 --- a/data/json/items/comestibles/brewing.json +++ b/data/json/items/comestibles/brewing.json @@ -9,7 +9,7 @@ "container" : "bottle_glass", "flags" : "TRADER_AVOID", "symbol" : "~", - "nutrition" : 2, + "calories" : 17, "quench" : 4, "fun" : -15, "price" : 0, @@ -36,7 +36,7 @@ "stim" : -2, "container" : "jug_plastic", "symbol" : "~", - "nutrition" : 1, + "calories" : 9, "quench" : 2, "healthy" : -2, "fun" : 2, @@ -55,7 +55,7 @@ "color" : "light_cyan", "container" : "bottle_glass", "symbol" : "~", - "nutrition" : 2, + "calories" : 17, "quench" : 4, "fun" : -5, "price" : 0, @@ -82,7 +82,7 @@ "stim" : -2, "container" : "jug_plastic", "symbol" : "~", - "nutrition" : 1, + "calories" : 9, "quench" : 2, "healthy" : -2, "fun" : 2, @@ -102,7 +102,7 @@ "container" : "bottle_glass", "flags" : "TRADER_AVOID", "symbol" : "~", - "nutrition" : 2, + "calories" : 17, "quench" : 4, "fun" : -5, "price" : 0, @@ -129,7 +129,7 @@ "stim" : -2, "container" : "jug_plastic", "symbol" : "~", - "nutrition" : 1, + "calories" : 9, "quench" : 2, "healthy" : -2, "fun" : 2, @@ -149,7 +149,7 @@ "container" : "bottle_glass", "flags" : "TRADER_AVOID", "symbol" : "~", - "nutrition" : 2, + "calories" : 17, "quench" : 6, "fun" : -5, "price" : 0, @@ -173,7 +173,7 @@ "container" : "bottle_glass", "flags" : "TRADER_AVOID", "symbol" : "~", - "nutrition" : 4, + "calories" : 35, "quench" : 6, "fun" : -15, "price" : 0, @@ -196,7 +196,7 @@ "color" : "yellow", "container" : "bottle_glass", "symbol" : "~", - "nutrition" : 4, + "calories" : 35, "quench" : 6, "fun" : -15, "price" : 0, @@ -218,7 +218,7 @@ "color" : "green", "container" : "bottle_glass", "symbol" : "~", - "nutrition" : 4, + "calories" : 35, "quench" : 6, "fun" : -20, "price" : 0, @@ -241,7 +241,7 @@ "container" : "jug_plastic", "flags" : "TRADER_AVOID", "symbol" : "~", - "nutrition" : 4, + "calories" : 35, "quench" : 4, "fun" : -20, "price" : 0, @@ -264,7 +264,7 @@ "container" : "jug_plastic", "flags" : "TRADER_AVOID", "symbol" : "~", - "nutrition" : 12, + "calories" : 104, "quench" : 2, "fun" : -5, "material" : [ "water", "junk" ], @@ -291,7 +291,7 @@ "stim" : -3, "container" : "jug_plastic", "symbol" : "~", - "nutrition" : 1, + "calories" : 9, "quench" : -2, "healthy" : -10, "fun" : -20, @@ -312,7 +312,7 @@ "comestible_type" : "DRINK", "symbol" : "~", "quench" : 8, - "nutrition" : 4, + "calories" : 35, "description" : "Milk with vinegar and natural rennet added. Used for making cheese if left in a fermenting vat for some time.", "price" : 10, "material" : "milk", @@ -333,7 +333,7 @@ "color" : "yellow", "container" : "jug_plastic", "symbol" : "~", - "nutrition" : 4, + "calories" : 35, "quench" : 6, "fun" : -15, "price" : 0, diff --git a/data/json/items/comestibles/carnivore.json b/data/json/items/comestibles/carnivore.json index f54cd87204fdf..d264b24045b9d 100644 --- a/data/json/items/comestibles/carnivore.json +++ b/data/json/items/comestibles/carnivore.json @@ -226,7 +226,7 @@ "type": "COMESTIBLE", "name": "jerk jerky", "name_plural": "jerk jerky", - "description": "Salty dried human flesh that never goes bad, but will make you thirsty.", + "description": "Salty dried human flesh that lasts for a long time, but will make you thirsty.", "weight": 56, "color": "brown", "spoils_in": 1008, diff --git a/data/json/items/comestibles/egg.json b/data/json/items/comestibles/egg.json index 70e003f07ea4a..28da68f3c8641 100644 --- a/data/json/items/comestibles/egg.json +++ b/data/json/items/comestibles/egg.json @@ -10,14 +10,14 @@ "symbol": "o", "quench": 4, "healthy": 1, - "nutrition": 13, + "calories": 113, "description": "Nutritious egg laid by a bird.", "price": 250, "material": "egg", "volume": 1, "stack_size": 4, "fun": -8, - "flags": [ "NO_FREEZE" ], + "flags": [ "FREEZERBURN" ], "rot_spawn": "GROUP_EGG_BIRD_WILD", "rot_spawn_chance": 50 }, @@ -89,7 +89,7 @@ "symbol": "o", "quench": 3, "healthy": 1, - "nutrition": 10, + "calories": 87, "description": "An egg belonging to one of reptile species found in New England.", "price": 250, "material": "egg", @@ -109,7 +109,7 @@ "symbol": "%", "spoils_in": 168, "quench": 10, - "nutrition": 200, + "calories": 1736, "description": "A large white ant egg, the size of a softball. Extremely nutritious, but incredibly gross.", "price": 80, "material": "egg", @@ -127,7 +127,7 @@ "comestible_type": "FOOD", "symbol": "%", "quench": 10, - "nutrition": 20, + "calories": 174, "description": "A fist-sized egg from a giant spider. Incredibly gross.", "price": 80, "material": "egg", @@ -145,7 +145,7 @@ "spoils_in": 112, "healthy": -1, "quench": 3, - "nutrition": 8, + "calories": 69, "description": "A fist-sized egg from a giant roach. Incredibly gross.", "price": 80, "material": "egg", @@ -172,7 +172,7 @@ "symbol": "o", "spoils_in": 112, "quench": 3, - "nutrition": 8, + "calories": 69, "description": "A fist-sized egg from a locust.", "price": 80, "material": "egg", @@ -191,7 +191,7 @@ "comestible_type": "FOOD", "symbol": "o", "quench": 10, - "nutrition": 40, + "calories": 347, "description": "A clump of razorclaw eggs. A post-cataclysm delicacy.", "price": 3000, "material": "flesh", @@ -209,7 +209,7 @@ "symbol": "o", "quench": 4, "healthy": 1, - "nutrition": 10, + "calories": 87, "description": "Common roe from an unknown fish.", "price": 50, "material": "egg", diff --git a/data/json/items/comestibles/frozen.json b/data/json/items/comestibles/frozen.json index 2a67da07f29e1..e5fc22b34381a 100644 --- a/data/json/items/comestibles/frozen.json +++ b/data/json/items/comestibles/frozen.json @@ -13,7 +13,7 @@ "symbol": "~", "color": "white", "spoils_in": 24, - "nutrition": 20, + "calories": 174, "quench": 30, "fun": 20, "health": -1, @@ -29,7 +29,7 @@ "name": "fast food milkshake", "name_plural": "fast food milkshakes", "description": "A milkshake made by freezing a premade mix. Tastes better due to how much sugar is in it, but is bad for your health.", - "nutrition": 18, + "calories": 156, "fun": 23, "health": -3, "price": 275 @@ -41,7 +41,7 @@ "name": "deluxe milkshake", "name_plural": "deluxe milkshakes", "description": "This milkshake has been enhanced with added sweeteners, and even has a cherry on top. Tastes great, but is fairly awful for your health.", - "nutrition": 25, + "calories": 217, "quench": 40, "fun": 25, "health": -6, @@ -61,7 +61,7 @@ "symbol": "~", "color": "white", "spoils_in": 24, - "nutrition": 15, + "calories": 130, "fun": 15, "healthy": -1, "price": 250, @@ -101,7 +101,7 @@ "name_plural": "fruity ice cream scoops", "description": "Small bits of sweet fruit have been tossed into this ice cream, making it slightly less terrible for you.", "healthy": 0, - "nutrition": 18, + "calories": 156, "fun": 17, "price": 300, "material": [ "milk", "fruit" ] @@ -114,7 +114,7 @@ "name_plural": "frozen custard scoops", "description": "Similar to ice cream, this treat made famous in Coney Island is made like ice cream, but with egg yolk added in. Its storing temperature is warmer, and it lasts a little longer than regular ice cream.", "spoils_in": 48, - "nutrition": 17, + "calories": 148, "price": 300, "material": [ "milk", "egg" ] }, @@ -125,7 +125,7 @@ "name": "frozen yogurt", "name_plural": "frozen yogurt", "description": "Tarter than ice cream, this is made with yogurt and other dairy products, and is generally low-fat compared to ice cream itself.", - "nutrition": 14, + "calories": 122, "price": 275, "material": [ "milk" ] }, @@ -137,7 +137,7 @@ "name_plural": "sorbet scoops", "description": "A simple frozen dessert food made from water and fruit juice.", "spoils_in": 336, - "nutrition": 12, + "calories": 104, "quench": 8, "fun": 10, "price": 175, @@ -150,7 +150,7 @@ "name": "gelato", "name_plural": "gelato scoops", "description": "Italian-style ice cream. Less airy, and more dense, giving it a richer flavor and texture.", - "nutrition": 20, + "calories": 174, "price": 300, "material": [ "milk" ] } diff --git a/data/json/items/comestibles/mutagen.json b/data/json/items/comestibles/mutagen.json index 6e05e012c7bbb..c459191691a85 100644 --- a/data/json/items/comestibles/mutagen.json +++ b/data/json/items/comestibles/mutagen.json @@ -15,7 +15,8 @@ "color" : "light_green", "healthy" : -2, "addiction_potential" : 2, - "addiction_type" : "mutagen" + "addiction_type" : "mutagen", + "freezing_point": 17 }, { "abstract" : "iv_mutagen_flavor", diff --git a/data/json/items/comestibles/seed.json b/data/json/items/comestibles/seed.json index 98b296e72806e..57f5f2a3313e0 100644 --- a/data/json/items/comestibles/seed.json +++ b/data/json/items/comestibles/seed.json @@ -268,7 +268,7 @@ "symbol": "%", "quench": -3, "healthy": 1, - "nutrition": 3, + "calories": 26, "description": "Cloves of garlic. Useful as a seasoning, or for planting.", "price": 50, "charges": 6, @@ -341,7 +341,7 @@ "use_action": "SEED", "quench": -1, "healthy": 1, - "nutrition": 2, + "calories": 17, "description": "Seeds of the cannabis plant. Filled with vitamins, they can be roasted or eaten raw.", "price": 100, "weight": 2, @@ -376,7 +376,7 @@ "quench": 5, "healthy": -10, "addiction_potential": 5, - "nutrition": 20, + "calories": 174, "description": "This looks like a sunflower seed the size of your palm. It has a strong but delicious aroma, but is clearly either mutated or of alien origin.", "price": 0, "material": "fruit", @@ -394,7 +394,7 @@ "weight": 210, "symbol": "%", "healthy": -2, - "nutrition": 14, + "calories": 122, "description": "Raw, uncooked beans. They are mildly toxic in this form, but you could cook them to make them tasty. Alternatively, you could plant them.", "price": 90, "fun": -1, @@ -433,7 +433,7 @@ "weight": 2, "color": "green", "use_action": "SEED", - "nutrition": 2, + "calories": 17, "description": "Some raw pumpkin seeds. Could be fried and eaten or planted.", "price": 100, "charges": 2, @@ -448,7 +448,7 @@ "weight": 2, "color": "green", "use_action": "SEED", - "nutrition": 2, + "calories": 17, "description": "Some raw sunflower seeds. Could be pressed into oil.", "price": 100, "charges": 2, diff --git a/data/json/items/containers.json b/data/json/items/containers.json index a404eb137c7df..6b3742b075d64 100644 --- a/data/json/items/containers.json +++ b/data/json/items/containers.json @@ -394,6 +394,24 @@ }, "flags": [ "WAIST", "OVERSIZE", "WATER_FRIENDLY" ] }, + { + "id": "thermos", + "type": "CONTAINER", + "category": "other", + "name": "thermos", + "name_plural": "thermoses", + "description": "A Thermos brand vacuum flask. Built for temperature retention, helps keep things hot or cold. Contains 1L of liquid.", + "weight": 530, + "price": 1595, + "volume": 5, + "contains": 4, + "material": "steel", + "symbol": "I", + "color": "green", + "seals": true, + "watertight": true, + "insulation": 10 + }, { "id": "ceramic_bowl", "type": "CONTAINER", @@ -945,21 +963,6 @@ "contains": 10, "flags": [ "TRADER_AVOID" ] }, - { - "id": "basket_laundry", - "type": "CONTAINER", - "category": "other", - "name": "laundry basket", - "name_plural": "laundry baskets", - "description": "A pastic basket meant for storing and hauling clothing.", - "weight": 410, - "volume": 140, - "price": 100, - "material": "plastic", - "symbol": ")", - "color": "light_gray", - "contains": 190 - }, { "id": "styrofoam_cup", "type": "CONTAINER", diff --git a/data/json/items/generic.json b/data/json/items/generic.json index 0a6766ee865a5..431d854c65673 100644 --- a/data/json/items/generic.json +++ b/data/json/items/generic.json @@ -929,8 +929,8 @@ "price": 18000, "price_postapoc": 1000, "material": [ "aluminum", "plastic" ], - "weight": 12670, - "volume": 3, + "weight": 25000, + "volume": 75, "bashing": 6, "cutting": 6, "to_hit": -3, @@ -1867,7 +1867,7 @@ "description": "A tulip stalk with some petals.", "weight": 40, "to_hit": -3, - "color": "light_magenta", + "color": "magenta", "symbol": ",", "material": [ "veggy" ], "volume": 1, @@ -1880,7 +1880,7 @@ "description": "A tulip bud. Contains some substances commonly produced by a tulip flower.", "weight": 30, "to_hit": -3, - "color": "light_magenta", + "color": "magenta", "symbol": ",", "material": [ "veggy" ], "volume": 1, diff --git a/data/json/items/melee.json b/data/json/items/melee.json index 316029c79b4f6..61c7eed10b75e 100644 --- a/data/json/items/melee.json +++ b/data/json/items/melee.json @@ -83,6 +83,42 @@ "to_hit": 1, "category": "weapons" }, + { + "id": "bokken_fake", + "type": "GENERIC", + "symbol": "/", + "color": "brown", + "looks_like": "bokken", + "name": "bokken", + "description": "This is a solid wood 'training' katana, but feels far too light to make an effective weapon.", + "price": 12500, + "material": "wood", + "techniques": [ "RAPID", "WBLOCK_2", "SWEEP" ], + "flags": [ "SHEATH_SWORD" ], + "weight": 680, + "volume": 8, + "bashing": 10, + "cutting": 1, + "category": "weapons" + }, + { + "id": "bokken_inferior", + "type": "GENERIC", + "symbol": "/", + "color": "brown", + "looks_like": "bokken", + "name": "bokken", + "description": "This is a solid wood 'training' katana, but it looks to be mass produced, and not quite as effective as the real deal.", + "price": 12500, + "material": "wood", + "techniques": [ "RAPID", "WBLOCK_2", "SWEEP" ], + "flags": [ "SHEATH_SWORD" ], + "weight": 1133, + "volume": 8, + "bashing": 18, + "cutting": 1, + "category": "weapons" + }, { "type": "GENERIC", "id": "cudgel", @@ -1703,8 +1739,28 @@ "techniques": [ "WBLOCK_1", "RAPID", "WIDE" ], "weight": 1882, "volume": 13, - "bashing": 8, - "cutting": 2, + "bashing": 2, + "cutting": 8, + "to_hit": 1, + "category": "weapons" + }, + { + "id": "nodachi_inferior", + "type": "GENERIC", + "symbol": "/", + "color": "light_gray", + "name": "nodachi", + "name_plural": "nodachi", + "description": "This is a huge, curved, two-handed sword from Japan. It is surprisingly light for its size, but also much bendier than a sword should be.", + "price": 15000, + "price_postapoc": 0, + "material": "budget_steel", + "flags": "SHEATH_SWORD", + "techniques": [ "WBLOCK_1", "RAPID", "WIDE" ], + "weight": 1882, + "volume": 13, + "bashing": 5, + "cutting": 15, "to_hit": 1, "category": "weapons" }, @@ -2007,5 +2063,157 @@ "to_hit": 1, "category": "weapons", "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 8 ] ] + }, + { + "id": "pike_fake", + "type": "GENERIC", + "category": "weapons", + "name": "awl pike", + "description": "This is a dull, cheaply made replica of a medieval weapon consisting of a wood shaft tipped with an iron spike.", + "weight": 2000, + "volume": 14, + "price": 4000, + "to_hit": 2, + "bashing": 10, + "cutting": 15, + "material": [ "aluminum", "wood" ], + "symbol": "/", + "color": "brown", + "looks_like": "pike", + "techniques": [ "IMPALE", "WBLOCK_2" ], + "qualities": [ [ "COOK", 1 ] ], + "flags": [ "SPEAR", "REACH_ATTACK", "REACH3", "NONCONDUCTIVE" ] + }, + { + "id": "pike_inferior", + "type": "GENERIC", + "category": "weapons", + "name": "awl pike", + "description": "This is a medieval weapon consisting of a wood shaft tipped with an iron spike. The spike seems to be pretty dull, and the whole thing feels poorly made.", + "weight": 6000, + "volume": 14, + "price": 40000, + "to_hit": 2, + "bashing": 12, + "cutting": 25, + "material": [ "budget_steel", "wood" ], + "symbol": "/", + "color": "brown", + "looks_like": "pike", + "techniques": [ "IMPALE", "WBLOCK_2" ], + "qualities": [ [ "COOK", 1 ] ], + "flags": [ "SPEAR", "REACH_ATTACK", "REACH3", "NONCONDUCTIVE" ] + }, + { + "type": "GENERIC", + "id": "mace_fake", + "name": "mace", + "description": "A light, cheaply made replica of a medieval weapon that would normally consist of a wood handle with a heavy iron end.", + "weight": 750, + "to_hit": 1, + "color": "dark_gray", + "symbol": "/", + "looks_like": "mace", + "material": [ "aluminum", "wood" ], + "techniques": [ "SWEEP" ], + "flags": [ "NONCONDUCTIVE" ], + "volume": 5, + "bashing": 2, + "price": 10000 + }, + { + "type": "GENERIC", + "id": "mace_inferior", + "name": "mace", + "description": "A medieval weapon consisting of a wood handle with a heavy iron end. That iron end feels a bit loose.", + "weight": 1000, + "to_hit": 1, + "color": "dark_gray", + "symbol": "/", + "looks_like": "mace", + "material": [ "budget_steel", "wood" ], + "techniques": [ "SWEEP" ], + "flags": [ "NONCONDUCTIVE" ], + "volume": 5, + "bashing": 22, + "price": 10000, + "qualities": [ [ "HAMMER", 1 ] ] + }, + { + "type": "GENERIC", + "id": "morningstar_fake", + "name": "morningstar", + "description": "A light, cheaply made replica of a medieval weapon that would normally consist of a wood handle with a heavy, spiked iron ball on the end.", + "weight": 700, + "to_hit": 1, + "color": "dark_gray", + "symbol": "/", + "looks_like": "morningstar", + "material": [ "aluminum", "wood" ], + "techniques": [ "SWEEP" ], + "volume": 6, + "bashing": 2, + "cutting": 1, + "flags": [ "SPEAR", "NONCONDUCTIVE" ], + "price": 12000 + }, + { + "type": "GENERIC", + "id": "morningstar_inferior", + "name": "morningstar", + "description": "A medieval weapon consisting of a wood handle with a heavy, spiked iron ball on the end. That end feels lighter than it should.", + "weight": 1000, + "to_hit": 1, + "color": "dark_gray", + "symbol": "/", + "looks_like": "morningstar", + "material": [ "budget_steel", "wood" ], + "techniques": [ "SWEEP" ], + "volume": 6, + "bashing": 11, + "cutting": 1, + "flags": [ "SPEAR", "NONCONDUCTIVE" ], + "price": 12000, + "qualities": [ [ "HAMMER", 1 ] ] + }, + { + "id": "tanto_fake", + "type": "GENERIC", + "category": "weapons", + "name": "tanto", + "description": "This is a dull, cheaply made replica of a long Japanese knife, typically used as a samurai's backup weapon.", + "weight": 374, + "volume": 2, + "price": 1800, + "to_hit": 1, + "bashing": 1, + "cutting": 5, + "material": "aluminum", + "symbol": "/", + "color": "dark_gray", + "looks_like": "tanto", + "techniques": "RAPID", + "qualities": [ [ "CUT", 1 ], [ "BUTCHER", 4 ] ], + "flags": [ "STAB", "SHEATH_KNIFE" ] + }, + { + "id": "tanto_inferior", + "type": "GENERIC", + "category": "weapons", + "name": "tanto", + "description": "Long Japanese knives like this more-modern remake were the samurai's backup weapon, before the advent of the larger wakizashi. This one doesn't feel well-balanced", + "weight": 3, + "volume": 2, + "price": 18000, + "to_hit": 2, + "bashing": 1, + "cutting": 10, + "material": "budget_steel", + "symbol": "/", + "color": "dark_gray", + "looks_like": "tanto", + "techniques": "RAPID", + "qualities": [ [ "CUT", 1 ], [ "CUT_FINE", 1 ], [ "BUTCHER", 7 ] ], + "flags": [ "STAB", "SHEATH_KNIFE" ] } ] diff --git a/data/json/items/ranged.json b/data/json/items/ranged.json index e75692638fc7f..291830ca8238e 100644 --- a/data/json/items/ranged.json +++ b/data/json/items/ranged.json @@ -315,7 +315,7 @@ "symbol": "(", "color": "dark_gray", "name": "mininuke launcher", - "description": "A powerful handheld spring mortar handcrafted from scrap. Made to launch modified handheld nuclear weapons, it is an exceedingly powerful weapon.", + "description": "A powerful handheld launcher handcrafted from scrap. Made to launch modified handheld nuclear weapons, it is an exceedingly powerful weapon.", "price": 750000, "material": [ "aluminum", "wood" ], "flags": [ "RELOAD_ONE", "STR_RELOAD", "NEVER_JAMS" ], @@ -325,7 +325,7 @@ "volume": 11, "bashing": 12, "to_hit": -1, - "range": 24, + "range": 40, "dispersion": 600, "durability": 7, "clip_size": 1, diff --git a/data/json/items/resources/metals.json b/data/json/items/resources/metals.json index f79aa968fc6b4..7e62d54f5721f 100644 --- a/data/json/items/resources/metals.json +++ b/data/json/items/resources/metals.json @@ -91,7 +91,7 @@ "description": "An bulky assortment of small bits of scrap steel useful in all kinds of crafting", "weight": 50, "volume": 1, - "price": 1000, + "price": 500, "count": 2, "stack_size": 10, "//": "Density 7.60g/cm³ ~ 1.9kg/250ml @ 50g/unit ~ stack 40 but fragments stacks poorly so only 25% of this", "material": "steel", @@ -117,6 +117,23 @@ "color": "light_gray", "ammo_type": "components" }, + { + "id": "sheet_metal_small", + "type": "AMMO", + "category": "spare_parts", + "name": "small metal sheet", + "description" : "A small sheet of metal.", + "weight" : 250, + "volume" : 1, + "price" : 2000, + "bashing" : 5, + "to_hit" : -3, + "stack_size": 8, "//" : "Roughly in the 15cm×15cm to 20cm×20cm range. Compact and stacks well, so equally dense as a solid block.", + "material": "steel", + "symbol" : "]", + "color" : "light_cyan", + "ammo_type": "components" + }, { "id": "steel_chunk", "type": "AMMO", diff --git a/data/json/items/tools.json b/data/json/items/tools.json index 57f87c61cde17..2752559633659 100644 --- a/data/json/items/tools.json +++ b/data/json/items/tools.json @@ -895,8 +895,8 @@ "type": "TOOL", "name": "inactive mininuke hack", "description": "This is an inactive mininuke hack. Many times as large as a normal manhack, a mininuke hack contains a mininuke and attack by flying at their target and detonating. Use this item to reprogram and activate the mininuke hack. Electronics and computer skill determines if the targeting matrix is reprogrammed successfully.", - "weight": 53524, - "volume": 64, + "weight": 25000, + "volume": 75, "price": 2677500, "to_hit": -3, "bashing": 6, @@ -2655,6 +2655,9 @@ "material": [ "wood", "stone" ], "symbol": ",", "color": "brown", + "initial_charges": 500, + "max_charges": 500, + "charges_per_use": 1, "use_action": { "type": "firestarter", "moves": 200, "moves_slow": 10000 }, "flags": [ "FIRESTARTER" ] }, @@ -4636,7 +4639,7 @@ "max_charges": 200, "charges_per_use": 1, "qualities": [ [ "COOK", 2 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], - "use_action": "HOTPLATE" + "use_action": [ "HOTPLATE", "HEAT_FOOD" ] }, { "id": "metal_funnel", @@ -4693,7 +4696,7 @@ "max_charges": 200, "charges_per_use": 1, "qualities": [ [ "COOK", 2 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ] ], - "use_action": "HOTPLATE" + "use_action": [ "HOTPLATE", "HEAT_FOOD" ] }, { "id": "militarymap", @@ -4722,7 +4725,7 @@ "name": "mininuke", "//": "This is based on the Davy Crockett nuclear artillery shell, all other man-portable nuclear weapons have far too high a yield.", "description": "This is an extremely powerful weapon, a portable nuclear bomb. Use it to activate the timer. You guess that the explosion would be large enough to take out a small house.", - "weight": 53524, + "weight": 23000, "volume": 64, "price": 180000, "to_hit": -2, @@ -4741,7 +4744,7 @@ "name_plural": "mininukes", "//": "This is based on the Davy Crockett nuclear artillery shell, all other man-portable nuclear weapons have far too high a yield.", "description": "This miniature nuclear bomb has a light blinking on the side, showing that it will soon explode. You should probably get far, far away from it.", - "weight": 53524, + "weight": 23000, "volume": 64, "price": 0, "to_hit": -2, @@ -6757,7 +6760,7 @@ "max_charges": 800, "charges_per_use": 1, "qualities": [ [ "COOK", 3 ], [ "BOIL", 2 ], [ "CONTAIN", 1 ], [ "CHEM", 1 ] ], - "use_action": "HOTPLATE" + "use_action": [ "HOTPLATE", "HEAT_FOOD" ] }, { "id": "survivor_scope", diff --git a/data/json/items/vehicle/battery.json b/data/json/items/vehicle/battery.json index 4b63afedc1f64..f9f8218392230 100644 --- a/data/json/items/vehicle/battery.json +++ b/data/json/items/vehicle/battery.json @@ -15,7 +15,7 @@ "ammo_type": "battery", "capacity": 2500, "//": "58Ah @ 12VDC. Could supply ~700 watts for an hour", - "flags": [ "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD" ] + "flags": [ "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD", "RECHARGE" ] }, { "id": "battery_motorbike", @@ -76,6 +76,6 @@ "color": "light_cyan", "ammo_type": "battery", "capacity": 40000, - "flags": [ "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD" ] + "flags": [ "NO_SALVAGE", "NO_UNLOAD", "NO_RELOAD", "RECHARGE" ] } ] diff --git a/data/json/items/vehicle_parts.json b/data/json/items/vehicle_parts.json index f3546f30c11e0..85aa98a18317e 100644 --- a/data/json/items/vehicle_parts.json +++ b/data/json/items/vehicle_parts.json @@ -499,7 +499,7 @@ "type": "GENERIC", "id": "minifridge", "name": "minifridge", - "description": "A very small fridge for keeping food cool.", + "description": "A very small fridge for keeping food cool. Provides some insulation from outside weather.", "weight": 31752, "to_hit": -8, "color": "light_blue", @@ -508,13 +508,14 @@ "volume": 20, "bashing": 8, "category" : "veh_parts", - "price": 60000 + "price": 60000, + "insulation": 2 }, { "type": "GENERIC", "id": "minifreezer", "name": "minifreezer", - "description": "Compact version of a chest freezer, designed as a mobile solution for freezing food.", + "description": "Compact version of a chest freezer, designed as a mobile solution for freezing food. Provides insulation from the elements.", "weight": 31752, "to_hit": -8, "color": "light_blue", @@ -523,7 +524,8 @@ "volume": 20, "bashing": 8, "category" : "veh_parts", - "price": 70000 + "price": 70000, + "insulation": 4 }, { "type": "GENERIC", @@ -560,7 +562,8 @@ "id" : "sheet_metal", "name" : "sheet metal", "description" : "A thin sheet of metal.", - "weight" : 1000, + "//" : "Roughly in the 70cm×70cm×1.5mm to 1m×1m×0.75mm range. Has to be folded / rolled up when in inventory, so 75% density compared to solid block.", + "weight" : 6000, "to_hit" : -2, "color" : "light_cyan", "symbol" : "]", @@ -575,7 +578,7 @@ "id" : "sheet_metal_lit", "name" : "wired sheet metal", "description" : "Sheet metal that has had light housing wired into it.", - "weight" : 1200, + "weight" : 6200, "to_hit" : -2, "color" : "light_cyan", "symbol" : "]", diff --git a/data/json/mapgen/apartment_con.json b/data/json/mapgen/apartment_con.json index c86a06025d800..00d6c95d6cbc1 100644 --- a/data/json/mapgen/apartment_con.json +++ b/data/json/mapgen/apartment_con.json @@ -16,7 +16,7 @@ " |--|-+-|-+-|....Q|-ww", " RssX.............|^..", " Rssw..F..........D...", - " Rssw..F.......|+-|p..", + " Rssw..F.......|+-|...", " Rss|..F...FFF^|.Y|...", " |------|-|-|--|--|...", " |.dBBd.+r|u+..eSc|...", @@ -26,7 +26,7 @@ " |--|-+-|-+-|...QQ|...", " RssX.............|...", " Rssw.............D...", - " Rssw..A.....F.|+-|p..", + " Rssw..A.....F.|+-|...", " Rss|.....FFFF^|.Y|...", " |------------||--|...", " |############|EEE=...", @@ -62,7 +62,6 @@ "^": "f_indoor_plant", "b": "f_bathtub", "c": "f_counter", - "p": "f_mailbox", "Y": "f_rack_coat", "d": "f_dresser", "e": "f_fridge", @@ -84,8 +83,7 @@ "o": [ { "item": "magazines", "chance": 30 }, { "item": "novels", "chance": 40 }, { "item": "alcohol", "chance": 30 }, { "item": "manuals", "chance": 20 } ], "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], "u": [ { "item": "cleaning", "chance": 50 }, { "item": "home_hw", "chance": 30 }, { "item": "cannedfood", "chance": 50 }, { "item": "pasta", "chance": 50 } ], - "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 4, 23 ], "y": [ 2, 23 ], "repeat": [ 1, 2 ] } ] } @@ -107,7 +105,7 @@ "-D-|.QQ..|-+-|-+-|--| ", "...|.............XssR ", "...D.............wssR ", - "..p|-+|..........wssR ", + "...|-+|..........wssR ", "...|Y.|oo.FFFF..^|ssR ", "...|--|--|-|-|------| ", "...|cSe..+u|r+.dBBd.| ", @@ -117,7 +115,7 @@ "..^|Q.Q..|-+-|-+-|--| ", "...|.............XssR ", "...D......A......wssR ", - "..p|-+|..........wssR ", + "...|-+|..........wssR ", "...|Y.|^....FFF.o|ssR ", "...|--||------------| ", "...=xEE|############| ", @@ -152,7 +150,6 @@ "Q": "f_stool", "^": "f_indoor_plant", "b": "f_bathtub", - "p": "f_mailbox", "Y": "f_rack_coat", "c": "f_counter", "d": "f_dresser", @@ -177,7 +174,7 @@ "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], "u": [ { "item": "cleaning", "chance": 50 }, { "item": "home_hw", "chance": 30 }, { "item": "cannedfood", "chance": 50 }, { "item": "pasta", "chance": 50 } ], "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 0, 19 ], "y": [ 2, 23 ], "repeat": [ 1, 2 ] }, @@ -199,7 +196,7 @@ " w......|STb|....O|...", " |oo....+..b|..ccc|^..", " |--|-+-|-+-|..QQQ|...", - " RssX.............|p..", + " RssX.............|...", " Rssw.............D...", " Rssw..A....A..|+-|...", " Rss|...FFF...^|.Y|...", @@ -209,13 +206,13 @@ " w......|STb|....O|...", " |.d....+..b|..ccc|...", " |--|-+-|-+-|....^|...", - " RssX...A.........|p..", + " RssX...A.........|...", " Rssw.............D...", " Rssw.........o|+-|...", " Rss|..A.FFF..o|.Y|...", " |--|--ww---ww-|--|w-G", " ss", - " ss", + " ppppss", " ss" ], "terrain": { @@ -232,6 +229,7 @@ "G": "t_door_glass_c", "R": "t_railing_v", "X": "t_door_locked", + "p": "t_grass", "s": "t_sidewalk", "w": "t_window", "x": "t_console_broken", @@ -269,7 +267,7 @@ "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], "u": [ { "item": "cleaning", "chance": 50 }, { "item": "home_hw", "chance": 30 }, { "item": "cannedfood", "chance": 50 }, { "item": "pasta", "chance": 50 } ], "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 4, 23 ], "y": [ 0, 19 ], "repeat": [ 1, 2 ] }, @@ -291,7 +289,7 @@ "...|O....|bTS|......w ", "...|ccc..|bf.+....d.| ", "...|.Q...|-+-|-+-|--| ", - "..p|.............+ssR ", + "...|.............+ssR ", "...D.............wssR ", "...|-+|...htth...wssR ", "...|Y.|^..htth.oo|ssR ", @@ -301,13 +299,13 @@ "...|O....|bTS|......w ", "...|ccc..|bf.+....d.| ", "...|.....|-+-|-+-|--| ", - "..p|.............+ssR ", + "...|.............+ssR ", "...D...........A.wssR ", "...|-+|..A...h...wssR ", "...|Y.|o....cxc.^|ssR ", "G-w|--|-ww---ww--|--| ", "ss ", - "ss ", + "sspppp ", "ss " ], "terrain": { @@ -324,6 +322,7 @@ "G": "t_door_glass_c", "R": "t_railing_v", "X": "t_door_locked", + "p": "t_grass", "s": "t_sidewalk", "w": "t_window", "x": "t_console_broken", @@ -363,7 +362,7 @@ "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], "u": [ { "item": "cleaning", "chance": 50 }, { "item": "home_hw", "chance": 30 }, { "item": "cannedfood", "chance": 50 }, { "item": "pasta", "chance": 50 } ], "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 0, 19 ], "y": [ 0, 19 ], "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/apartment_mod.json b/data/json/mapgen/apartment_mod.json index 339e86ed6ece3..44c64ac058474 100644 --- a/data/json/mapgen/apartment_mod.json +++ b/data/json/mapgen/apartment_mod.json @@ -24,7 +24,7 @@ " |-----|c.........A|-|-==-|-|..hh......c|-----| ", " |..BBd|cOS........|........|..tt....SOc|dBB..| ", " w..BB.|--|+|......D........D..tt..|+|--|.BB..w ", - " |d....+.r|u|^....t|p......p|..hh.^|u|r.+....d| ", + " |d....+.r|u|^....t|........|..hh.^|u|r.+....d| ", " |r...||--|-|------|........|------|-|--||...r| ", " w....|STb|u|...e.S|........|S.e..^|u|bTS|....w ", " |....+..b|.+.....c|........|c.....+.|b..+....| ", @@ -32,14 +32,14 @@ " RssX.....A....cccc|........|cccc...oo..A..XssR ", " Rssw.........l.ll.|........|.l.l..........wssR ", " Rssw..............D........D..............wssR ", - " Rss|..ooo.FFFF..Y^|p......p|^....A..FFFF..|ssR ", + " Rss|..ooo.FFFF..Y^|........|^....A..FFFF..|ssR ", " R|-|--------------|........|--------------|-|R ", " w.htth..FFFF..eSc|........|cSe.u.htth...oo.w ", " w...............O|........|O.....htth......w ", " |-X|..........ccc|........|ccc..........|X-| ", " Rss|-+----|o...l.|........|l.....|----+-|ssR ", " Rss|...BBd|o....A|........|.....A|dBB...|ssR ", - " Rssw...BB.|^.....|p......p|.....^|.BB...wssR ", + " Rssw...BB.|^.....|........|.....^|.BB...wssR ", " Rssw...h..|--|...D........D...|--|......wssR ", " Rss|..cxc.+.r|-+-|........|-+-|r.+......|ssR ", " ||--|+|----|--|Y..|........|..Y|--|----|+|--|| ", @@ -49,14 +49,14 @@ " |.dBBd...+r|...eSc|........|cSe...|r+..d.BBd.| ", " w..BB....|-|.....O|........|O.....|-|....BB..w ", " |.....h..+.....ccc|........|ccc.....+........| ", - " |--|.cxc.|......ll|p......p|.l.....A|....o|--| ", + " |--|.cxc.|......ll|........|.l.....A|....o|--| ", " |-www-|o.tt....D........D........|-www-| ", " Rsssss|.......F|........|t.......wsssssR ", " RsssssX..A..FFF|-W-GG-W-|t...FFF.XsssssR ", " |aaaaa|----ww--| ssss |--ww----|aaaaa| ", " ssss ", - " ssss ", - " ssss ", + " ppsssspp ", + " ppsssspp ", " ssss " ], "terrain": { @@ -108,7 +108,7 @@ "r": [ { "item": "dresser", "chance": 30 }, { "item": "jackets", "chance": 60 } ], "u": [ { "item": "cleaning", "chance": 50 }, { "item": "home_hw", "chance": 30 }, { "item": "cannedfood", "chance": 50 }, { "item": "pasta", "chance": 50 } ], "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_monsters": [ { "monster": "GROUP_ZOMBIE", "x": [ 0, 23 ], "y": [ 0, 23 ], "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/basement/basement_lab_stairs.json b/data/json/mapgen/basement/basement_lab_stairs.json index 1b8952d286f06..929a81bea7ac4 100644 --- a/data/json/mapgen/basement/basement_lab_stairs.json +++ b/data/json/mapgen/basement/basement_lab_stairs.json @@ -8,30 +8,30 @@ "fill_ter": "t_thconc_floor", "rotation": [ 0, 3 ], "rows": [ - "------------------------", - "|.........|>>|...ccc...|", - "|.C..C..C.|..|.c.....c.|", - "|.........|..|.c.....c.|", - "|.........|..|.c.....c.|", - "|.C..C..C.|..|.c.....c.|", - "|.........|..|.........|", - "|----+----|..|----+----|", - "|.........M..M.........|", - "|.........M..M.........|", + "##--------------------##", + "##| |>>| |##", + "##| |MM| |##", + "##| |..| |##", + "##| |..| |##", + "##| |..| |##", + "##| |..| |##", + "##| |..| |##", + "##|---+---|..|---+---|##", + "##|.......M..M.......|##", + "##|.......M..M.......|##", "|----+----|..|----+----|", "|.........|..|d.......d|", - "|.ccccccc.|..|xh.....hx|", - "|.........|7.|d...h...d|", - "|.ccccccc.|..|...dxd...|", + "|.ccccccc.|..|xh..h..hx|", + "|.........|7.|d..dxd..d|", "|---------|..|---------|", - "|---------|LL6---------|", - "=,,,,,,,,,,,,,,,,,,,,,,=", - "=,,,,,,,,,,,,,,,,,,,,,,=", - "=,,,,,,,,,,,,,,,,,,,,,,=", - "=,,,,,,,,,=WW=,,,,,,,,,=", - "=,,,,,,,,,=,,=,,,,,,,,,=", - "=,,,,,,,,,=<<=,,,,,,,,,=", - "========================" + "########--|LL6--########", + "########=,,,,,,=########", + "########=,,,,,,=########", + "########=,,,,,,=########", + "########===WW===########", + "##########=,,=##########", + "##########=<<=##########", + "##########====##########" ], "palettes": [ "lab_palette" ], "terrain": { @@ -57,7 +57,11 @@ }, "monster": { "7": { "monster": "mon_turret"} - } + }, + "place_nested": [ + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 3, "y": 1 }, + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 14, "y": 1 } + ] } }, { diff --git a/data/json/mapgen/dispensary.json b/data/json/mapgen/dispensary.json index 64efcb1cc5b77..aafeb6d10b8d2 100644 --- a/data/json/mapgen/dispensary.json +++ b/data/json/mapgen/dispensary.json @@ -5,7 +5,7 @@ "place_item": [ { "item": "pipe_glass", "repeat": 1, "x": 12, "y": 6 }, { "item": "pipe_glass", "repeat": 1, "x": 13, "y": 6 }, - { "item": "joint_lit", "repeat": 1, "x": 14, "y": 6 }, + { "item": "joint", "repeat": 1, "x": 14, "y": 6 }, { "item": "lighter", "repeat": 1, "x": 14, "y": 6 }, { "item": "matches", "repeat": 1, "x": 13, "y": 7 }, { "item": "pipe_tobacco", "repeat": 1, "x": 15, "y": 7 }, @@ -18,7 +18,7 @@ { "item": "seed_weed", "repeat": 1, "x": 9, "y": 14 }, { "item": "cannabis", "repeat": 1, "x": 11, "y": 14 }, { "item": "cannabis", "repeat": 1, "x": 19, "y": 14 }, - { "item": "joint_lit", "repeat": 1, "x": 9, "y": 15 }, + { "item": "joint", "repeat": 1, "x": 9, "y": 15 }, { "item": "cannabis", "repeat": 1, "x": 11, "y": 15 }, { "item": "cannabis", "repeat": 1, "x": 20, "y": 15 } ], @@ -129,19 +129,19 @@ { "item": "cannabis", "repeat": 1, "x": 19, "y": 14 }, { "item": "cannabis", "repeat": 1, "x": 16, "y": 15 }, { "item": "cannabis", "repeat": 1, "x": 19, "y": 15 }, - { "item": "joint_lit", "repeat": 1, "x": 8, "y": 16 }, + { "item": "joint", "repeat": 1, "x": 8, "y": 16 }, { "item": "withered", "repeat": 1, "x": 11, "y": 16 }, { "item": "cannabis", "repeat": 1, "x": 2, "y": 17 }, { "item": "cannabis", "repeat": 1, "x": 5, "y": 17 }, { "item": "cannabis", "repeat": 1, "x": 6, "y": 17 }, - { "item": "joint_lit", "repeat": 1, "x": 8, "y": 17 }, + { "item": "joint", "repeat": 1, "x": 8, "y": 17 }, { "item": "seed_weed", "repeat": 1, "x": 11, "y": 17 }, { "item": "cannabis", "repeat": 1, "x": 19, "y": 17 }, { "item": "withered", "repeat": 1, "x": 2, "y": 18 }, { "item": "cannabis", "repeat": 1, "x": 3, "y": 18 }, { "item": "seed_weed", "repeat": 1, "x": 5, "y": 18 }, { "item": "cannabis", "repeat": 1, "x": 6, "y": 18 }, - { "item": "joint_lit", "repeat": 1, "x": 8, "y": 18 }, + { "item": "joint", "repeat": 1, "x": 8, "y": 18 }, { "item": "seed_weed", "repeat": 1, "x": 11, "y": 18 }, { "item": "cannabis", "repeat": 1, "x": 13, "y": 18 }, { "item": "cannabis", "repeat": 1, "x": 16, "y": 18 }, @@ -239,7 +239,7 @@ "object": { "place_item": [ { "item": "joint_roach", "repeat": 1, "x": 11, "y": 4 }, - { "item": "joint_lit", "repeat": 1, "x": 11, "y": 11 }, + { "item": "joint", "repeat": 1, "x": 11, "y": 11 }, { "item": "pipe_glass", "repeat": 1, "x": 10, "y": 15 }, { "item": "withered", "repeat": 1, "x": 17, "y": 15 }, { "item": "withered", "repeat": 1, "x": 8, "y": 17 }, diff --git a/data/json/mapgen/farm.json b/data/json/mapgen/farm.json index a329845529206..292e972de0ca2 100644 --- a/data/json/mapgen/farm.json +++ b/data/json/mapgen/farm.json @@ -151,7 +151,7 @@ "h": { "item": "bedroom", "chance": 65 }, "k": { "item": "bedroom", "chance": 65 }, "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "P": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "l": [ { "item": "tools_earthworking", "chance": 65 }, { "item": "mechanics", "chance": 40 }, { "item": "home_hw", "chance": 50 }, { "item": "tools_common", "chance": 50 } ], "u": [ { "item": "kitchen", "chance": 70 }, { "item": "cannedfood", "chance": 65 }, { "item": "moonshine_brew", "chance": 65 } ] }, @@ -270,7 +270,7 @@ "e": { "item": "fridge", "chance": 65 }, "h": { "item": "bedroom", "chance": 65 }, "k": { "item": "bedroom", "chance": 65 }, - "P": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "l": [ { "item": "tools_earthworking", "chance": 65 }, { "item": "mechanics", "chance": 40 }, { "item": "home_hw", "chance": 50 }, { "item": "tools_common", "chance": 50 } ], "m": [ { "item": "livingroom", "chance": 20 }, { "item": "survival_armor", "chance": 20 }, { "item": "camping", "chance": 20 }, { "item": "gear_survival", "chance": 20 }, { "item": "bed", "chance": 40 } ], "u": [ { "item": "kitchen", "chance": 70 }, { "item": "cannedfood", "chance": 40 }, { "item": "softdrugs", "chance": 40 } ] diff --git a/data/json/mapgen/house/crack_house.json b/data/json/mapgen/house/crack_house.json index e09651a84b09c..b7c60c0c2864a 100644 --- a/data/json/mapgen/house/crack_house.json +++ b/data/json/mapgen/house/crack_house.json @@ -9,6 +9,7 @@ "-": "f_null", ".": "f_null", "4": "f_null", + "A": "f_mailbox", "B": "f_bed", "C": "f_null", "D": "f_null", @@ -43,6 +44,7 @@ "{": "f_dumpster", "|": "f_null" }, + "items": { "A": { "item": "mail", "chance": 10, "repeat": [ 0, 3 ] } }, "place_items": [ { "chance": 35, "item": "bedroom", "x": 7, "y": 5 }, { "chance": 35, "item": "harddrugs", "x": 9, "y": 6 }, @@ -65,7 +67,7 @@ ], "place_toilets": [ { "x": 12, "y": 10 } ], "rows": [ - "..........s....._____...", + "..........s...A._____...", "..........s....._____...", "._.._..##PPP.#.._____.p.", "...|||a|||g|a||._____...", @@ -97,6 +99,7 @@ "-": "t_chainfence_h", ".": "t_grass", "4": "t_tree_deadpine", + "A": "t_grass", "B": "t_floor", "C": "t_chainfence_v", "D": "t_door_o", @@ -151,6 +154,7 @@ "-": "f_null", ".": "f_null", "4": "f_null", + "A": "f_mailbox", "B": "f_bench", "C": "f_null", "D": "f_null", @@ -188,6 +192,7 @@ "{": "f_dumpster", "|": "f_null" }, + "items": { "A": { "item": "mail", "chance": 10, "repeat": [ 0, 3 ] } }, "place_items": [ { "chance": 15, "item": "bedroom", "x": 7, "y": 5 }, { "chance": 25, "item": "harddrugs", "x": 9, "y": 6 }, @@ -210,7 +215,7 @@ ], "place_toilets": [ { "x": 12, "y": 10 } ], "rows": [ - "..........s....._____...", + "..........s....._____A..", "..........s....._____...", "._.._..##PPP.#.._____.p.", "...|||w|||h|w||._____...", @@ -242,6 +247,7 @@ "-": "t_chainfence_h", ".": "t_grass", "4": "t_tree_deadpine", + "A": "t_grass", "B": "t_dirt", "C": "t_chainfence_v", "D": "t_door_c", @@ -300,6 +306,7 @@ "F": "f_fridge", "H": "f_sofa", "L": "f_null", + "P": "f_mailbox", "S": "f_null", "T": "f_trashcan", "W": "f_null", @@ -326,6 +333,7 @@ "{": "f_dumpster", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 10, "repeat": [ 0, 3 ] } }, "place_items": [ { "chance": 15, "item": "child_items", "x": 15, "y": 18 }, { "chance": 15, "item": "child_items", "x": 6, "y": 16 }, @@ -355,7 +363,7 @@ ], "place_toilets": [ { "x": 19, "y": 13 } ], "rows": [ - "__.._......SS........___", + "__.._...P..SS........___", "_._........SS........_..", "._.__..|ff|ff|ff|||||.._", "_._____fffffffff|ffb|___", @@ -393,6 +401,7 @@ "F": "t_linoleum_gray", "H": "t_floor", "L": "t_linoleum_white", + "P": "t_dirt", "S": "t_sidewalk", "T": "t_linoleum_gray", "W": "t_window_boarded_noglass", diff --git a/data/json/mapgen/house/detached_house.json b/data/json/mapgen/house/detached_house.json index 8e8c7943682bb..d088c621e245e 100644 --- a/data/json/mapgen/house/detached_house.json +++ b/data/json/mapgen/house/detached_house.json @@ -16,6 +16,7 @@ ".": "f_null", "4": "f_null", "6": "f_null", + "A": "f_mailbox", "B": "f_bed", "C": "f_null", "D": "f_dryer", @@ -57,6 +58,7 @@ "{": "f_dresser", "|": "f_null" }, + "items": { "A": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 50, "item": "pantry", "x": 12, "y": 10 }, { "chance": 25, "item": "tools_mechanic", "x": 20, "y": 18 }, @@ -74,7 +76,7 @@ ], "place_monsters": [ { "chance": 5, "density": 1, "monster": "GROUP_ZOMBIE", "x": 7, "y": 10 } ], "rows": [ - "..ffSffS.ssfSfs..ppppp..", + "..ffSffSAssfSfs..ppppp..", ".||w|||||d|W||s..pppppC.", ".|ccccc|___TH|s..pppppC.", ".|ecccB|_____ws..pppppC.", @@ -107,6 +109,7 @@ ".": "t_grass", "4": "t_tree_pine", "6": "t_gates_mech_control", + "A": "t_grass", "B": "t_carpet_purple", "C": "t_chainfence_v", "D": "t_floor", @@ -176,6 +179,7 @@ "C": "f_cupboard", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_table", "_": "f_null", @@ -200,6 +204,7 @@ "{": "f_dresser", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 45, "item": "tools_home", "x": 5, "y": 17 }, { "chance": 45, "item": "camping", "x": 13, "y": 21 }, @@ -219,7 +224,7 @@ ], "rows": [ ".ppppsssssss............", - ".pppp..f#B#s..##Bf##B...", + ".pppp.Pf#B#s..##Bf##B...", ".pppp.|ww||+|||w|||w||..", ".pppp.|H_Tr_|TT_|_|{b|..", ".ppppd|H__r_|g__+_|_b|#.", @@ -255,6 +260,7 @@ "C": "t_floor", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_shrub", "T": "t_floor", "_": "t_floor", @@ -305,6 +311,7 @@ "D": "f_dresser", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_trashcan", "W": "f_null", @@ -326,6 +333,7 @@ "{": "f_bookcase", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 20, "item": "tools_earthworking", "x": 18, "y": 9 }, { "chance": 20, "item": "tools_earthworking", "x": 21, "y": 8 }, @@ -348,7 +356,7 @@ ], "place_toilets": [ { "x": 14, "y": 2 } ], "rows": [ - "...dS...sss..SS....s....", + "...dS...sss..SS.P..s....", ".||||||w|+|w||||||.s....", ".|ClT|{_____a|flB|.s....", ".wCll|{_____t|lll|.s..d.", @@ -386,6 +394,7 @@ "D": "t_floor", "F": "t_linoleum_white", "H": "t_floor", + "P": "t_grass", "S": "t_shrub", "T": "t_linoleum_white", "W": "t_wall_glass", @@ -429,6 +438,7 @@ "D": "f_null", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_toilet", "W": "f_null", @@ -453,6 +463,7 @@ "{": "f_dresser", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 85, "item": "novels", "x": 12, "y": 11 }, { "chance": 75, "item": "fridge", "x": 15, "y": 3 }, @@ -476,7 +487,7 @@ "place_monsters": [ { "chance": 3, "density": 1, "monster": "GROUP_DOGS", "x": 11, "y": 8 } ], "place_toilets": [ { "x": 19, "y": 3 } ], "rows": [ - "d......deee...d.........", + "d......deee.P.d.........", "...dddds|+|..s.s.s.s.s..", "..dd||a||_|a||||a||||||.", "..dd|t_H|__t|CCF&o|Tlg|.", @@ -514,6 +525,7 @@ "D": "t_door_glass_c", "F": "t_linoleum_white", "H": "t_floor", + "P": "t_grass", "S": "t_sandbox", "T": "t_linoleum_white", "W": "t_water_sh", @@ -560,6 +572,7 @@ "D": "f_dresser", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_toilet", "W": "f_null", @@ -585,6 +598,7 @@ "{": "f_bookcase", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 85, "item": "novels", "x": 12, "y": 11 }, { "chance": 75, "item": "fridge", "x": 15, "y": 3 }, @@ -608,7 +622,7 @@ ], "place_toilets": [ { "x": 19, "y": 3 } ], "rows": [ - "d......deee...d.........", + "d......deee.P.d.........", "...dddds|h|..s.s.s.s.s..", "..dd||a||_|a||||a||||||.", "..dd|t_H|__t|ggF&o|TlB|.", @@ -646,6 +660,7 @@ "D": "t_floor", "F": "t_linoleum_white", "H": "t_floor", + "P": "t_grass", "S": "t_sandbox", "T": "t_linoleum_white", "W": "t_water_sh", @@ -694,6 +709,7 @@ "D": "f_dresser", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_table", "W": "f_null", @@ -720,6 +736,7 @@ "{": "f_bookcase", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 25, "item": "cubical_office", "x": 8, "y": 2 }, { "chance": 20, "item": "clutter_bedroom", "x": 3, "y": 8 }, @@ -751,7 +768,7 @@ ], "place_toilets": [ { "x": 18, "y": 9 } ], "rows": [ - "..s.s.s.s.s.SSSSS.s.s...", + "..s.s.s.s.s.SSSSSPs.s...", ".||w|w||||||SSSSS||w|||.", ".|gg&eF|_hj|w|+|w|D__B|.", "d|e____|___|____T|___B|.", @@ -790,6 +807,7 @@ "D": "t_floor", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_sidewalk", "T": "t_floor", "W": "t_wall_glass", @@ -842,6 +860,7 @@ "D": "f_null", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_table", "W": "f_null", @@ -869,6 +888,7 @@ "{": "f_dresser", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 75, "item": "misc_smoking", "x": 4, "y": 13 }, { "chance": 75, "item": "misc_smoking", "x": 2, "y": 10 }, @@ -893,7 +913,7 @@ ], "place_toilets": [ { "x": 11, "y": 8 } ], "rows": [ - "....s.s.s....SSS...s.s..", + "....s.s.s....SSSP..s.s..", ".||W|||||||W||g|||W||||.", ".|_____7|&Fo|^_^|{__bb|.", ".|H_t___|a_a|___|{__bb|.", @@ -931,6 +951,7 @@ "D": "t_dirt", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_sidewalk", "T": "t_dirtfloor", "W": "t_window_alarm", @@ -986,6 +1007,7 @@ "D": "f_dresser", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_toilet", "W": "f_null", @@ -1015,6 +1037,7 @@ "{": "f_bookcase", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 75, "item": "trash", "x": 10, "y": 4 }, { "chance": 75, "item": "fridge", "x": 5, "y": 5 }, @@ -1037,7 +1060,7 @@ { "chance": 75, "item": "bed", "x": [ 19, 20 ], "y": 4 } ], "rows": [ - "......d......f...d......", + "......d.....Pf...d......", "d............f..........", ".......dsssd|+a|dsssd..d", "..d.|||a|||||__|||||||..", @@ -1075,6 +1098,7 @@ "D": "t_floor", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_sandbox", "T": "t_linoleum_white", "W": "t_wall_metal", @@ -1133,6 +1157,7 @@ "D": "f_null", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_toilet", "^": "f_indoor_plant", @@ -1152,6 +1177,7 @@ "{": "f_bookcase", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 15, "item": "bags", "x": 15, "y": 9 }, { "chance": 40, "item": "alcohol", "x": 15, "y": 7 }, @@ -1171,7 +1197,7 @@ "place_toilets": [ { "x": 15, "y": 12 } ], "rows": [ "...........S.._.........", - "...........S.........._.", + "...........SP........._.", "_...#.4..__SS...4#......", "......s.__|+w|..#.....#.", "......___.|ft|......_...", @@ -1208,6 +1234,7 @@ "D": "t_door_locked", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_sidewalk", "T": "t_floor", "^": "t_floor", @@ -1256,6 +1283,7 @@ "D": "f_null", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_trashcan", "W": "f_null", @@ -1283,6 +1311,7 @@ "{": "f_dresser", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 35, "item": "knifeblock", "x": 4, "y": 11 }, { "chance": 25, "item": "fridge", "x": 4, "y": 8 }, @@ -1308,7 +1337,7 @@ "place_toilets": [ { "x": 15, "y": 12 } ], "place_traps": [ { "trap": "tr_nailboard", "x": 9, "y": 4 } ], "rows": [ - ".....d...s...........d..", + ".....d...s.P.........d..", ".........s..d...d.......", "...d....sss...d..dd.d...", ".......|gDW|....dddd....", @@ -1347,6 +1376,7 @@ "D": "t_door_locked", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_shrub", "T": "t_floor", "W": "t_window_boarded_noglass", @@ -1402,6 +1432,7 @@ "C": "f_cupboard", "D": "f_null", "H": "f_sofa", + "P": "f_mailbox", "S": "f_null", "T": "f_table", "^": "f_indoor_plant_y", @@ -1421,6 +1452,7 @@ "{": "f_dresser", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 25, "item": "harddrugs", "x": 12, "y": 15 }, { "chance": 25, "item": "harddrugs", "x": 10, "y": 14 }, @@ -1446,7 +1478,7 @@ "place_monsters": [ { "chance": 6, "density": 0.05, "monster": "GROUP_ZOMBIE", "x": 13, "y": 4 } ], "place_toilets": [ { "x": 5, "y": 17 } ], "rows": [ - ".....d...ss....d........", + ".....d...ss..P.d........", "........#ss.............", "........#ss...#...4.....", ".4.d.#...ss#...7...S.4..", @@ -1483,6 +1515,7 @@ "C": "t_floor", "D": "t_door_c", "H": "t_floor", + "P": "t_grass", "S": "t_shrub", "T": "t_floor", "^": "t_floor", diff --git a/data/json/mapgen/house/house04.json b/data/json/mapgen/house/house04.json index dd7de3f5f1cbd..2665e19cf12b4 100644 --- a/data/json/mapgen/house/house04.json +++ b/data/json/mapgen/house/house04.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - ".###..#########s##..###.", + ".###..########Ps##..###.", ".---vv----v----;--vvv--.", ".| nn o|B |r| nnnn|.", ".|d o|B t| | |.", @@ -53,6 +53,7 @@ "C": "t_floor", "D": "t_floor", "O": "t_floor", + "P": "t_grass", "Y": "t_floor", "l": "t_floor", "S": "t_floor", @@ -78,6 +79,7 @@ "C": "f_cupboard", "D": "f_trashcan", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "c": "f_counter", "d": "f_dresser", @@ -89,7 +91,10 @@ "r": "f_rack" }, "toilets": { "t": { } }, - "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] } }, + "items": { + "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } + }, "place_loot": [ { "group": "bed", "x": [ 4, 5 ], "y": [ 6, 7 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bed", "x": [ 2, 3 ], "y": [ 14, 15 ], "chance": 90, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house05.json b/data/json/mapgen/house/house05.json index 0ca1d6096cd7c..72325b825486f 100644 --- a/data/json/mapgen/house/house05.json +++ b/data/json/mapgen/house/house05.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - ".DDD....................", + ".DDD....P...............", ".|---------vv----;;----.", ".| K |S | Y|.", ".| o|t B| o |.", @@ -49,6 +49,7 @@ "D": "t_dirt", "K": "t_floor", "O": "t_floor", + "P": "t_grass", "L": "t_floor", "l": "t_floor", "Y": "t_floor", @@ -72,6 +73,7 @@ "D": "f_trashcan", "K": "f_armchair", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "c": "f_counter", "d": "f_dresser", @@ -81,7 +83,10 @@ "o": "f_bookcase" }, "toilets": { "t": { } }, - "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] } }, + "items": { + "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } + }, "place_loot": [ { "group": "bed", "x": [ 2, 3 ], "y": [ 18, 19 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bed", "x": [ 12, 13 ], "y": [ 18, 19 ], "chance": 90, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house05_ab.json b/data/json/mapgen/house/house05_ab.json index d57a13e6f9f7b..58092717a6104 100644 --- a/data/json/mapgen/house/house05_ab.json +++ b/data/json/mapgen/house/house05_ab.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - ".DDD....................", + ".DDD...P................", ".|---------vv----;;----.", ".| |S | |.", ".| |t B| |.", @@ -48,6 +48,7 @@ "B": "t_floor", "D": "t_dirt", "O": "t_floor", + "P": "t_grass", "S": "t_floor", "v": "t_window_domestic", "|": "t_wall" @@ -56,9 +57,11 @@ "B": "f_bathtub", "D": "f_trashcan", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink" }, "toilets": { "t": {} }, + "items": { "A": { "item": "mail", "chance": 10, "repeat": [ 0, 3 ] } }, "place_loot": [ { "group": "trash", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 75, "repeat": [ 2, 5 ] }, { "group": "stash_drugs", "x": [ 2, 21 ], "y": [ 2, 21 ], "chance": 10 } diff --git a/data/json/mapgen/house/house06.json b/data/json/mapgen/house/house06.json index 2ecc658167fce..c1ddb44d22f05 100644 --- a/data/json/mapgen/house/house06.json +++ b/data/json/mapgen/house/house06.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "........##.ss.##........", + "........##.ss.##.P......", ".---vvvv--v;;v---------.", ".| h |Y Y| r r |.", ".v kkk | | r r |.", @@ -55,6 +55,7 @@ "l": "t_floor", "K": "t_floor", "O": "t_floor", + "P": "t_grass", "S": "t_floor", "c": "t_floor", "d": "t_floor", @@ -76,6 +77,7 @@ "D": "f_trashcan", "K": "f_armchair", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "l": "f_stool", "Y": "f_rack_coat", @@ -89,7 +91,10 @@ "r": "f_rack" }, "toilets": { "t": { } }, - "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] } }, + "items": { + "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } + }, "place_loot": [ { "group": "bed", "x": [ 2, 3 ], "y": [ 18, 19 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bed", "x": [ 18, 19 ], "y": [ 20, 21 ], "chance": 90, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house07.json b/data/json/mapgen/house/house07.json index 8fcdc0c362bca..8b49490d15d66 100644 --- a/data/json/mapgen/house/house07.json +++ b/data/json/mapgen/house/house07.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "...T####ss####T.........", + "...T####ss####T..P......", ".---vvvv;;vvvv---------.", ".|oo Y| rcccc |.", ".| h | r c |.", @@ -55,6 +55,7 @@ "Y": "t_floor", "K": "t_floor", "O": "t_floor", + "P": "t_grass", "S": "t_floor", "T": "t_tree", "c": "t_floor", @@ -77,6 +78,7 @@ "G": "f_gunsafe_ml", "K": "f_armchair", "O": "f_oven", + "P": "f_mailbox", "l": "f_stool", "Y": "f_rack_coat", "S": "f_sink", @@ -89,7 +91,10 @@ "r": "f_rack" }, "toilets": { "t": { } }, - "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] } }, + "items": { + "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } + }, "place_loot": [ { "group": "bed", "x": [ 18, 19 ], "y": [ 20, 21 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "livingroom", "x": [ 1, 10 ], "y": [ 1, 13 ], "chance": 90, "repeat": [ 1, 5 ] }, diff --git a/data/json/mapgen/house/house08.json b/data/json/mapgen/house/house08.json index 6c12ceb97ef0b..ebb8514b9701f 100644 --- a/data/json/mapgen/house/house08.json +++ b/data/json/mapgen/house/house08.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - ".###....................", + ".###....P...............", ".#---v----v;v----------.", ".#|hk | oooo hv.", ".#| k + nnn hv.", @@ -53,6 +53,7 @@ "C": "t_floor", "D": "t_floor", "O": "t_floor", + "P": "t_grass", "Q": "t_fence_h", "S": "t_floor", "[": "t_door_glass_c", @@ -74,6 +75,7 @@ "C": "f_cupboard", "D": "f_trashcan", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "l": "f_stool", "c": "f_counter", @@ -85,6 +87,7 @@ "o": "f_bookcase" }, "toilets": { "t": { } }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 4, 5 ], "y": [ 7, 8 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bedroom", "x": [ 2, 8 ], "y": [ 6, 8 ], "chance": 80, "repeat": [ 1, 5 ] }, diff --git a/data/json/mapgen/house/house09.json b/data/json/mapgen/house/house09.json index 9525a66563b68..e20f220ab8f6e 100644 --- a/data/json/mapgen/house/house09.json +++ b/data/json/mapgen/house/house09.json @@ -90,7 +90,7 @@ }, "toilets": { "t": { } }, "items": { - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, "Y": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] } }, diff --git a/data/json/mapgen/house/house10.json b/data/json/mapgen/house/house10.json index fc5639096c7f7..91d02aa10da4a 100644 --- a/data/json/mapgen/house/house10.json +++ b/data/json/mapgen/house/house10.json @@ -83,7 +83,7 @@ "r": "f_rack" }, "toilets": { "t": { } }, - "items": { "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "dresser", "x": [ 18, 18 ], "y": [ 20, 20 ], "chance": 80, "repeat": [ 1, 4 ] }, { "group": "dresser", "x": [ 20, 20 ], "y": [ 8, 8 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house11.json b/data/json/mapgen/house/house11.json index cb1232d981250..36b1e92d3ecbc 100644 --- a/data/json/mapgen/house/house11.json +++ b/data/json/mapgen/house/house11.json @@ -84,7 +84,7 @@ "r": "f_rack" }, "toilets": { "t": {} }, - "items": { "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "homebooks", "x": [ 13, 13 ], "y": [ 11, 12 ], "chance": 70, "repeat": [ 1, 3 ] }, { "group": "home_hw", "x": [ 14, 19 ], "y": [ 7, 15 ], "chance": 60, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house12.json b/data/json/mapgen/house/house12.json index 63a590de1fcde..2d6c8422fe329 100644 --- a/data/json/mapgen/house/house12.json +++ b/data/json/mapgen/house/house12.json @@ -98,7 +98,7 @@ }, "toilets": { "t": { } }, "items": { - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "Y": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] } }, diff --git a/data/json/mapgen/house/house13.json b/data/json/mapgen/house/house13.json index c449488e3447b..eb723a4880e8a 100644 --- a/data/json/mapgen/house/house13.json +++ b/data/json/mapgen/house/house13.json @@ -96,7 +96,7 @@ "n": "f_table" }, "toilets": { "t": { } }, - "items": { "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bedroom", "x": [ 2, 5 ], "y": [ 16, 19 ], "chance": 80, "repeat": [ 1, 4 ] }, { "group": "trash", "x": [ 4, 4 ], "y": [ 16, 16 ], "chance": 70, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/house/house14.json b/data/json/mapgen/house/house14.json index 088b4bd833336..4fe37bb21b190 100644 --- a/data/json/mapgen/house/house14.json +++ b/data/json/mapgen/house/house14.json @@ -103,7 +103,7 @@ }, "toilets": { "t": {} }, "items": { - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, "Y": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] } }, diff --git a/data/json/mapgen/house/house15.json b/data/json/mapgen/house/house15.json index ab7a76e744ed0..f5507781e2444 100644 --- a/data/json/mapgen/house/house15.json +++ b/data/json/mapgen/house/house15.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "......###ssssss###......", + "......##pssssss###......", ".....#''''''''''''#.....", "....#''''''''''''''#....", "...#''''''''''''''''#...", @@ -79,6 +79,7 @@ "k": "t_floor", "n": "t_floor", "o": "t_floor", + "p": "t_grass", "s": "t_sidewalk", "v": "t_window_domestic", "x": "t_shrub_strawberry", @@ -105,9 +106,11 @@ "j": "f_treadmill", "k": "f_desk", "n": "f_table", - "o": "f_bookcase" + "o": "f_bookcase", + "p": "f_mailbox" }, "toilets": { "t": { } }, + "items": { "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "dresser", "x": [ 2, 2 ], "y": [ 17, 17 ], "chance": 90, "repeat": [ 1, 2 ] }, { "group": "cleaning", "x": [ 18, 19 ], "y": [ 16, 16 ], "chance": 90, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/house/house16.json b/data/json/mapgen/house/house16.json index 039cfe640b6a0..1288332048c4f 100644 --- a/data/json/mapgen/house/house16.json +++ b/data/json/mapgen/house/house16.json @@ -90,7 +90,7 @@ }, "toilets": { "t": { } }, "items": { - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, "Y": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] } }, diff --git a/data/json/mapgen/house/house17.json b/data/json/mapgen/house/house17.json index 83182fd8f8b1e..93e01c9eb7165 100644 --- a/data/json/mapgen/house/house17.json +++ b/data/json/mapgen/house/house17.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - ".........#ss#...........", + "......p..#ss#...........", ".........#ss#...........", ".........#ss#...........", ".........#ss#...........", @@ -70,6 +70,7 @@ "l": "t_floor", "n": "t_floor", "o": "t_floor", + "p": "t_grass", "s": "t_sidewalk", "v": "t_window_domestic", "|": "t_wall" @@ -92,12 +93,14 @@ "f": "f_fridge", "l": "f_stool", "n": "f_table", - "o": "f_bookcase" + "o": "f_bookcase", + "p": "f_mailbox" }, "toilets": { "t": { } }, "items": { "Y": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, - "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] } + "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "livingroom", "x": [ 10, 17 ], "y": [ 15, 19 ], "chance": 90, "repeat": [ 1, 6 ] }, diff --git a/data/json/mapgen/house/house18.json b/data/json/mapgen/house/house18.json index 46930db3b9d5b..248c1f99065f7 100644 --- a/data/json/mapgen/house/house18.json +++ b/data/json/mapgen/house/house18.json @@ -90,7 +90,7 @@ "toilets": { "t": { } }, "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "homebooks", "x": [ 3, 3 ], "y": [ 16, 16 ], "chance": 70, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/house/house19.json b/data/json/mapgen/house/house19.json index eee88259a6b0b..1eb9ada9c6259 100644 --- a/data/json/mapgen/house/house19.json +++ b/data/json/mapgen/house/house19.json @@ -92,7 +92,7 @@ "toilets": { "t": { } }, "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "magazines", "x": [ 6, 7 ], "y": [ 16, 17 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_2story.json b/data/json/mapgen/house/house_2story.json index c86e4d1e489f8..5ab2f189bca23 100644 --- a/data/json/mapgen/house/house_2story.json +++ b/data/json/mapgen/house/house_2story.json @@ -33,7 +33,7 @@ ], "palettes": [ "multistory_house" ], "items": { - "P": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] } }, "mapping": { diff --git a/data/json/mapgen/house/house_dogs.json b/data/json/mapgen/house/house_dogs.json index 87fd6bba8318c..a3860c8b02bbb 100644 --- a/data/json/mapgen/house/house_dogs.json +++ b/data/json/mapgen/house/house_dogs.json @@ -30,7 +30,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - ".###....................", + ".###....P...............", ".#---v----v;v----------.", ".#|hk | oooo hv.", ".#| k + nnn hv.", @@ -74,6 +74,7 @@ "B": "t_floor", "C": "t_floor", "O": "t_floor", + "P": "t_grass", "Q": "t_fence_h", "S": "t_floor", "c": "t_floor", @@ -92,6 +93,7 @@ "B": "f_bathtub", "C": "f_cupboard", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "c": "f_counter", "d": "f_dresser", @@ -102,6 +104,7 @@ "o": "f_bookcase" }, "toilets": { "t": { } }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 4, 5 ], "y": [ 7, 8 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bedroom", "x": [ 2, 8 ], "y": [ 6, 8 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_duplex.json b/data/json/mapgen/house/house_duplex.json index 1713bf053729c..ac80c99ab2b22 100644 --- a/data/json/mapgen/house/house_duplex.json +++ b/data/json/mapgen/house/house_duplex.json @@ -53,7 +53,7 @@ "items": { "b": { "item": "bed", "chance": 15, "repeat": 2 }, "D": { "item": "dining", "chance": 20 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_toilets": [ { "x": 3, "y": 5 }, { "x": 20, "y": 5 } ], "rows": [ @@ -152,7 +152,7 @@ "#": { "item": "bed", "chance": 15, "repeat": 2 }, "t": { "item": "dining", "chance": 20 }, "{": { "item": "dresser", "chance": 30, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_toilets": [ { "x": 19, "y": 4 }, { "x": 13, "y": 12 } ], "rows": [ @@ -251,7 +251,7 @@ "F": { "item": "fridge", "chance": 35, "repeat": 2 }, "o": { "item": "oven", "chance": 30, "repeat": 2 }, "a": { "item": "pantry", "chance": 35, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_toilets": [ { "x": 10, "y": 10 }, { "x": 13, "y": 10 } ], "rows": [ @@ -354,7 +354,7 @@ "C": { "item": "pantry", "chance": 35, "repeat": 2 }, "B": { "item": "homebooks", "chance": 35, "repeat": 3 }, "h": { "item": "coat_rack", "chance": 35, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_toilets": [ { "x": 9, "y": 20 }, { "x": 14, "y": 20 } ], "rows": [ @@ -464,7 +464,7 @@ "a": { "item": "pantry", "chance": 35, "repeat": 2 }, "B": { "item": "homebooks", "chance": 35, "repeat": 3 }, "h": { "item": "coat_rack", "chance": 35, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_toilets": [ { "x": 3, "y": 17 }, { "x": 20, "y": 17 } ], "rows": [ @@ -580,7 +580,7 @@ "j": { "item": "homebooks", "chance": 35, "repeat": 3 }, "h": { "item": "coat_rack", "chance": 35, "repeat": 2 }, "p": { "item": "pool_table", "chance": 10, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_item": [ { "item": "pillow", "chance": 30, "repeat": 3, "x": 2, "y": [ 11, 13 ] }, @@ -695,7 +695,7 @@ "B": { "item": "homebooks", "chance": 35, "repeat": 3 }, "h": { "item": "coat_rack", "chance": 35, "repeat": 2 }, "p": { "item": "pool_table", "chance": 10, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_toilets": [ { "x": 10, "y": 20 }, { "x": 13, "y": 20 } ], "rows": [ @@ -799,7 +799,7 @@ "a": { "item": "pantry", "chance": 35, "repeat": 2 }, "B": { "item": "homebooks", "chance": 35, "repeat": 3 }, "Y": { "item": "coat_rack", "chance": 30, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_toilets": [ { "x": 12, "y": 5 }, { "x": 11, "y": 19 } ], "rows": [ @@ -923,7 +923,7 @@ "o": { "item": "oven", "chance": 30, "repeat": 2 }, "e": { "item": "pantry", "chance": 35, "repeat": 2 }, "Y": { "item": "coat_rack", "chance": 30, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "W": { "item": "laundry", "chance": 25, "repeat": 4 }, "f": { "item": "laundry", "chance": 25, "repeat": 4 } }, @@ -1046,7 +1046,7 @@ "o": { "item": "oven", "chance": 30, "repeat": 2 }, "c": { "item": "pantry", "chance": 35, "repeat": 2 }, "Y": { "item": "coat_rack", "chance": 30, "repeat": 2 }, - "P": { "item": "mail", "chance": 20, "repeat": 2 }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "W": { "item": "laundry", "chance": 25, "repeat": 4 }, "h": { "item": "laundry", "chance": 25, "repeat": 4 } }, @@ -1211,7 +1211,7 @@ "toilets": { "t": { } }, "items": { "B": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, "Y": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] } }, diff --git a/data/json/mapgen/house/house_fortified.json b/data/json/mapgen/house/house_fortified.json index af4bdb4457616..9c7f4b19b51c6 100644 --- a/data/json/mapgen/house/house_fortified.json +++ b/data/json/mapgen/house/house_fortified.json @@ -101,7 +101,7 @@ "toilets": { ";": { } }, "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "P": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 13, 14 ], "y": [ 18, 19 ], "chance": 80 }, diff --git a/data/json/mapgen/house/house_garage.json b/data/json/mapgen/house/house_garage.json index 58abf89eb9a32..6ba2ed6bf81c8 100644 --- a/data/json/mapgen/house/house_garage.json +++ b/data/json/mapgen/house/house_garage.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "...............sssssss..", + ".............Psssssss...", ".--vv--;--vv--=======--.", ".|ooo o o| e|.", ".| | |.", @@ -48,6 +48,7 @@ "B": "t_floor", "C": "t_floor", "O": "t_floor", + "P": "t_grass", "S": "t_floor", "T": "t_tree", "c": "t_floor", @@ -67,6 +68,7 @@ "B": "f_bathtub", "C": "f_cupboard", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "c": "f_counter", "d": "f_dresser", @@ -77,6 +79,7 @@ "o": "f_bookcase" }, "toilets": { "t": {} }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 13, 14 ], "y": [ 20, 21 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bedroom", "x": [ 6, 21 ], "y": [ 13, 20 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_garage2.json b/data/json/mapgen/house/house_garage2.json index 5dd2a066976c2..04c71184f7812 100644 --- a/data/json/mapgen/house/house_garage2.json +++ b/data/json/mapgen/house/house_garage2.json @@ -91,7 +91,7 @@ "r": "f_rack" }, "toilets": { "t": {} }, - "items": { "Y": { "item": "coat_rack", "chance": 35 }, "p": { "item": "mail", "chance": 20 } }, + "items": { "Y": { "item": "coat_rack", "chance": 35 }, "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 19, 20 ], "y": [ 19, 20 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bedroom", "x": [ 15, 21 ], "y": [ 18, 21 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_garage3.json b/data/json/mapgen/house/house_garage3.json index 014b99ceeef7c..5d0fb74a35a96 100644 --- a/data/json/mapgen/house/house_garage3.json +++ b/data/json/mapgen/house/house_garage3.json @@ -86,7 +86,7 @@ "o": "f_bookcase" }, "toilets": { "t": {} }, - "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 20, 21 ], "y": [ 19, 20 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bedroom", "x": [ 15, 21 ], "y": [ 18, 21 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_garage4.json b/data/json/mapgen/house/house_garage4.json index f9c1cfe75d6a0..c2fdcf6fb737c 100644 --- a/data/json/mapgen/house/house_garage4.json +++ b/data/json/mapgen/house/house_garage4.json @@ -82,7 +82,7 @@ "o": "f_bookcase" }, "toilets": { "t": {} }, - "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, "P": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 20, 21 ], "y": [ 19, 20 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bedroom", "x": [ 15, 21 ], "y": [ 18, 21 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_garage5.json b/data/json/mapgen/house/house_garage5.json index da824672762b3..9d8e78ab7b352 100644 --- a/data/json/mapgen/house/house_garage5.json +++ b/data/json/mapgen/house/house_garage5.json @@ -83,7 +83,7 @@ "o": "f_bookcase" }, "toilets": { "t": {} }, - "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, "P": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 12, 13 ], "y": [ 18, 19 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "homebooks", "x": [ 5, 6 ], "y": [ 12, 12 ], "chance": 45, "repeat": [ 1, 2 ] }, diff --git a/data/json/mapgen/house/house_garage6.json b/data/json/mapgen/house/house_garage6.json index f589e33baa285..dac80b8b75aea 100644 --- a/data/json/mapgen/house/house_garage6.json +++ b/data/json/mapgen/house/house_garage6.json @@ -109,7 +109,7 @@ }, "toilets": { "t": {} }, "items": { - "w": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] }, + "w": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "W": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] }, "Y": { "item": "laundry", "chance": 50, "repeat": [ 1, 10 ] } }, diff --git a/data/json/mapgen/house/house_garage7.json b/data/json/mapgen/house/house_garage7.json index 026f3ec4b01d2..beb136b18f711 100644 --- a/data/json/mapgen/house/house_garage7.json +++ b/data/json/mapgen/house/house_garage7.json @@ -100,7 +100,7 @@ "toilets": { "t": { } }, "items": { "Y": { "item": "coat_rack", "chance": 35, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "magazines", "x": [ 11, 11 ], "y": [ 6, 8 ], "chance": 50, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_garage8.json b/data/json/mapgen/house/house_garage8.json index 2870d8d0513de..123e8c13529e6 100644 --- a/data/json/mapgen/house/house_garage8.json +++ b/data/json/mapgen/house/house_garage8.json @@ -102,7 +102,7 @@ "t": "f_table" }, "toilets": { "t": { } }, - "items": { "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "magazines", "x": [ 5, 7 ], "y": [ 21, 21 ], "chance": 80, "repeat": [ 1, 2 ] }, { "group": "homebooks", "x": [ 9, 10 ], "y": [ 21, 21 ], "chance": 70, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house_garage_prepper.json b/data/json/mapgen/house/house_garage_prepper.json index bc3e3810d2ff4..297f2e767095e 100644 --- a/data/json/mapgen/house/house_garage_prepper.json +++ b/data/json/mapgen/house/house_garage_prepper.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_carpet_red", "rows": [ - "..............sssssss...", + ".............Psssssss...", ".--yy--;--yy--=======--.", ".|oooo o o|'''''''e|.", ".| |r'''''''|.", @@ -59,6 +59,7 @@ "H": "t_thconc_floor", "J": "t_window_reinforced", "N": "t_thconc_floor", + "P": "t_grass", "T": "t_tree", "U": "t_linoleum_white", "c": "t_thconc_floor", @@ -79,6 +80,7 @@ "H": "f_chair", "N": "f_table", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "U": "f_sink", "c": "f_counter", @@ -91,6 +93,7 @@ "r": "f_rack" }, "toilets": { "t": {} }, + "items": { "P": { "item": "mail", "chance": 35, "repeat": [ 2, 8 ] } }, "place_loot": [ { "group": "bed", "x": [ 13, 14 ], "y": [ 20, 21 ], "chance": 95, "repeat": [ 1, 3 ] }, { "group": "bedroom", "x": [ 6, 21 ], "y": [ 13, 20 ], "chance": 85, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_gardener.json b/data/json/mapgen/house/house_gardener.json index 4072c12cbeae6..46e5a3c15ed65 100644 --- a/data/json/mapgen/house/house_gardener.json +++ b/data/json/mapgen/house/house_gardener.json @@ -96,7 +96,7 @@ "toilets": { "t": { } }, "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, - "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "hydro", "x": [ 5, 5 ], "y": [ 16, 20 ], "chance": 90, "repeat": [ 1, 7 ] }, diff --git a/data/json/mapgen/house/house_library.json b/data/json/mapgen/house/house_library.json index 8977830b1b172..495ff05f76019 100644 --- a/data/json/mapgen/house/house_library.json +++ b/data/json/mapgen/house/house_library.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "........................", + "...............P........", ".--vv--;--vv-----------.", ".|Y Y|ooooo R|.", ".| |o v.", @@ -51,6 +51,7 @@ "Y": "t_floor", "R": "t_floor", "O": "t_floor", + "P": "t_grass", "S": "t_floor", "c": "t_floor", "d": "t_floor", @@ -73,6 +74,7 @@ "C": "f_cupboard", "K": "f_armchair", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "c": "f_counter", "d": "f_dresser", @@ -83,7 +85,10 @@ "r": "f_rack" }, "toilets": { "t": { } }, - "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] } }, + "items": { + "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } + }, "place_loot": [ { "group": "bed", "x": [ 10, 11 ], "y": [ 20, 21 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bed", "x": [ 18, 19 ], "y": [ 20, 21 ], "chance": 90, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house_modern_lx.json b/data/json/mapgen/house/house_modern_lx.json index ab99e897deadb..3c1a5e1943e74 100644 --- a/data/json/mapgen/house/house_modern_lx.json +++ b/data/json/mapgen/house/house_modern_lx.json @@ -83,7 +83,7 @@ "r": "f_rack" }, "toilets": { "t": { } }, - "items": { "Z": { "item": "mail", "chance": 25, "repeat": [ 1, 5 ] } }, + "items": { "Z": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 5, 6 ], "y": [ 19, 20 ], "chance": 90, "repeat": [ 1, 4 ] }, { "group": "bedroom", "x": [ 6, 7 ], "y": [ 19, 20 ], "chance": 80, "repeat": [ 1, 5 ] }, diff --git a/data/json/mapgen/house/house_patio.json b/data/json/mapgen/house/house_patio.json index 4f125c8de811f..b25d635b8c0de 100644 --- a/data/json/mapgen/house/house_patio.json +++ b/data/json/mapgen/house/house_patio.json @@ -134,7 +134,7 @@ "toilets": { "t": { } }, "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, - "P": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bedroom", "x": [ 15, 17 ], "y": [ 12, 14 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_porch.json b/data/json/mapgen/house/house_porch.json index 9f411378a38ec..ca5e375269780 100644 --- a/data/json/mapgen/house/house_porch.json +++ b/data/json/mapgen/house/house_porch.json @@ -102,7 +102,7 @@ "o": "f_bookcase" }, "toilets": { "t": { } }, - "items": { "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bedroom", "x": [ 18, 21 ], "y": [ 18, 21 ], "chance": 80, "repeat": [ 1, 4 ] }, { "group": "bed", "x": [ 20, 21 ], "y": [ 19, 20 ], "chance": 90, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house_prepper.json b/data/json/mapgen/house/house_prepper.json index 1463c2641b32c..2a0ef388f78ba 100644 --- a/data/json/mapgen/house/house_prepper.json +++ b/data/json/mapgen/house/house_prepper.json @@ -8,7 +8,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "........................", + "..............P.........", ".---22-----33----------.", ".| | | A; |.", ".| 7| + 2.", @@ -41,6 +41,7 @@ "2": "t_window_boarded", "3": "t_door_locked", "M": "t_door_metal_c", + "P": "t_grass", "[": "t_fence_v", "^": "t_tree", "z": "t_shrub", @@ -65,9 +66,11 @@ "E": "f_cupboard", "F": "f_fridge", "G": "f_oven", - "H": "f_armchair" + "H": "f_armchair", + "P": "f_mailbox" }, "toilets": { ";": { } }, + "items": { "P": { "item": "mail", "chance": 35, "repeat": [ 2, 8 ] } }, "place_items": [ { "item": "bed", "x": [ 6, 6 ], "y": [ 13, 13 ], "chance": 60 }, { "item": "bed", "x": [ 9, 9 ], "y": [ 13, 13 ], "chance": 60 }, diff --git a/data/json/mapgen/house/house_quiverfull.json b/data/json/mapgen/house/house_quiverfull.json index 245eb4ca396ef..22f6b5ed5d28e 100644 --- a/data/json/mapgen/house/house_quiverfull.json +++ b/data/json/mapgen/house/house_quiverfull.json @@ -19,7 +19,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "....................DDD.", + "........P...........DDD.", ".|---;;----vv----------.", ".|nK ?|S | hnnh C|.", ".|K ?|t B| hnnh C|.", @@ -56,6 +56,7 @@ "D": "t_dirt", "K": "t_floor", "O": "t_floor", + "P": "t_grass", "S": "t_floor", "U": "t_floor", "c": "t_floor", @@ -76,6 +77,7 @@ "D": "f_trashcan", "K": "f_armchair", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "U": "f_trashcan", "c": "f_counter", @@ -87,6 +89,7 @@ "o": "f_bookcase" }, "toilets": { "t": { } }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "livingroom", "x": [ 3, 8 ], "y": [ 2, 10 ], "chance": 90, "repeat": [ 1, 5 ] }, { "group": "kitchen", "x": [ 15, 20 ], "y": [ 2, 11 ], "chance": 75, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house_rural.json b/data/json/mapgen/house/house_rural.json index 5e98f5a18692e..0bd082a7dd74b 100644 --- a/data/json/mapgen/house/house_rural.json +++ b/data/json/mapgen/house/house_rural.json @@ -10,6 +10,7 @@ "4": "f_null", "7": "f_null", "H": "f_armchair", + "P": "f_mailbox", "S": "f_null", "_": "f_null", "a": "f_shower", @@ -25,6 +26,7 @@ "{": "f_fridge", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 75, "item": "fridge", "x": 5, "y": 14 }, { "chance": 55, "item": "trash", "x": 19, "y": 7 }, @@ -48,7 +50,7 @@ ".......#...__.___._....s", "._....._..___.__.....#..", "..s........__.__.....4._", - "...........__.__.#.....4", + "..........P__.__.#.....4", ".7.###s#...______.4.#...", ".||w||||||.______...7#..", "_|bb|{occw._______..#...", @@ -70,6 +72,7 @@ "4": "t_tree_pine", "7": "t_tree", "H": "t_floor", + "P": "t_grass", "S": "t_sidewalk", "_": "t_dirt", "a": "t_floor", @@ -103,6 +106,7 @@ "7": "f_null", "F": "f_fridge", "H": "f_armchair", + "P": "f_mailbox", "S": "f_null", "T": "f_toilet", "_": "f_null", @@ -118,6 +122,7 @@ "{": "f_bookcase", "|": "f_null" }, + "items": { "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_items": [ { "chance": 55, "item": "homebooks", "x": 3, "y": 14 }, { "chance": 65, "item": "cannedfood", "x": 5, "y": 17 }, @@ -138,7 +143,7 @@ "place_toilets": [ { "x": 7, "y": 9 } ], "rows": [ "........._.__.__..._....", - "..7..s.1...__.__...7#...", + "..7..s.1..P__.__...7#...", "._.........__.__........", "...##ss#_..__.__..1...1.", "..||||w||..__.__....#.._", @@ -172,6 +177,7 @@ "7": "t_tree", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_sidewalk", "T": "t_floor", "_": "t_dirt", diff --git a/data/json/mapgen/house/house_rv.json b/data/json/mapgen/house/house_rv.json index f2cfc09a4b79d..1a14ba64c7193 100644 --- a/data/json/mapgen/house/house_rv.json +++ b/data/json/mapgen/house/house_rv.json @@ -81,7 +81,7 @@ "r": "f_rack" }, "toilets": { "t": {} }, - "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "bed", "x": [ 2, 3 ], "y": [ 18, 19 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "livingroom", "x": [ 12, 21 ], "y": [ 2, 6 ], "chance": 90, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_suicide.json b/data/json/mapgen/house/house_suicide.json index a0cfa41debea5..c749d985d6d24 100644 --- a/data/json/mapgen/house/house_suicide.json +++ b/data/json/mapgen/house/house_suicide.json @@ -62,7 +62,7 @@ "r": "f_rack" }, "toilets": { "t": {} }, - "items": { "p": { "item": "mail", "chance": 20, "repeat": [ 1, 5 ] } }, + "items": { "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } }, "place_loot": [ { "group": "dresser", "x": [ 18, 18 ], "y": [ 20, 20 ], "chance": 80, "repeat": [ 1, 4 ] }, { "group": "dresser", "x": [ 20, 20 ], "y": [ 8, 8 ], "chance": 80, "repeat": [ 1, 4 ] }, diff --git a/data/json/mapgen/house/house_tool_shed.json b/data/json/mapgen/house/house_tool_shed.json index 29cf1ce27d0ea..4863b9c92061d 100644 --- a/data/json/mapgen/house/house_tool_shed.json +++ b/data/json/mapgen/house/house_tool_shed.json @@ -7,7 +7,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - ".###....................", + ".###...............P....", ".#-----v---v---;-------.", ".#|B |d k|Y hnnh v.", ".#vt | @@ | hnnh v.", @@ -56,6 +56,7 @@ "l": "t_floor", "D": "t_floor", "O": "t_floor", + "P": "t_grass", "Q": "t_fence_h", "S": "t_floor", "T": "t_tree", @@ -80,6 +81,7 @@ "Y": "f_rack_coat", "l": "f_stool", "O": "f_oven", + "P": "f_mailbox", "S": "f_sink", "c": "f_counter", "d": "f_dresser", @@ -90,7 +92,10 @@ "r": "f_rack" }, "toilets": { "t": { } }, - "items": { "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] } }, + "items": { + "Y": { "item": "coat_rack", "chance": 30, "repeat": [ 1, 4 ] }, + "P": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] } + }, "place_loot": [ { "group": "bed", "x": [ 8, 9 ], "y": [ 3, 4 ], "chance": 90, "repeat": [ 1, 3 ] }, { "group": "bed", "x": [ 4, 5 ], "y": [ 7, 8 ], "chance": 90, "repeat": [ 1, 3 ] }, diff --git a/data/json/mapgen/house/house_vacant.json b/data/json/mapgen/house/house_vacant.json index baa6e7b075ef0..dc2bd8d11aac8 100644 --- a/data/json/mapgen/house/house_vacant.json +++ b/data/json/mapgen/house/house_vacant.json @@ -232,6 +232,7 @@ "furniture": { ".": "f_null", "0": "f_null", + "A": "f_mailbox", "P": "f_null", "_": "f_null", "c": "f_null", @@ -280,7 +281,7 @@ ], "rows": [ "...gc.c.c...psp.c......g", - "gc.......c..Psp.....g.c.", + "gc.......c.APsp.....g.c.", "...p.p..cppcPsp.p..pcp..", "...........cpsPc..c...c.", "...c..c..c..psp.c...g...", @@ -307,6 +308,7 @@ "terrain": { ".": "t_dirt", "0": "t_window_frame", + "A": "t_dirt", "P": "t_pit", "_": "t_floor", "c": "t_dirt", @@ -341,6 +343,7 @@ ".": "f_null", "C": "f_counter", "D": "f_null", + "P": "f_mailbox", "T": "f_toilet", "W": "f_null", "_": "f_null", @@ -384,7 +387,7 @@ ], "rows": [ "...gc.c.cg.gfsfgc.g...gg", - "g.....g..c..bsb..g..g.c.", + "g.....g..c.Pbsb..g..g.c.", "..----------fsf-------.g", ".g.c..g...gcbsbc.....gc.", "...cg....c..fsfgc.g.g...", @@ -416,6 +419,7 @@ ".": "t_dirt", "C": "t_floor", "D": "t_door_c", + "P": "t_grass", "T": "t_floor", "W": "t_wall_glass_alarm", "_": "t_floor", @@ -452,6 +456,7 @@ ".": "f_null", "0": "f_null", "D": "f_dumpster", + "P": "f_mailbox", "_": "f_null", "b": "f_null", "c": "f_null", @@ -498,7 +503,7 @@ ], "rows": [ "...gc.c.c...s...c......g", - "gg..........s..g....g.cg", + "gg..........sP.g....g.cg", ".gg.p{D..g..s.....g...g.", "g..g.p.....cs.g..g...gcg", ".g..g.c.gssssss.....g.gg", @@ -528,6 +533,7 @@ ".": "t_dirt", "0": "t_window_frame", "D": "t_grass", + "P": "t_dirt", "_": "t_floor", "b": "t_brick_wall_halfway", "c": "t_grass", @@ -558,6 +564,7 @@ "C": "f_cupboard", "D": "f_null", "F": "f_fridge", + "P": "f_mailbox", "S": "f_shower", "^": "f_rubble", "_": "f_null", @@ -622,7 +629,7 @@ ], "place_toilets": [ { "x": 20, "y": 11 } ], "rows": [ - "d.d.cdcdcd.ds..dcd..d.d.", + "d.d.cdcdcd.ds.Pdcd..d.d.", "..d.^^.dd.d.s.....dd.dc.", "d..d0{a...dds..d.....d.d", ".d..d0.ddd.cs.........c.", @@ -657,6 +664,7 @@ "C": "t_floor", "D": "t_door_o", "F": "t_floor", + "P": "t_grass", "S": "t_floor", "^": "t_grass", "_": "t_floor", @@ -707,6 +715,7 @@ "#": "f_null", ".": "f_null", "0": "f_null", + "A": "f_mailbox", "P": "f_null", "^": "f_rubble", "_": "f_null", @@ -791,7 +800,7 @@ { "chance": 10, "item": "hardware", "x": 10, "y": 6 } ], "rows": [ - ".g.pppppp..cg...cg...cg.", + ".g.pppppp.Acg...cg...cg.", "g..pppp^^ssssss..gc.g..g", "gg.{{pp^^.c..ss..c..gc.g", "...pppppp. c.ssg........", @@ -821,6 +830,7 @@ "#": "t_wall_half", ".": "t_dirt", "0": "t_window_frame", + "A": "t_grass", "P": "t_palisade_gate_o", "^": "t_pavement", "_": "t_floor", @@ -850,6 +860,7 @@ "+": "f_null", "-": "f_null", ".": "f_null", + "A": "f_mailbox", "C": "f_null", "D": "f_null", "F": "f_flower_marloss", @@ -920,7 +931,7 @@ ], "place_toilets": [ { "x": 19, "y": 10 } ], "rows": [ - "d.dppppppddC.dddC.dddC.d", + "d.dppppppddA.dddC.dddC.d", "..dpppp{psss...d...d.dd.", "...pppp{pd.ddssd...d.Cd.", "dd.ppppppd Cdss..dddd..d", @@ -952,6 +963,7 @@ "+": "t_door_metal_pickable", "-": "t_fence_v", ".": "t_grass", + "A": "t_grass", "C": "t_grass", "D": "t_door_o", "F": "t_shrub", @@ -1000,6 +1012,7 @@ "0": "f_null", "C": "f_null", "D": "f_dumpster", + "P": "f_mailbox", "_": "f_null", "c": "f_null", "d": "f_null", @@ -1062,7 +1075,7 @@ ], "rows": [ "g........s..........c.gg", - "g..gg.cg.s.c.g.c.....g..", + "g..gg.cg.s.P.g.c.....g..", ".gcg..c..sg......g.g.g..", ".g.......s...{D.......g.", "cg....g..s.........c.g.g", @@ -1092,6 +1105,7 @@ "0": "t_window_frame", "C": "t_concrete", "D": "t_dirt", + "P": "t_grass", "_": "t_floor", "c": "t_grass", "d": "t_door_frame", @@ -1118,6 +1132,7 @@ "C": "f_null", "D": "f_dumpster", "F": "f_fridge", + "P": "f_mailbox", "T": "f_toilet", "_": "f_null", "a": "f_cupboard", @@ -1169,7 +1184,7 @@ "place_toilets": [ { "x": 19, "y": 15 } ], "rows": [ "_._._..._s......._..c.__", - "_____.c_.s.c._.c.{..._..", + "_____.cP.s.c._.c.{..._..", "._c_..c..s_......D._._._", "._._.....s._..c..._..._.", "c_...._._s_....._..c._._", @@ -1201,6 +1216,7 @@ "C": "t_concrete", "D": "t_grass", "F": "t_floor", + "P": "t_dirt", "X": "t_floor", "T": "t_floor", "_": "t_grass", @@ -1492,6 +1508,7 @@ ".": "f_null", "7": "f_null", "D": "f_null", + "P": "f_mailbox", "S": "f_sink", "_": "f_null", "c": "f_counter", @@ -1519,7 +1536,7 @@ { "chance": 25, "item": "hardware_trash", "x": 16, "y": 10 } ], "rows": [ - "_________________d______", + "__________P______d______", "_d______________________", "____dd___d________d_____", "_||ww||__7_#s#||----||__", @@ -1552,6 +1569,7 @@ ".": "t_floor", "7": "t_tree", "D": "t_door_o", + "P": "t_grass", "S": "t_floor", "_": "t_grass", "c": "t_floor", @@ -1575,7 +1593,7 @@ { "chance": 50, "item": "2x4", "repeat": 1, "x": 12, "y": 16 }, { "chance": 50, "item": "2x4", "repeat": 1, "x": 17, "y": 17 } ], - "furniture": { "#": "f_null", ".": "f_null", "_": "f_null", "s": "f_null", "t": "f_null", "|": "f_null" }, + "furniture": { "#": "f_null", ".": "f_null", "_": "f_null", "P": "f_mailbox", "s": "f_null", "t": "f_null", "|": "f_null" }, "place_items": [ { "chance": 20, "item": "hardware_trash", "x": 6, "y": 17 }, { "chance": 20, "item": "hardware_trash", "x": 7, "y": 13 }, @@ -1590,7 +1608,7 @@ { "chance": 10, "item": "trash", "x": 6, "y": 6 } ], "rows": [ - "...............s.d......", + ".............P.s.d......", ".....d.........s........", "..d........d...s......d.", ".......d.......s..d.....", @@ -1620,6 +1638,7 @@ ".": "t_grass", "_": "t_floor", "O": "t_window_frame", + "P": "t_grass", "s": "t_sidewalk", "d": "t_dirt", "t": "t_thconc_floor", @@ -1640,6 +1659,7 @@ "-": "f_null", ".": "f_null", "D": "f_null", + "P": "f_mailbox", "T": "f_toilet", "_": "f_null", "a": "f_null", @@ -1665,7 +1685,7 @@ { "chance": 10, "item": "hardware_clothing", "x": 14, "y": 16 } ], "rows": [ - "...............s........", + ".............P.s........", "...............s..d..d..", ".dd..d.......d.s........", "...............s.d......", @@ -1697,6 +1717,7 @@ "-": "t_fence_h", ".": "t_grass", "D": "t_door_o", + "P": "t_grass", "T": "t_floor", "_": "t_floor", "a": "t_door_metal_c", @@ -1736,6 +1757,7 @@ "f": "f_fridge", "g": "f_toilet", "o": "f_oven", + "p": "f_mailbox", "s": "f_null", "t": "f_null", "w": "f_null", @@ -1778,7 +1800,7 @@ ], "place_toilets": [ { "x": 21, "y": 19 } ], "rows": [ - "...cccccc...............", + "..pcccccc...............", "...ccccccP..............", "...ccccccss||www||www||.", "...ccccccss|__________|.", @@ -1821,6 +1843,7 @@ "f": "t_floor", "g": "t_floor", "o": "t_floor", + "p": "t_grass", "s": "t_sidewalk", "t": "t_thconc_floor", "w": "t_window_domestic", @@ -1858,6 +1881,7 @@ "h": "f_toilet", "i": "f_trashcan", "o": "f_oven", + "p": "f_mailbox", "s": "f_null", "t": "f_null", "w": "f_null", @@ -1904,7 +1928,7 @@ ], "place_toilets": [ { "x": 21, "y": 19 } ], "rows": [ - "...cccccc...............", + "...cccccc..p............", "...cccccc...............", "..Pccccccss||www||www||.", "...ccccccss|_________a|.", @@ -1950,6 +1974,7 @@ "h": "t_floor", "i": "t_thconc_floor", "o": "t_floor", + "p": "t_grass", "s": "t_sidewalk", "t": "t_thconc_floor", "w": "t_window_domestic", @@ -1978,6 +2003,7 @@ "D": "f_null", "H": "f_sofa", "O": "f_safe_o", + "P": "f_mailbox", "S": "f_shower", "T": "f_toilet", "_": "f_null", @@ -2029,7 +2055,7 @@ "rows": [ "ssssssssssssssssssssssss", "ssssssssssssssssssssssss", - "...........ss...........", + "...........ss.P.........", "..||##|##||ss||##|##||..", "..|__BB_d_|ss|tttttt_|..", "..#H______|D#|_tt____#..", @@ -2064,6 +2090,7 @@ "D": "t_door_metal_c_peep", "H": "t_floor", "O": "t_floor", + "P": "t_grass", "S": "t_floor", "T": "t_floor", "_": "t_floor", @@ -2100,6 +2127,7 @@ "D": "f_displaycase", "F": "f_fridge", "H": "f_sofa", + "P": "f_mailbox", "S": "f_shower", "T": "f_toilet", "^": "f_indoor_plant", @@ -2152,7 +2180,7 @@ "rows": [ "ssssssssssssssssssssssss", "ssssssssssssssssssssssss", - "...........ss...........", + ".........P.ss...........", "..||--|--||ss||--|--||..", "..|A#HHH#A|ss|B______|..", "..-_______|e-|B_a##a_-..", @@ -2187,6 +2215,7 @@ "D": "t_floor", "F": "t_floor", "H": "t_floor", + "P": "t_grass", "S": "t_floor", "T": "t_floor", "^": "t_floor", diff --git a/data/json/mapgen/lab/README.md b/data/json/mapgen/lab/README.md new file mode 100644 index 0000000000000..14ba1d2c7b3b5 --- /dev/null +++ b/data/json/mapgen/lab/README.md @@ -0,0 +1,125 @@ +# Lab JSON Quick Guide + +Labs are heavily randomized but have very few actual overmap terrain tiles, meaning that variety in the maps gets almost entirely using JSON. In particular, labs use place_nested extensively to randomly select submaps, such as new lab rooms. + + +## Quick Guide for new lab areas: + +In lab_floorplans.json add a new mapgen json with om_terrain of lab_4side. + +Keep the middle 2 spaces of each border clear, because that's where doors open out to. Some or all of the border spaces will be turned into 1-width walls between lab sections, so make sure the map 'works' whether or not the outermost spaces are created or not (by keeping them clear, or having 'disposable' furniture like counters, lockers, broken consoles, etc). Allow rotation. + +To add a lab finale instead, use the om_terrain of lab_finale_1level and put your JSON in lab_floorplans_finale1level.json instead. + + +## Quick Guide for new lab dead-ends: + +In lab_floorplans_1side.json add a new mapgen json with om_terrain of lab_1side. + +Make the area facing north, keeping the 2 middle spaces of the northern border clear because that's where doors open out to. If you want to have a locked area, set the floor to 't_strconc_floor' and stairs won't appear there (this floor is ',' in the lab_palette). Use place_nested to place 'lab_1side_border_doors' at coords [0,0]. Do not allow rotation. + + +## Quick Guide for new lab rooms: + +In lab_rooms.json add a new mapgen json with a nested_mapgen_id of lab_room_7x7 or lab_room_9x9 with a mapgensize of [7,7] or [9,9]. + +In some rare cases the first row or column of terrain may be replaced with a border wall, so prefer layouts that look intact even if that occurs. + +If your layout needs to know where the doors of the room will open up into, instead use a nested_mapgen_id of lab_room_7x7_crossdoors and lab_room_9x9_crossdoors which will ensure that doors only appear in the exact middle of a wall. + + +# Lab JSON Full Guide + +## How area mapgen json works + +A lab is mostly made out of overmap tiles of type 'lab', 'lab_stairs', and typically one 'lab_finale'. + +Lab terrain needs special treatment: stairs, border walls, dead-ends, and more, so JSON instead uses three 'fake' overmap tile types. Create a JSON mapgen object with om_terrain set to one of these, and the code will convert it and place it correctly on the map. + +* lab_1side - placed when exactly one lab is adjacent, maps should assume a north-facing entrance. Do not allow rotation. +* lab_finale_1level - placed at the bottom of a lab on terrain types. Rotation optional. +* lab_4side - all the other maps. Rotation optional. + + +## Border walls + +Labs have unusual borders: 1-width walls between lab areas, laid out on the south and east side of those tiles, potentially with metal doors in the middle of them, like so: + +``` + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " M", + " M", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + " |", + "-----------MM----------|" +``` + +If a north or west neighbor isn't a lab, the entire side gets needs to be overwritten with a wall, replacing whatever was normally there. If the east or south neighbor isn't a lab, that door needs to be overwritten with a wall. + +Some JSON maps can start from the above layout, disable rotation, and call place_nested with the 'lab_border_walls' chunk in JSON. In this case, borders will be perfect and no additional code will fire. + +But if borders have not been managed (determined by checking for the presence of an east-facing door/wall), then the code will create the lab border walls and doors on all four directions. + +'lab_border_walls' does not work on rotated maps, so rotated maps need to rely on hardcoded border wall generation. This is preferable because it creates more variety. So if a map layout is amenable to not knowing if the final 1x1 border around it will be placed or not, it is preferable to allow rotation and not place 'lab_border_walls'. + +One middle-ground: If just part of the map needs to cares about where the border wall is to look correct, put a wall on the east-side of the map and only allow rotation of [0,1]. That will ensure the wall gets placed on the east or south side of the map in the final rotation. See the "electricity room" floorplan for an example of this. + + +## Other hardcoded map generation + +Labs will have a small chance of randomly getting lights, the central & tower labs will always get them. Stairs will be placed on any empty thconc_floor space if the overmap indicated stairs. There's also a 10% chance of special effects like flooding, portals, radiation accidents, etc. Ant-infested labs will get bashed in. + +None of these require json changes to enact, but JSON-ideas for lab special effects in rooms can be added to the spawn tables in lab_maybe_effects_7x7 and lab_maybe_effects_9x9. Currently this just adds spider-infestations. + + +## Room generation + +The most common source of randomness *within* a map is to create a 7x7 or 9x9 room and give it random contents by using place_nested. Don't place rooms directly, instead we use an intermediate map chunk called a 'spawn' which encodes more information and randomizes between all the kinds of rooms that would satisify those requirements. + +* lab_spawn_7x7 - a 7x7 room with no guarantees on where the doors are. +* lab_spawn_7x7_crossdoors - a 7x7 room with doors only in the middle of each border wall. +* lab_spawn_9x9 - a 9x9 room with no guarantees on where the doors are. +* lab_spawn_9x9_crossdoors - a 9x9 room with doors only in the middle of each borders wall. + +Selecting a spawn will randomize between: lab_room_[size] plus the _rare variants, and the _crossdoors variants if applicable. + +If your room is also amenable to having two of its walls redefined, you can also use these spawns to add in more randomized rooms that might modify the walls by adding windows, replacing walls with chainlink, or creating multiple doors and interior walls. These templates assume that there are no doors on the two walls which are not part of this submap. Note these submaps are sized 8x8 and 10x10 because they include the walls to be modified. + +* lab_spawn_7x7_wall_nw +* lab_spawn_7x7_wall_sw +* lab_spawn_9x9_wall_nw +* lab_spawn_9x9_wall_sw + +Use the most specific spawn possible. + + +## Directory + +* lab_central.json - hardcoded maps for the top of central lab. +* lab_common.json - terrain palette, loot palettes, common json objects. +* lab_escape.json - maps specifically for lab challenge escape, these are special placed on lvl 4 of a lab. +* lab_floorplan_cross.json - cross floorplans are unusual for having rock infill when bordering the edge of the lab, with rare vaults. +* lab_floorplans.json - the main source of lab layouts. +* lab_floorplans_1side.json - dead-end floor plans. +* lab_floorplans_finale1level.json - finale floorplans. +* lab_rooms.json - randomized rooms. +* lab_rooms_wall.json - randomized rooms which rewrite the wall borders. +* lab_trains.json - tiles for the lab science train which rarely happens on levels 2 & 4. \ No newline at end of file diff --git a/data/json/mapgen/lab/lab_escape.json b/data/json/mapgen/lab/lab_escape.json new file mode 100644 index 0000000000000..c918ba631d1e8 --- /dev/null +++ b/data/json/mapgen/lab/lab_escape.json @@ -0,0 +1,223 @@ +[ + { + "//": "Cells where the player starts during a lab escape.", + "type": "mapgen", + "method": "json", + "om_terrain": [ "lab_escape_cells" ], + "weight": 100, + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "########################", + "-----------------------|", + "|x.....................|", + "|......................|", + "--Lg--Lg--Lg--Lg--Lg-..|", + "|T..|T..|T..|T..|T..|..|", + "|S..|S..|S..|S..|S..|..|", + "|...|...|...|...|...|..|", + "|..b|h.b|..b|..b|..b|..|", + "|z.b|z.b|..b|..b|..b|..|", + "|h..|h..|h..|h.z|h.z|.x|", + "-ggg|ggg|g!g|ggg|ggg-L-|" + ], + "palettes": [ "lab_palette" ], + "monster": { + "z": { "monster": "mon_zombie" } + }, + "mapping": { + "b": { "items": [ { "item": "bed", "chance": 66 } ] }, + "!": { "item": [ { "item": "glass_shard", "count": [3,6] } ] } + } + } + }, + { + "//": "South of cells where the player starts during a lab escape. Should include a monster who can break glass", + "type": "mapgen", + "method": "json", + "om_terrain": [ "lab_escape_entrance" ], + "weight": 100, + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "|......................|", + "x.....................Z|", + "----|-------|-------|++|", + "....| | |..|", + "hh..| | |..|", + "tt..| | |..|", + "hh..? | +..|", + "....| | |..|", + "hh..| | |..|", + "tt..| | |..|", + "hh..|---+---|---?---|..|", + ".......................M", + ".......................M", + "-----?----|..|----+----|", + " |..| |", + " |..| |", + " |..| |", + " |..| |", + " +..? |", + " |..| |", + " |..| |", + " |..| |", + " |..| |", + "-----------MM----------|" + ], + "palettes": [ "lab_palette", "lab_loot_research" ], + "terrain": { + "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_c" ] + }, + "monster": { + "Z": { "monster": "mon_zombie_brute" } + }, + "place_nested": [ + { "chunks": [ "lab_spawn_7x7_wall_sw" ], "x": 4, "y": 3 }, + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 13, "y": 3 }, + { "chunks": [ "lab_spawn_9x9" ], "x": [ 0, 1 ], "y": 14 }, + { "chunks": [ "lab_spawn_9x9_wall_nw" ], "x": 13, "y": 13 }, + { "chunks": [ "lab_border_walls_sew" ], "x": 0, "y": 0 }, + { "chunks": [ "sub_t_stairs_up" ], "x": [11, 12], "y": [20, 21], "neighbors": { "above": [ "lab_stairs" ] } } + ] + } + }, + { + "//": "South of cells where the player starts during a lab escape. Should include a monster who can break glass", + "type": "mapgen", + "method": "json", + "om_terrain": [ "lab_escape_entrance" ], + "weight": 100, + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "|......................|", + "xZ.....................|", + "--+--------------------|", + ".......................|", + "hh.....................|", + "tt..-----------------..|", + "hh..| | |..|", + "....| | |..|", + "hh..| | |..|", + "tt..+ | +..|", + "hh..| | |..|", + "....| | |..M", + "....| | |..M", + "--+-------|--|--?----?-|", + " |TS| |", + " |..| |", + " |-W| |", + " |..| |", + " +..+ |", + " |..| |", + " |..| |", + " |..| |", + " |..| |", + "-----------MM----------|" + ], + "palettes": [ "lab_palette", "lab_loot_research" ], + "terrain": { + "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_c" ] + }, + "monster": { + "Z": { "monster": "mon_zombie_brute" } + }, + "place_nested": [ + { "chunks": [ "lab_spawn_7x7_wall_nw" ], "x": 4, "y": 5 }, + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 13, "y": 6 }, + { "chunks": [ "lab_spawn_9x9" ], "x": [ 0, 1 ], "y": 14 }, + { "chunks": [ "lab_spawn_9x9" ], "x": 14, "y": 14 }, + { "chunks": [ "lab_border_walls_sew" ], "x": 0, "y": 0 }, + { "chunks": [ "sub_t_stairs_up" ], "x": [11, 12], "y": [20, 21], "neighbors": { "above": [ "lab_stairs" ] } } + ] + } + }, + { + "//": "Cross floorplan which fills a quadrant with rocks when a side is empty, and possibly adds vaults.", + "type": "mapgen", + "method": "json", + "om_terrain": [ "lab_escape_entrance" ], + "weight": 100, + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + ".......................|", + ".......................|", + ".d......-----..........|", + ".dh.....ddxdd......|---|", + ".d......d.h.d......|c.c|", + "..................l|c.c|", + "....Z.............l|c.c|", + "---+---|---?---|-----+-|", + " | | |", + " | | |", + " | | |", + " ? + M", + " | | M", + " | | |", + " | | |", + "---+---|---+---|---?---|", + " | | |", + " | | |", + " | | |", + " + + |", + " | | |", + " | | |", + " | | |", + "-----------MM----------|" + ], + "palettes": [ "lab_palette", "lab_loot_research" ], + "terrain": { + "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_c" ] + }, + "monster": { + "Z": { "monster": "mon_zombie_brute" } + }, + "place_nested": [ + { "chunks": [ "lab_spawn_7x7" ], "x": 0, "y": 8 }, + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 0, "y": 16 }, + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 8, "y": 8 }, + { "chunks": [ "lab_spawn_7x7" ], "x": 8, "y": 16 }, + { "chunks": [ "lab_spawn_7x7" ], "x": 16, "y": 8 }, + { "chunks": [ "lab_spawn_7x7_wall_nw" ], "x": 15, "y": 15 }, + { "chunks": [ "lab_border_walls_sew" ], "x": 0, "y": 0 }, + { "chunks": [ "sub_t_stairs_up" ], "x": 21, "y": 4, "neighbors": { "above": [ "lab_stairs" ] } } + ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "sub_t_stairs_up", + "object": { "rows": [ "<" ], "terrain": { "<": [ "t_stairs_up" ] }, "mapgensize": [ 1, 1 ] } + }, + { + "//": "Creates border walls for a lab based on its neighboring tiles, but only south east and west.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_border_walls_sew", + "object": { + "mapgensize": [ 24, 24 ], + "place_nested": [ + { "else_chunks": [ "sub_t_concrete_wall" ], "x": 11, "y": 23, "neighbors": { "south": [ "lab" ] } }, + { "else_chunks": [ "sub_t_concrete_wall" ], "x": 12, "y": 23, "neighbors": { "south": [ "lab" ] } }, + { "else_chunks": [ "sub_t_concrete_wall" ], "x": 23, "y": 11, "neighbors": { "east": [ "lab" ] } }, + { "else_chunks": [ "sub_t_concrete_wall" ], "x": 23, "y": 12, "neighbors": { "east": [ "lab" ] } }, + { "else_chunks": [ "lab_west_wall" ], "x": 0, "y": 0, "neighbors": { "west": [ "lab" ] } } + ] + } + } +] diff --git a/data/json/mapgen/lab/lab_floorplan_cross.json b/data/json/mapgen/lab/lab_floorplan_cross.json index fc8f391dee08e..2836abdd5c7b9 100644 --- a/data/json/mapgen/lab/lab_floorplan_cross.json +++ b/data/json/mapgen/lab/lab_floorplan_cross.json @@ -40,7 +40,7 @@ { "chunks": [ "lab_spawn_9x9" ], "x": [0, 1], "y": [0, 1], "neighbors": { "north": ["lab", "open_air"], "west": ["lab", "open_air"] } }, { "chunks": [ "lab_spawn_9x9" ], "x": 14, "y": [0,1], "neighbors": { "north": ["lab", "open_air"], "east": ["lab", "open_air"] } }, { "chunks": [ "lab_spawn_9x9" ], "x": [0,1], "y": 14, "neighbors": { "south": ["lab", "open_air"], "west": ["lab", "open_air"] } }, - { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 14, "y": 14, "neighbors": { "south": ["lab", "open_air"], "east": ["lab", "open_air"] } }, + { "chunks": [ "lab_spawn_9x9_wall_nw" ], "x": 13, "y": 13, "neighbors": { "south": ["lab", "open_air"], "east": ["lab", "open_air"] } }, { "chunks": [ "lab_border_rock_quadrants" ], "x": 0, "y": 0 } ] } @@ -86,7 +86,7 @@ { "chunks": [ "lab_spawn_9x9" ], "x": [0, 1], "y": [0, 1], "neighbors": { "north": ["lab", "open_air"], "west": ["lab", "open_air"] } }, { "chunks": [ "lab_spawn_9x9" ], "x": 14, "y": [0,1], "neighbors": { "north": ["lab", "open_air"], "east": ["lab", "open_air"] } }, { "chunks": [ "lab_spawn_9x9" ], "x": [0,1], "y": 14, "neighbors": { "south": ["lab", "open_air"], "west": ["lab", "open_air"] } }, - { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 14, "y": 14, "neighbors": { "south": ["lab", "open_air"], "east": ["lab", "open_air"] } }, + { "chunks": [ "lab_spawn_9x9_wall_nw" ], "x": 13, "y": 13, "neighbors": { "south": ["lab", "open_air"], "east": ["lab", "open_air"] } }, { "chunks": [ "lab_border_rock_quadrants" ], "x": 0, "y": 0 } ] } @@ -446,20 +446,36 @@ { "type": "palette", "id": "lab_loot_bionic_vault", - "mapping": { "c": { "items": [ { "item": "bionics_common", "chance": 50 }, { "item": "bionics", "chance": 10 } ] } + "mapping": { "r": { "items": [ { "item": "bionics_common", "chance": 50 }, { "item": "bionics", "chance": 10 } ] } }, - "terrain": { "c": "t_floor_blue" }, + "terrain": { "r": "t_strconc_floor" }, "computers": { "6": { - "name": "Bionic Vault", "security": 6, + "name": "Bionic Vault", "security": 3, "options": [ { "name": "MANIFEST", "action": "list_bionics", "security": 0 }, - { "name": "UNLOCK ENTRANCE", "action": "unlock", "security": 7 } + { "name": "UNLOCK ENTRANCE", "action": "unlock_disarm", "security": 7 } ], "failures": [ { "action": "damage" }, { "action": "secubots" }, { "action": "shutdown" } ] } } }, + { + "type": "palette", + "id": "lab_loot_serum_vault", + "mapping": { "r": { "items": [ { "item": "mut_iv", "chance": 50 } ] } + }, + "terrain": { "r": "t_strconc_floor" }, + "computers": { + "6": { + "name": "Advanced PE012 Samples", "security": 3, + "options": [ + { "name": "UNLOCK ENTRANCE", "action": "unlock_disarm", "security": 5 } + ], + "failures": [ { "action": "damage" }, { "action": "manhacks" }, { "action": "shutdown" } ] + } + } + }, { "type": "mapgen", "method": "json", @@ -469,10 +485,10 @@ "rows": [ " #### ", " ------ ", - " |c,,c| ", - " |c,,c| ", - " |c,,c| ", - " |c,,c| ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", " |-,,-| ", " |,,| ", " |,,| ", @@ -480,7 +496,6 @@ " |...6| ", " ", " ", - " - - ", " ", " ", " ", @@ -490,9 +505,83 @@ " ", " ", " ", + " ", + " " + ], + "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 2, 5 ], "chance": 25 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_n_vault", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " #### ", + " ------ ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", + " |-,,-| ", + " |,,| ", + " |,,| ", + " --LL-- ", + " |...6| ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "palettes": [ "lab_palette", "lab_loot_serum_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 2, 5 ], "chance": 10 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_w_vault", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ------ -- ", + "#|rrrr|--|6 - ", + "#|,,,,,,,L. ", + "#|,,,,,,,L. ", + "#|rrrr|--|. ", + " ------ -- ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", " " ], - "palettes": [ "lab_palette", "lab_loot_bionic_vault" ] + "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 2, 5 ], "y": [ 11, 12 ], "chance": 25 } ] } }, { @@ -512,10 +601,10 @@ " ", " ", " ------ -- ", - "#|cccc|--|6 - ", + "#|rrrr|--|6 - ", "#|,,,,,,,L. ", "#|,,,,,,,L. ", - "#|cccc|--|. - ", + "#|rrrr|--|. ", " ------ -- ", " ", " ", @@ -527,7 +616,44 @@ " ", " " ], - "palettes": [ "lab_palette", "lab_loot_bionic_vault" ] + "palettes": [ "lab_palette", "lab_loot_serum_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 2, 5 ], "y": [ 11, 12 ], "chance": 10 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_s_vault", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " - - ", + " ", + " ", + " |6...| ", + " --LL-- ", + " |,,| ", + " |,,| ", + " |-,,-| ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", + " ------ ", + "####################### " + ], + "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 18, 21 ], "chance": 25 } ] } }, { @@ -555,14 +681,51 @@ " |,,| ", " |,,| ", " |-,,-| ", - " |c,,c| ", - " |c,,c| ", - " |c,,c| ", - " |c,,c| ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", + " |r,,r| ", " ------ ", "####################### " ], - "palettes": [ "lab_palette", "lab_loot_bionic_vault" ] + "palettes": [ "lab_palette", "lab_loot_serum_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 11, 12 ], "y": [ 18, 21 ], "chance": 10 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_e_vault", + "object": { + "mapgensize": [ 24, 24 ], + "rows": [ + " ", + " #", + " #", + " #", + " #", + " #", + " #", + " #", + " #", + " -- ------#", + " - .|--|rrrr|#", + " .L,,,,,,,|#", + " .L,,,,,,,|#", + " - 6|--|rrrr|#", + " -- ------#", + " #", + " #", + " #", + " #", + " #", + " #", + " #", + " #", + " " + ], + "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 18, 21 ], "y": [ 11, 12 ], "chance": 25 } ] } }, { @@ -582,10 +745,10 @@ " #", " #", " -- ------#", - " - .|--|cccc|#", + " - .|--|rrrr|#", " .L,,,,,,,|#", " .L,,,,,,,|#", - " - 6|--|cccc|#", + " - 6|--|rrrr|#", " -- ------#", " #", " #", @@ -597,7 +760,8 @@ " #", " " ], - "palettes": [ "lab_palette", "lab_loot_bionic_vault" ] + "palettes": [ "lab_palette", "lab_loot_serum_vault" ], + "place_monster": [ { "monster": "mon_turret", "x": [ 18, 21 ], "y": [ 11, 12 ], "chance": 10 } ] } } ] diff --git a/data/json/mapgen/lab/lab_floorplans.json b/data/json/mapgen/lab/lab_floorplans.json index 6a05fb29bfe34..13b29c153850f 100644 --- a/data/json/mapgen/lab/lab_floorplans.json +++ b/data/json/mapgen/lab/lab_floorplans.json @@ -14,7 +14,7 @@ " | | |", " | | |", " | | |", - "---?---|---?---|---+---|", + "---?---|---+---|---?---|", " | | |", " | | |", " | | |", @@ -41,9 +41,11 @@ { "chunks": [ "lab_spawn_7x7" ], "x": 8, "y": 0 }, { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 8, "y": 8 }, { "chunks": [ "lab_spawn_7x7" ], "x": 8, "y": 16 }, - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 0 }, + { "chunks": [ "lab_spawn_7x7_wall_sw" ], "x": 15, "y": 0 }, { "chunks": [ "lab_spawn_7x7" ], "x": 16, "y": 8 }, - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 16 }, + { "chunks": [ "lab_spawn_7x7_wall_nw" ], "x": 15, "y": 15 }, + { "chunks": [ "sub_t_concrete_wall" ], "x": 15, "y": 7 }, + { "chunks": [ "sub_t_concrete_wall" ], "x": 15, "y": 15 }, { "chunks": [ "lab_border_walls" ], "x": 0, "y": 0 } ] } @@ -97,13 +99,13 @@ "place_nested": [ { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 3, "y": 4 }, { "chunks": [ "lab_spawn_9x9" ], "x": [0,1], "y": 14 }, - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 3 }, + { "chunks": [ "lab_spawn_7x7_wall_sw" ], "x": 15, "y": 3 }, { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 14 } ] } }, { - "//": "electricity room, 50% chance of shock malfunction", + "//": "electricity room, 2/3 chance of shock malfunction", "type": "mapgen", "method": "json", "om_terrain": [ "lab_4side" ], @@ -150,7 +152,7 @@ }, "mapping": { "r": { "items": [ { "item": "hardware", "chance": 10 }, { "item": "robots", "chance": 10 } ] } }, "place_nested": [ - { "chunks": [ "null", "sub_fd_shock_vent" ], "x": 7, "y": 12}, + { "chunks": [ "null", "sub_fd_shock_vent", "sub_fd_shock_vent" ], "x": 7, "y": 12}, { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 3 }, { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 14 }, { "chunks": [ "sub_f_crate_utility_room" ], "x": [0,2], "y": [0,2], "repeat": 4}, @@ -214,7 +216,8 @@ }, "mapping": { "c": { "items": [ { "item": "chem_lab", "chance": 20 } ] } }, "place_nested": [ - { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 14, "y": 1 }, + { "chunks": [ "lab_spawn_9x9_wall_sw" ], "x": 13, "y": 1 }, + { "chunks": [ "sub_t_concrete_wall" ], "x": 13, "y": 10 }, { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 14 }, { "chunks": [ [ "null", 80], [ "lab_hood_windfall", 20] ], "x": 2, "y": 2} ] @@ -251,7 +254,7 @@ "..---..---.....| |", "..c|c..c|c.....? |", "..c|c..c|c.....| |", - "..---..---....l| |", + "..---..---.....| |", "..............l| |", "rrr.....!.....l|-------|" ], @@ -267,7 +270,7 @@ "r": { "items": [ { "item": "cleaning", "chance": 30 } ] } }, "place_nested": [ - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 16, "y": 16 }, + { "chunks": [ "lab_spawn_7x7_wall_nw" ], "x": 15, "y": 15 }, { "chunks": [ [ "null", 80], [ "lab_largechem_windfall", 20] ], "x": 0, "y": 0} ], "place_monster": [ @@ -328,42 +331,42 @@ "om_terrain": [ "lab_4side" ], "weight": 100, "object": { - "rotation": [ 0, 3 ], + "rotation": [ 3, 4 ], "fill_ter": "t_thconc_floor", "rows": [ "........................", - ".......................l", - "....----?-------+----..l", - "hh..| | |..l", - "tt..| | |..l", - "hh..| | |...", - "....? ? ?..l", - "hh..| | |..l", - "tt..| | |..l", - "hh..| | |..l", - "....----+-|---------|...", - "....+....f| |...", - "..|---+---| |...", - "..| | |...", - "..| | |..l", - "..| | +..l", - "..? | |..l", - "..| | |..l", - "..| | |...", - "..| | |..l", - "..----?--------?-----..l", - ".......................l", - ".......................l", - "...hth.hth....x..hth...." + "l.......................", + "l..----+-------?----....", + "l..| | |..hh", + "l..| | |..tt", + "...| | |..hh", + "l..? | ?....", + "l..| | |..hh", + "l..| | |..tt", + "l..| | |..hh", + "...|---------|-+----....", + "...| |f....+....", + "...| |---+---|..", + "...| | |..", + "l..| | |..", + "l..+ | |..", + "l..| | ?..", + "l..| | |..", + "...| | |..", + "l..| | |..", + "l..-----?--------?----..", + "l.......................", + "l.......................", + "-----------..-----------" ], "palettes": [ "lab_palette", "lab_loot_home_office" ], "terrain": { "?": [ "t_concrete_wall", "t_concrete_wall", "t_door_glass_frosted_c" ] }, - "mapping": { "t": { "items": [ { "item": "vending_food_items", "chance": 30 } ] } }, + "mapping": { "t": { "items": [ { "item": "vending_food_items", "chance": 20 } ] } }, "place_nested": [ - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 5, "y": 3 }, - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 13, "y": 3 }, - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 3, "y": 13 }, - { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 11, "y": 11 } + { "chunks": [ "lab_spawn_7x7_wall_nw" ], "x": 3, "y": 2 }, + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 12, "y": 3 }, + { "chunks": [ "lab_spawn_9x9_wall_sw" ], "x": 3, "y": 11 }, + { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 14, "y": 13 } ] } }, @@ -383,7 +386,7 @@ "-------|C...| |..l", ",,,,,,,L....| |..l", ",,,,,,,L....| |..l", - ",,,,,,,L....+ ?..l", + ",,,,,,,L....+ |..l", "-------|....| |..l", "............| |-+-", "............| |...", @@ -441,7 +444,7 @@ }, "place_nested": [ { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 6, "y": 11 }, - { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 13, "y": 3 }, + { "chunks": [ "lab_spawn_7x7_wall_nw" ], "x": 12, "y": 2 }, { "chunks": [ "sub_f_crate_utility_room" ], "x": [0,6], "y": [4,6], "repeat": 8}, { "chunks": [ "sub_f_crate_utility_room" ], "x": [0,6], "y": [0,2], "repeat": 8} ] diff --git a/data/json/mapgen/lab/lab_floorplans_1side.json b/data/json/mapgen/lab/lab_floorplans_1side.json index e14ff8a7d8560..f7cd600d44f60 100644 --- a/data/json/mapgen/lab/lab_floorplans_1side.json +++ b/data/json/mapgen/lab/lab_floorplans_1side.json @@ -39,8 +39,7 @@ "place_nested": [ { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 1, "y": 1 }, { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 14, "y": 1 }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "east": ["lab"] } }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "south": ["lab"] } } + { "chunks": [ "lab_1side_border_doors" ], "x": 0, "y": 0 } ] } }, @@ -117,8 +116,7 @@ "place_nested": [ { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 1, "y": 1 }, { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 14, "y": 1 }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "east": ["lab"] } }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "south": ["lab"] } } + { "chunks": [ "lab_1side_border_doors" ], "x": 0, "y": 0 } ] } }, @@ -192,17 +190,25 @@ "7": { "name": "Magazine Entrance", "security": 6, - "options": [ { "name": "UNLOCK ENTRANCE", "action": "unlock", "security": 7 } ], + "options": [ { "name": "UNLOCK ENTRANCE", "action": "unlock_disarm", "security": 7 } ], "failures": [ { "action": "damage" }, { "action": "shutdown" } ] } }, "place_nested": [ - { "chunks": [ [ "null", 95 ], [ "lab_hulk_smash", 5 ] ], "x": 0, "y": 0 }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "east": ["lab"] } }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "south": ["lab"] } } + { "chunks": [ [ "null", 45 ], [ "lab_barracks_turret", 50 ], [ "lab_hulk_smash", 5 ] ], "x": 0, "y": 0 }, + { "chunks": [ "lab_1side_border_doors" ], "x": 0, "y": 0 } ] } }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_barracks_turret", + "object": { + "mapgensize": [ 24, 24 ], + "place_monster": [ { "monster": "mon_turret", "x": [ 10, 13 ], "y": [ 15, 22 ] } ] + } + }, { "//": "prisoner containment", "type": "mapgen", @@ -271,8 +277,7 @@ }, "place_nested": [ { "chunks": [ [ "null", 95 ], [ "lab_hulk_smash", 5 ] ], "x": 0, "y": 0 }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "east": ["lab"] } }, - { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "south": ["lab"] } } + { "chunks": [ "lab_1side_border_doors" ], "x": 0, "y": 0 } ] } }, @@ -296,6 +301,19 @@ ] } }, + { + "//": "Creates border doors for a lab_1side if-and-only-if final rotation would predict them existing.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_1side_border_doors", + "object": { + "mapgensize": [ 24, 24 ], + "place_nested": [ + { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "east": ["lab"] } }, + { "chunks": [ "lab_north_doors" ], "x": 11, "y": 0, "neighbors": { "south": ["lab"] } } + ] + } + }, { "//": "Adds a pair of doors in the center of the top entrance, as would be expected in a 1-sided lab section facing north or west.", "type": "mapgen", diff --git a/data/json/mapgen/lab/lab_floorplans_finale1level.json b/data/json/mapgen/lab/lab_floorplans_finale1level.json index 70f840b0358f0..34ac8cdb03268 100644 --- a/data/json/mapgen/lab/lab_floorplans_finale1level.json +++ b/data/json/mapgen/lab/lab_floorplans_finale1level.json @@ -374,7 +374,7 @@ "6": { "name": "PE019 \"Sculptor\" Secure Storage", "security": 2, - "options": [ { "name": "UNLOCK STORAGE", "action": "release_bionics", "security": 4 } ], + "options": [ { "name": "UNLOCK STORAGE", "action": "release_disarm", "security": 4 } ], "failures": [ { "action": "damage" }, { "action": "secubots" } ] } } @@ -400,7 +400,7 @@ "6": { "name": "PE050 \"Alpha\" Secure Storage", "security": 2, - "options": [ { "name": "UNLOCK STORAGE", "action": "release_bionics", "security": 4 } ], + "options": [ { "name": "UNLOCK STORAGE", "action": "release_disarm", "security": 4 } ], "failures": [ { "action": "damage" }, { "action": "secubots" } ] } } @@ -426,7 +426,7 @@ "6": { "name": "PE065 \"Chimera\" Secure Storage", "security": 2, - "options": [ { "name": "UNLOCK STORAGE", "action": "release_bionics", "security": 4 } ], + "options": [ { "name": "UNLOCK STORAGE", "action": "release_disarm", "security": 4 } ], "failures": [ { "action": "damage" }, { "action": "secubots" } ] } } @@ -452,7 +452,7 @@ "6": { "name": "PE070 \"Raptor\" Secure Storage", "security": 2, - "options": [ { "name": "UNLOCK STORAGE", "action": "release_bionics", "security": 4 } ], + "options": [ { "name": "UNLOCK STORAGE", "action": "release_disarm", "security": 4 } ], "failures": [ { "action": "damage" }, { "action": "secubots" } ] } } @@ -478,7 +478,7 @@ "6": { "name": "PE023 \"Medical\" Secure Storage", "security": 2, - "options": [ { "name": "UNLOCK STORAGE", "action": "release_bionics", "security": 4 } ], + "options": [ { "name": "UNLOCK STORAGE", "action": "release_disarm", "security": 4 } ], "failures": [ { "action": "damage" }, { "action": "secubots" } ] } } diff --git a/data/json/mapgen/lab/lab_rooms.json b/data/json/mapgen/lab/lab_rooms.json index 078c0d411d9d4..c1de3655ca91f 100644 --- a/data/json/mapgen/lab/lab_rooms.json +++ b/data/json/mapgen/lab/lab_rooms.json @@ -332,6 +332,53 @@ "place_monster": [ { "monster": "mon_zombie_scientist", "x": [ 2, 3 ], "y": [ 1, 3 ], "chance": 50, "pack_size": [1,3] } ] } }, + { + "//": "7x7 bulk chemical storage", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_rare", + "object": { + "mapgensize": [ 7, 7 ], + "place_furniture": [ { "furn": "f_standing_tank", "x": 3, "y": 3 } ], + "place_nested": [ { "chunks": [ "lab_filltank_chem" ], "x": 3, "y": 3 } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_filltank_chem", + "object": { + "mapgensize": [ 1, 1 ], + "place_liquids" : [ { "amount": [200, 800], "x": 0, "y": 0, "liquid": "ammonia" } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_filltank_chem", + "object": { + "mapgensize": [ 1, 1 ], + "place_liquids" : [ { "amount": [200, 800], "x": 0, "y": 0, "liquid": "bleach" } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_filltank_chem", + "object": { + "mapgensize": [ 1, 1 ], + "place_liquids" : [ { "amount": [100, 400], "x": 0, "y": 0, "liquid": "water_clean" } ] + } + }, + { + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_filltank_chem", + "object": { + "mapgensize": [ 1, 1 ], + "place_liquids" : [ { "amount": [100, 400], "x": 0, "y": 0, "liquid": "salt_water" } ] + } + }, { "//": "7x7 glass monster cage", "type": "mapgen", @@ -391,7 +438,7 @@ "palettes": [ "lab_palette" ], "terrain": { ",": "t_floor_blue" }, "place_monster": [{ - "monster": [ "mon_zombie_pig", "mon_zombear", "mon_zoose", "mon_zolf" ], + "monster": [ "mon_zombie_pig", "mon_zombear", "mon_zoose", "mon_zolf", "mon_zombie_dog" ], "x": [ 1, 3 ], "y": [ 1, 3 ], "chance": 80 }] } @@ -400,7 +447,7 @@ "//": "7x7 chem_storage", "type": "mapgen", "method": "json", - "nested_mapgen_id": "lab_room_7x7", + "nested_mapgen_id": "lab_room_7x7_crossdoors", "object": { "mapgensize": [ 7, 7 ], "rotation": [0, 3], @@ -416,6 +463,26 @@ "palettes": [ "lab_palette", "lab_loot_research" ] } }, + { + "//": "7x7 chem_storage", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_crossdoors", + "object": { + "mapgensize": [ 7, 7 ], + "rotation": [0, 3], + "rows": [ + ".......", + ".c.c.c.", + ".c.c.c.", + ".c.c.c.", + ".c.c.c.", + ".c.c.c.", + "......." + ], + "palettes": [ "lab_palette", "lab_loot_research" ] + } + }, { "//": "7x7 hydroponics", "type": "mapgen", @@ -701,7 +768,7 @@ "//": "7x7 vr mat, using safety glasses to suggest vr goggles", "type": "mapgen", "method": "json", - "nested_mapgen_id": "lab_room_7x7_crossdoors", + "nested_mapgen_id": "lab_room_7x7", "object": { "mapgensize": [ 7, 7 ], "rotation": [0, 3], @@ -720,21 +787,21 @@ } }, { - "//": "7x7 bedrooms", + "//": "7x7 barracks", "type": "mapgen", "method": "json", - "nested_mapgen_id": "lab_room_7x7_crossdoors", + "nested_mapgen_id": "lab_room_7x7", "object": { "mapgensize": [ 7, 7 ], "rotation": [0, 3], "rows": [ - "bb|.|ST", - "s.|.|..", - "-W-.-W-", + "s.....s", + "bb...bb", ".......", - "-W-.-W-", - "s.|.|.s", - "bb|.|bb" + ".......", + ".......", + "bb...bb", + "s.....s" ], "palettes": [ "lab_palette", "lab_loot_home_office" ] } @@ -748,8 +815,8 @@ "mapgensize": [ 9, 9 ], "rotation": [0, 3], "rows": [ - "bb.|.|T.B", - "...|.W..B", + "b..|.|T.B", + "b..|.W..B", "..s|.|S..", "-W--.----", ".........", @@ -763,28 +830,6 @@ } }, { - "//": "9x9 cubicles", - "type": "mapgen", - "method": "json", - "nested_mapgen_id": "lab_room_9x9_crossdoors", - "object": { - "mapgensize": [ 9, 9 ], - "rotation": [0, 3], - "rows": [ - "d..|.|..d", - "ch.....hc", - "d.?|.|?.d", - "----.----", - ".........", - "----.----", - "d.?|.|?.d", - "ch.....hc", - "d..|.|..d" - ], - "palettes": [ "lab_palette", "lab_loot_home_office" ], - "furniture": { "?": ["f_null", "f_null", "f_indoor_plant"] } - } - }, { "//": "7x7 kennel", "type": "mapgen", "method": "json", @@ -964,6 +1009,72 @@ } } }, + { + "//": "incinerated room - using crossdoors to ensure no extra space in the room not covered in ash", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_crossdoors", + "object": { + "mapgensize": [ 7, 7 ], + "rows": [ + "aaaaaaa", + "aaaaaaa", + "aaaaaaa", + "aaaaaaa", + "aaaaaaa", + "aaaaaaa", + "aaaaaaa" + ], + "terrain": { "a": "t_thconc_floor" }, + "item": { + "a": { "item": "ash", "chance": 90 } + }, + "place_nested": [ { "chunks": [ "sub_f_ash" ], "x": [0,6], "y": [0,6], "repeat": [ 2, 4 ] } ] + } + }, + { + "//": "incinerated room - using crossdoors to ensure no extra space in the room not covered in ash", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_crossdoors", + "object": { + "mapgensize": [ 9, 9 ], + "rows": [ + "aaaaaaaaa", + "aaaaaaaaa", + "aaaaaaaaa", + "aaaaaaaaa", + "aaaaaaaaa", + "aaaaaaaaa", + "aaaaaaaaa", + "aaaaaaaaa", + "aaaaaaaaa" + ], + "terrain": { "a": "t_thconc_floor" }, + "item": { + "a": { "item": "ash", "chance": 90 } + }, + "place_nested": [ { "chunks": [ "sub_f_ash" ], "x": [0,8], "y": [0,8], "repeat": [4, 6 ] } ] + } + }, + { + "//": "big ash pile (shovel-needed) with a chance of science gear", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "sub_f_ash", + "object": { + "mapgensize": [ 1, 1 ], + "rows": [ "a" ], + "terrain": { "a": "t_thconc_floor" }, + "furniture": { "a": "f_ash" }, + "item": { + "a": [ { "item": "ash", "amount": 49, "chance": 100 }, { "item": "bone_human", "amount": [ 3, 5 ], "chance": 50 } ] + }, + "items": { + "a": { "item": "science", "chance": 10} + } + } + }, { "type": "mapgen", "method": "json", diff --git a/data/json/mapgen/lab/lab_rooms_wall.json b/data/json/mapgen/lab/lab_rooms_wall.json new file mode 100644 index 0000000000000..0ae7c98264004 --- /dev/null +++ b/data/json/mapgen/lab/lab_rooms_wall.json @@ -0,0 +1,503 @@ +[ + { + "//": "Spawn for a room exactly 7x7 including the ability to adjust the north and west walls.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_7x7_wall_nw", + "object": { + "mapgensize": [ 8, 8 ], + "place_nested": [ { "chunks": [ [ "lab_spawn_7x7_nw_crossdoors_adapter", 50 ], [ "lab_room_7x7_wall_nw", 50 ] ], "x": 0, "y": 0} ] + } + }, + { + "//": "Spawn for a room exactly 7x7 including the ability to adjust the south and west walls.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_7x7_wall_sw", + "object": { + "mapgensize": [ 8, 8 ], + "place_nested": [ { "chunks": [ [ "lab_spawn_7x7_sw_crossdoors_adapter", 50 ], [ "lab_room_7x7_wall_sw", 50 ] ], "x": 0, "y": 0} ] + } + }, + { + "//": "Spawn for a room exactly 9x9 including the ability to adjust the north and west walls.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "place_nested": [ { "chunks": [ [ "lab_spawn_9x9_nw_crossdoors_adapter", 50 ], [ "lab_room_9x9_wall_nw", 50 ] ], "x": 0, "y": 0} ] + } + }, + { + "//": "Spawn for a room exactly 9x9 including the ability to adjust the south and west walls.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_9x9_wall_sw", + "object": { + "mapgensize": [ 10, 10 ], + "place_nested": [ { "chunks": [ [ "lab_spawn_9x9_sw_crossdoors_adapter", 50 ], [ "lab_room_9x9_wall_sw", 50 ] ], "x": 0, "y": 0} ] + } + }, + { + "//": "Puts a normal 7x7 room in the right spot of a 7x7+walls spawn.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_7x7_nw_crossdoors_adapter", + "object": { + "mapgensize": [ 8, 8 ], + "place_nested": [ { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 1, "y": 1} ] + } + }, + { + "//": "Puts a normal 7x7 room in the right spot of a 7x7+walls spawn.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_7x7_sw_crossdoors_adapter", + "object": { + "mapgensize": [ 8, 8 ], + "place_nested": [ { "chunks": [ "lab_spawn_7x7_crossdoors" ], "x": 1, "y": 0} ] + } + }, + { + "//": "Puts a normal 9x9 room in the right spot of a 9x9+walls spawn.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_9x9_nw_crossdoors_adapter", + "object": { + "mapgensize": [ 10, 10 ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 1, "y": 1} ] + } + }, + { + "//": "Puts a normal 9x9 room in the right spot of a 9x9+walls spawn.", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_spawn_9x9_sw_crossdoors_adapter", + "object": { + "mapgensize": [ 10, 10 ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9_crossdoors" ], "x": 1, "y": 0} ] + } + }, + { + "//": "7x7 fenced room. TODO: restrict to only rooms that look good with fences?", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_nw", + "object": { + "mapgensize": [ 8, 8 ], + "set": [ + { "line": "terrain", "id": "t_chainfence_h", "x": 0, "x2": 7, "y": 0, "y2": 0 }, + { "line": "terrain", "id": "t_chainfence_v", "x": 0, "x2": 0, "y": 1, "y2": 7 }, + { "point": "terrain", "id": "t_chaingate_c", "x": [ 3, 5], "y": 0 }, + { "point": "terrain", "id": "t_chaingate_c", "x": 0, "y": [3, 5] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_7x7" ], "x": 1, "y": 1} ] + } + }, + { + "//": "7x7 fenced room. TODO: restrict to only rooms that look good with fences?", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_sw", + "object": { + "mapgensize": [ 8, 8 ], + "set": [ + { "line": "terrain", "id": "t_chainfence_h", "x": 0, "x2": 7, "y": 7, "y2": 7 }, + { "line": "terrain", "id": "t_chainfence_v", "x": 0, "x2": 0, "y": 0, "y2": 6 }, + { "point": "terrain", "id": "t_chaingate_c", "x": [ 3, 5], "y": 7 }, + { "point": "terrain", "id": "t_chaingate_c", "x": 0, "y": [2, 4] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_7x7" ], "x": 1, "y": 0} ] + } + }, + { + "//": "7x7 window walls", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_nw", + "object": { + "mapgensize": [ 8, 8 ], + "set": [ + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 7, "y": 0, "y2": 0 }, + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 1, "y2": 7 }, + { "point": "terrain", "id": "t_door_glass_c", "x": [ 3, 5], "y": 0 }, + { "point": "terrain", "id": "t_door_glass_c", "x": 0, "y": [3, 5] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_7x7" ], "x": 1, "y": 1} ] + } + }, + { + "//": "7x7 window walls", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_sw", + "object": { + "mapgensize": [ 8, 8 ], + "set": [ + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 7, "y": 7, "y2": 7 }, + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 0, "y2": 6 }, + { "point": "terrain", "id": "t_door_glass_c", "x": [ 3, 5], "y": 7 }, + { "point": "terrain", "id": "t_door_glass_c", "x": 0, "y": [2, 4] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_7x7" ], "x": 1, "y": 0} ] + } + }, + { + "//": "7x7 cooling pool", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_nw", + "object": { + "mapgensize": [ 8, 8 ], + "rows": [ + "|-------", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW" + ], + "terrain": { "W": "t_water_dp", "|": "t_railing_v", "-": "t_railing_h" } + } + }, + { + "//": "7x7 cooling pool", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_sw", + "object": { + "mapgensize": [ 8, 8 ], + "rows": [ + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|WWWWWWW", + "|-------" + ], + "terrain": { "W": "t_water_dp", "|": "t_railing_v", "-": "t_railing_h" } + } + }, + { + "//": "7x7 bionic vault", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_sw", + "object": { + "mapgensize": [ 8, 8 ], + "rows": [ + "|#######", + "--MMMMM#", + ".6MrrrM#", + "..L,,,M#", + "..MrrrM#", + "--MMMMM#", + "|#######", + "|-------" + ], + "palettes": [ "lab_palette", "lab_loot_bionic_vault" ], + "terrain": { "M": "t_wall_metal" }, + "place_monster": [ { "monster": "mon_turret", "x": 5, "y": 3, "chance": 25 } ] + } + }, + { + "//": "7x7 serum vault", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_7x7_wall_nw", + "object": { + "mapgensize": [ 8, 8 ], + "rows": [ + "|-------", + "|#######", + "--MMMMM#", + "..MrrrM#", + "..L,,,M#", + ".6MrrrM#", + "--MMMMM#", + "|#######" + ], + "palettes": [ "lab_palette", "lab_loot_serum_vault" ], + "terrain": { "M": "t_wall_metal" }, + "place_monster": [ { "monster": "mon_turret", "x": 5, "y": 3, "chance": 10 } ] + } + }, + { + "//": "9x9 fenced room. TODO: restrict to only rooms that look good with fences?", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "set": [ + { "line": "terrain", "id": "t_chainfence_h", "x": 0, "x2": 9, "y": 0, "y2": 0 }, + { "line": "terrain", "id": "t_chainfence_v", "x": 0, "x2": 0, "y": 1, "y2": 9 }, + { "point": "terrain", "id": "t_chaingate_c", "x": [ 4, 6 ], "y": 0 }, + { "point": "terrain", "id": "t_chaingate_c", "x": 0, "y": [ 4, 6 ] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9" ], "x": 1, "y": 1} ] + } + }, + { + "//": "9x9 fenced room. TODO: restrict to only rooms that look good with fences?", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_sw", + "object": { + "mapgensize": [ 10, 10 ], + "set": [ + { "line": "terrain", "id": "t_chainfence_v", "x": 0, "x2": 0, "y": 0, "y2": 9 }, + { "line": "terrain", "id": "t_chainfence_h", "x": 1, "x2": 9, "y": 9, "y2": 9 }, + { "point": "terrain", "id": "t_chaingate_c", "x": [ 4, 6 ], "y": 9 }, + { "point": "terrain", "id": "t_chaingate_c", "x": 0, "y": [ 3, 5 ] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9" ], "x": 1, "y": 0} ] + } + }, + { + "//": "9x9 window walls", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "set": [ + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 9, "y": 0, "y2": 0 }, + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 1, "y2": 9 }, + { "point": "terrain", "id": "t_door_glass_c", "x": [ 4, 6 ], "y": 0 }, + { "point": "terrain", "id": "t_door_glass_c", "x": 0, "y": [ 4, 6 ] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9" ], "x": 1, "y": 1} ] + } + }, + { + "//": "9x9 window walls", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_sw", + "object": { + "mapgensize": [ 10, 10 ], + "set": [ + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 0, "y2": 9 }, + { "line": "terrain", "id": "t_wall_glass", "x": 1, "x2": 9, "y": 9, "y2": 9 }, + { "point": "terrain", "id": "t_door_glass_c", "x": [ 4, 6 ], "y": 9 }, + { "point": "terrain", "id": "t_door_glass_c", "x": 0, "y": [ 3, 5 ] } + ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9" ], "x": 1, "y": 0} ] + } + }, + { + "//": "9x9 four 2x1 windows", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "set": [ + { "line": "terrain", "id": "t_wall_glass", "x": 2, "x2": 3, "y": 0, "y2": 0 }, + { "line": "terrain", "id": "t_wall_glass", "x": 7, "x2": 8, "y": 0, "y2": 0 }, + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 2, "y2": 3 }, + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 7, "y2": 8 } + ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9" ], "x": 1, "y": 1} ] + } + }, + { + "//": "9x9 four 2x1 windows", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_sw", + "object": { + "mapgensize": [ 10, 10 ], + "set": [ + { "line": "terrain", "id": "t_wall_glass", "x": 2, "x2": 3, "y": 9, "y2": 9 }, + { "line": "terrain", "id": "t_wall_glass", "x": 7, "x2": 8, "y": 9, "y2": 9 }, + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 1, "y2": 2 }, + { "line": "terrain", "id": "t_wall_glass", "x": 0, "x2": 0, "y": 6, "y2": 7 } + ], + "place_nested": [ { "chunks": [ "lab_spawn_9x9" ], "x": 1, "y": 0} ] + } + }, + { + "//": "9x9 duplex apartments", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "rotation": [0, 3], + "rows": [ + "|----W----", + "|TS|f..cSO", + "|..|C.....", + "|-W|-|..ht", + "|...O|....", + "W...S|bb..", + "|...c|bb.s", + "|...f|--W-", + "|h....b|..", + "|t.s..b|ST" + ], + "palettes": [ "lab_palette", "lab_loot_home_office" ], + "furniture": { "C": "f_cupboard", "O": "f_oven" }, + "mapping": { + "t": { "items": [ { "item": "livingroom", "chance": 20 } ] }, + "f": { "items": [ { "item": "fridge", "chance": 30 } ] }, + "C": { "items": [ { "item": "kitchen", "chance": 40 } ] }, + "c": { "items": [ { "item": "kitchen", "chance": 20 } ] }, + "O": { "items": [ { "item": "oven", "chance": 20 } ] } + } + } + }, + { + "//": "9x9 duplex apartments", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_sw", + "object": { + "mapgensize": [ 10, 10 ], + "rotation": [0, 3], + "rows": [ + "|t.s..b|ST", + "|h....b|..", + "|...f|--W-", + "|...c|bb.s", + "W...S|bb..", + "|...O|....", + "|-W|-|..ht", + "|..|C.....", + "|TS|f..cSO", + "|----W----" + ], + "palettes": [ "lab_palette", "lab_loot_home_office" ], + "furniture": { "C": "f_cupboard", "O": "f_oven" }, + "mapping": { + "t": { "items": [ { "item": "livingroom", "chance": 20 } ] }, + "f": { "items": [ { "item": "fridge", "chance": 30 } ] }, + "C": { "items": [ { "item": "kitchen", "chance": 40 } ] }, + "c": { "items": [ { "item": "kitchen", "chance": 20 } ] }, + "O": { "items": [ { "item": "oven", "chance": 20 } ] } + } + } + }, + { + "//": "9x9 cooling pool", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "rotation": [0, 3], + "rows": [ + "|---------", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW" + ], + "terrain": { "W": "t_water_dp", "|": "t_railing_v", "-": "t_railing_h" } + } + }, + { + "//": "9x9 cooling pool", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_sw", + "object": { + "mapgensize": [ 10, 10 ], + "rotation": [0, 3], + "rows": [ + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|WWWWWWWWW", + "|---------" + ], + "terrain": { "W": "t_water_dp", "|": "t_railing_v", "-": "t_railing_h" } + } + }, + { + "//": "9x9 barracks", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "rows": [ + "-----+----", + "|.........", + "|bb.....bb", + "|s.......s", + "|.........", + "|bb.....bb", + "|s.......s", + "|.........", + "|bb.....bb", + "|s.......s" + ], + "palettes": [ "lab_palette", "lab_loot_home_office" ], + "place_monster": [ { "monster": ["mon_zombie_soldier"], "x": [ 1, 9 ], "y": [ 1, 9 ], "chance": 25, "pack_size": [1,3] } ] + } + }, + { + "//": "9x9 cubicles", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_nw", + "object": { + "mapgensize": [ 10, 10 ], + "rows": [ + "-----+----", + "|d..|.|..d", + "|ch.....ch", + "|----.----", + "|d..|.|?.d", + "|ch.....hc", + "|d.?|.|..d", + "|----.----", + "|ch.....hc", + "|d..|x|..d" + ], + "palettes": [ "lab_palette", "lab_loot_home_office" ], + "furniture": { "?": ["f_null", "f_null", "f_indoor_plant"] } + } + }, + { + "//": "9x9 cubicles", + "type": "mapgen", + "method": "json", + "nested_mapgen_id": "lab_room_9x9_wall_sw", + "object": { + "mapgensize": [ 10, 10 ], + "rows": [ + "|dc|dcd|cd", + "|.h|.h.|h.", + "|..|?..|..", + "|-.--.--.-", + "+........x", + "|-.--.--.-", + "|..|..?|..", + "|.h|.h.|h.", + "|dc|dcd|cd", + "----------" + ], + "palettes": [ "lab_palette", "lab_loot_home_office" ], + "furniture": { "?": ["f_null", "f_null", "f_indoor_plant"] } + } + } +] \ No newline at end of file diff --git a/data/json/mapgen/mansion.json b/data/json/mapgen/mansion.json index fd8b0919f4c4d..959955f518f51 100644 --- a/data/json/mapgen/mansion.json +++ b/data/json/mapgen/mansion.json @@ -49,7 +49,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "''':::::::,,,,:::::::'''", + "''p:::::::,,,,:::::::'''", ":::::::::,,,,,,:::::::::", ":::::::::,,**,,:::::::::", ":::::::::,,**,,:::::::::", @@ -79,6 +79,7 @@ ".": { "item": "clutter_mansion" }, ":": { "item": "clutter_yard" }, "K": { "item": "crate_cleaning", "chance": 100 }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "m": { "item": "cleaning", "chance": 45 }, "t": { "item": "table_foyer", "chance": 40 }, "z": { "item": "jackets", "chance": 40 } @@ -184,7 +185,7 @@ "object": { "fill_ter": "t_floor", "rows": [ - "''''''':::,,,,:::'''''''", + "''''''':::,,,,:::'p'''''", "''''::::::,,,,::::::''''", "::::::::::*,,*::::::::::", "::::::::::*,,*::::::::::", @@ -214,6 +215,7 @@ ".": { "item": "clutter_mansion" }, ":": { "item": "clutter_yard" }, "t": { "item": "table_foyer", "chance": 40 }, + "p": { "item": "mail", "chance": 30, "repeat": [ 2, 5 ] }, "{": { "item": "suit_of_armor", "chance": 100 } }, "place_monsters": [ { "monster": "GROUP_MANSION", "x": [ 2, 21 ], "y": [ 2, 21 ], "density": 0.08 } ] diff --git a/data/json/mapgen_palettes/mansion.json b/data/json/mapgen_palettes/mansion.json index 8611f93dc4121..f8d1ec839ef6b 100644 --- a/data/json/mapgen_palettes/mansion.json +++ b/data/json/mapgen_palettes/mansion.json @@ -51,6 +51,7 @@ "l": "f_bookcase", "m": "f_locker", "n": "f_cupboard", + "p": "f_mailbox", "q": "f_oven", "r": "f_rack", "s": "f_sofa", @@ -108,6 +109,7 @@ "d": "t_carpet_red", "j": "t_linoleum_gray", "o": "t_door_frame", + "p": "t_grass", "x": "t_wall_glass", "|": "t_railing_v" } diff --git a/data/json/monstergroups.json b/data/json/monstergroups.json index a8da092509c13..ca284dc3ac4c7 100644 --- a/data/json/monstergroups.json +++ b/data/json/monstergroups.json @@ -949,41 +949,13 @@ { "monster" : "mon_skitterbot", "freq" : 85, "cost_multiplier" : 0 }, { "monster" : "mon_skitterbot", "freq" : 85, "cost_multiplier" : 0, "pack_size" : [2,3] }, { "monster" : "mon_skitterbot", "freq" : 1, "cost_multiplier" : 0, "pack_size" : [8,12] }, - { "monster" : "mon_zombie_hazmat", "freq" : 100, "cost_multiplier" : 0}, - { "monster" : "mon_zombie_bio_op", "freq" : 50, "cost_multiplier" : 5}, - { "monster" : "mon_zombie_armored", "freq" : 5, "cost_multiplier" : 5} - ] - },{ - "type":"monstergroup", - "name" : "GROUP_ICE_LAB", - "default" : "mon_zombie_scientist", - "monsters" : [ - { "monster" : "mon_blob_small", "freq" : 25, "cost_multiplier" : 0, "pack_size" : [1,4] }, - { "monster" : "mon_manhack", "freq" : 200, "cost_multiplier" : 0 }, - { "monster" : "mon_manhack", "freq" : 45, "cost_multiplier" : 0, "pack_size" : [2,3] }, - { "monster" : "mon_nakedmolerat_giant", "freq" : 15, "cost_multiplier" : 3 }, - { "monster" : "mon_skitterbot", "freq" : 100, "cost_multiplier" : 0 }, - { "monster" : "mon_skitterbot", "freq" : 145, "cost_multiplier" : 0, "pack_size" : [2,3] }, - { "monster" : "mon_zombie_hazmat", "freq" : 100, "cost_multiplier" : 0}, - { "monster" : "mon_zombie_bio_op", "freq" : 50, "cost_multiplier" : 5}, - { "monster" : "mon_zombie_armored", "freq" : 5, "cost_multiplier" : 5} - ] - },{ - "type":"monstergroup", - "name" : "GROUP_TOWER_LAB", - "default" : "mon_zombie_scientist", - "monsters" : [ - { "monster" : "mon_zombie_soldier", "freq" : 25, "cost_multiplier" : 0, "pack_size" : [1,4] }, - { "monster" : "mon_manhack", "freq" : 200, "cost_multiplier" : 0 }, - { "monster" : "mon_manhack", "freq" : 45, "cost_multiplier" : 0, "pack_size" : [2,3] }, - { "monster" : "mon_skitterbot", "freq" : 100, "cost_multiplier" : 0 }, - { "monster" : "mon_skitterbot", "freq" : 145, "cost_multiplier" : 0, "pack_size" : [2,3] }, + { "monster" : "mon_secubot", "freq" : 1, "cost_multiplier" : 10 }, { "monster" : "mon_zombie_hazmat", "freq" : 100, "cost_multiplier" : 0}, { "monster" : "mon_zombie_bio_op", "freq" : 50, "cost_multiplier" : 5}, { "monster" : "mon_zombie_armored", "freq" : 5, "cost_multiplier" : 5}, { "monster" : "mon_zombie_technician", "freq" : 50, "cost_multiplier" : 3}, { "monster" : "mon_zombie_electric", "freq" : 50, "cost_multiplier" : 3}, - { "monster" : "mon_zombie_brute_shocker", "freq" : 20, "cost_multiplier" : 5} + { "monster" : "mon_zombie_brute_shocker", "freq" : 10, "cost_multiplier" : 5} ] },{ "type":"monstergroup", @@ -995,14 +967,15 @@ { "monster" : "mon_manhack", "freq" : 45, "cost_multiplier" : 0, "pack_size" : [2,3] }, { "monster" : "mon_skitterbot", "freq" : 100, "cost_multiplier" : 0 }, { "monster" : "mon_skitterbot", "freq" : 145, "cost_multiplier" : 0, "pack_size" : [2,3] }, - { "monster" : "mon_secubot", "freq" : 5, "cost_multiplier" : 5 }, - { "monster" : "mon_chickenbot", "freq" : 1, "cost_multiplier" : 50 }, + { "monster" : "mon_skitterbot", "freq" : 1, "cost_multiplier" : 0, "pack_size" : [8,12] }, + { "monster" : "mon_secubot", "freq" : 5, "cost_multiplier" : 10 }, { "monster" : "mon_zombie_hazmat", "freq" : 100, "cost_multiplier" : 0}, { "monster" : "mon_zombie_bio_op", "freq" : 50, "cost_multiplier" : 5}, { "monster" : "mon_zombie_armored", "freq" : 5, "cost_multiplier" : 5}, { "monster" : "mon_zombie_technician", "freq" : 50, "cost_multiplier" : 3}, { "monster" : "mon_zombie_electric", "freq" : 50, "cost_multiplier" : 3}, - { "monster" : "mon_zombie_brute_shocker", "freq" : 20, "cost_multiplier" : 5}, + { "monster" : "mon_zombie_brute_shocker", "freq" : 10, "cost_multiplier" : 5}, + { "monster" : "mon_chickenbot", "freq" : 1, "cost_multiplier" : 50 }, { "monster" : "mon_zombie_hulk", "freq" : 1, "cost_multiplier" : 50 }, { "monster" : "mon_skeleton_hulk", "freq" : 1, "cost_multiplier" : 50 } ] diff --git a/data/json/monsters.json b/data/json/monsters.json index 968acfdd011b3..ad27e30a69673 100644 --- a/data/json/monsters.json +++ b/data/json/monsters.json @@ -2405,8 +2405,8 @@ { "id": "mon_tankbot", "type": "MONSTER", - "name": "tank drone", - "description": "The Northrup Emancipator is the first and only automated tank ever produced, made shortly after the split-up of Northrup Grumman. Clad in depleted uranium plating, and armed with advanced munitions and a 120-mm gun, it is capable of delivering extraordinary firepower.", + "name": "Beagle Mini-Tank UGV", + "description": "The Northrup Beagle is a refrigerator-sized urban warfare UGV. Sporting an anti-tank missile launcher, 40mm grenade launcher, and numerous anti-infantry weapons, it's designed for high-risk urban fighting.", "default_faction": "military", "species": [ "ROBOT" ], "diff": 52, @@ -2422,13 +2422,13 @@ "melee_dice": 5, "melee_dice_sides": 5, "melee_cut": 0, - "armor_bash": 24, - "armor_cut": 30, + "armor_bash": 90, + "armor_cut": 90, "vision_day": 50, - "starting_ammo": { "120mm_HEAT": 40, "40mm_frag": 100, "556": 1000 }, + "starting_ammo": { "40mm_frag": 100, "556": 1000 }, "path_settings": { "max_dist": 20 }, "special_attacks": [ [ "MULTI_ROBOT", 3 ] ], - "death_drops": { "groups": [ [ "robots", 4 ], [ "tankbot", 1 ] ] }, + "death_drops": { "groups": [ [ "robots", 4 ] ] }, "death_function": [ "BROKEN" ], "flags": [ "SEES", "HEARS", "GOODHEARING", "NOHEAD", "BASHES", "DESTROYS", "NO_BREATHE", "ELECTRONIC", "PRIORITIZE_TARGETS" ] }, diff --git a/data/json/monsters/defense_bot.json b/data/json/monsters/defense_bot.json index b0590b4066411..261d28de358ce 100644 --- a/data/json/monsters/defense_bot.json +++ b/data/json/monsters/defense_bot.json @@ -37,7 +37,7 @@ ] }, "death_function": [ "EXPLODE" ], - "flags": [ "SEES", "HEARS", "BASHES", "ELECTRONIC", "NO_BREATHE", "PATH_AVOID_DANGER_1" ] + "flags": [ "SEES", "HEARS", "BASHES", "ELECTRONIC", "NO_BREATHE", "PATH_AVOID_DANGER_1", "LOUDMOVES" ] }, { "id": "mon_turret", diff --git a/data/json/monsters/mammal.json b/data/json/monsters/mammal.json index a47b7fd3c7ea4..2ff43d4d456f4 100644 --- a/data/json/monsters/mammal.json +++ b/data/json/monsters/mammal.json @@ -816,7 +816,7 @@ "copy-from": "mon_dog", "type": "MONSTER", "name": "boxer mastiff", - "description": "An ordinary breed full of affection, the Boxer Mastiff doesn't stand out amongst other dogs but has mediocre abilities nonetheless.", + "description": "An ordinary breed full of affection, the Boxer Mastiff doesn't otherwise stand out amongst other dogs with its capabilities.", "hp": 29, "aggression": 3, "melee_skill": 4, diff --git a/data/json/overmap/specials.json b/data/json/overmap/specials.json index 0f1d6b27e52a2..b9d5d876ed2ed 100644 --- a/data/json/overmap/specials.json +++ b/data/json/overmap/specials.json @@ -1397,8 +1397,8 @@ { "point" : [2,5,0] } ], "locations" : [ "wilderness" ], - "city_distance" : [3, 5], - "city_sizes" : [1, 12], + "city_distance" : [3, -1], + "city_sizes" : [1, 16], "occurrences" : [75, 100], "flags" : [ "UNIQUE" ] },{ diff --git a/data/json/overmap_terrain.json b/data/json/overmap_terrain.json index 9a7a24ddf64bf..2d15ba15d33cc 100644 --- a/data/json/overmap_terrain.json +++ b/data/json/overmap_terrain.json @@ -100,7 +100,7 @@ "sym": 70, "color": "green", "see_cost": 3, - "extras": "field", + "extras": "forest", "spawns": { "group": "GROUP_FOREST", "population": [ 0, 3 ], "chance": 80 }, "flags": [ "NO_ROTATE" ] }, @@ -111,7 +111,7 @@ "sym": 70, "color": "green", "see_cost": 4, - "extras": "field", + "extras": "forest_thick", "spawns": { "group": "GROUP_FOREST", "population": [ 0, 6 ], "chance": 90 }, "mapgen": [ { "method": "builtin", "name": "forest" } ], "flags": [ "NO_ROTATE" ] @@ -123,7 +123,7 @@ "sym": 70, "color": "cyan", "see_cost": 4, - "extras": "field", + "extras": "forest_water", "spawns": { "group": "GROUP_SWAMP", "population": [ 1, 4 ], "chance": 100 }, "mapgen": [ { "method": "builtin", "name": "forest" } ], "flags": [ "NO_ROTATE" ] @@ -1649,6 +1649,25 @@ "see_cost": 5, "flags": [ "NO_ROTATE" ] }, + { + "type": "overmap_terrain", + "id": "lab_escape_cells", + "name": "science lab", + "sym": 76, + "color": "light_blue", + "see_cost": 5, + "flags": [ "NO_ROTATE" ] + }, + { + "type": "overmap_terrain", + "id": "lab_escape_entrance", + "name": "science lab", + "sym": 76, + "color": "light_blue", + "spawns": { "group": "GROUP_LAB", "population": [ 0, 5 ], "chance": 20 }, + "see_cost": 5, + "flags": [ "NO_ROTATE" ] + }, { "type" : "overmap_terrain", "id" : "ants_lab", @@ -1685,7 +1704,7 @@ "name": "science lab", "sym": 76, "color": "light_blue", - "spawns": { "group": "GROUP_ICE_LAB", "population": [ 0, 5 ], "chance": 20 }, + "spawns": { "group": "GROUP_LAB", "population": [ 0, 5 ], "chance": 20 }, "see_cost": 5, "flags": [ "NO_ROTATE" ] }, @@ -1696,7 +1715,7 @@ "sym": 76, "color": "blue", "see_cost": 5, - "spawns": { "group": "GROUP_ICE_LAB", "population": [ 0, 5 ], "chance": 20 }, + "spawns": { "group": "GROUP_LAB", "population": [ 0, 5 ], "chance": 20 }, "flags": [ "KNOWN_DOWN", "NO_ROTATE" ] }, { @@ -1705,7 +1724,7 @@ "name": "science lab", "sym": 76, "color": "light_blue", - "spawns": { "group": "GROUP_ICE_LAB", "population": [ 0, 8 ], "chance": 30 }, + "spawns": { "group": "GROUP_LAB", "population": [ 0, 8 ], "chance": 30 }, "see_cost": 5, "flags": [ "NO_ROTATE" ] }, @@ -1715,7 +1734,7 @@ "name": "science lab", "sym": 76, "color": "cyan", - "spawns": { "group": "GROUP_ICE_LAB", "population": [ 4, 12 ], "chance": 90 }, + "spawns": { "group": "GROUP_LAB", "population": [ 4, 12 ], "chance": 90 }, "see_cost": 5, "flags": [ "NO_ROTATE" ] }, @@ -1726,7 +1745,7 @@ "sym": 76, "color": "light_blue", "see_cost": 5, - "spawns": { "group": "GROUP_TOWER_LAB", "population": [ 0, 5 ], "chance": 20 }, + "spawns": { "group": "GROUP_LAB", "population": [ 0, 5 ], "chance": 20 }, "flags": [ "NO_ROTATE" ] }, { @@ -1736,7 +1755,7 @@ "sym": 76, "color": "blue", "see_cost": 5, - "spawns": { "group": "GROUP_TOWER_LAB", "population": [ 0, 5 ], "chance": 20 }, + "spawns": { "group": "GROUP_LAB", "population": [ 0, 5 ], "chance": 20 }, "flags": [ "NO_ROTATE" ] }, { diff --git a/data/json/professions.json b/data/json/professions.json index 91eb939872174..9c06807a9162b 100644 --- a/data/json/professions.json +++ b/data/json/professions.json @@ -1085,7 +1085,7 @@ "type": "profession", "ident": "mutant_patient", "name": "Unwilling Mutant", - "description": "During the panic of the Cataclysm, one of the lab technicians (feeling remorse for their part in the experiments forced on you and your genetic makeup) set you free.", + "description": "You were a human guinea pig, used by laboratory technicians to understand the immense power of mutation.", "points": -1, "items": { "both": [ "subsuit_xl" ], "male": [ "briefs" ], "female": [ "bra", "panties" ] }, "flags": [ "SCEN_ONLY" ] @@ -2797,7 +2797,7 @@ "ident": "bionic_installer", "name": "Augmentation Associate", "description": "When bionics first emerged, you were quick to make them into your career, and spent your days overseeing their installation. As one of the few non-zombies in the world that can calibrate an Autodoc, your skills might come in handy now that the world is over.", - "points": 5, + "points": 4, "skills": [ { "level": 4, "name": "firstaid" }, { "level": 4, "name": "electronics" } ], "traits": [ "PROF_AUTODOC" ], "items": { @@ -2811,7 +2811,6 @@ "bandages", "anesthesia", "1st_aid", - "recipe_augs", "stethoscope" ], "male": [ "boxer_shorts" ], diff --git a/data/json/recipes/recipe_ammo.json b/data/json/recipes/recipe_ammo.json index 75bad485f4a0f..5351e0175afc5 100644 --- a/data/json/recipes/recipe_ammo.json +++ b/data/json/recipes/recipe_ammo.json @@ -8,30 +8,20 @@ "skills_required": ["electronics", 7], "difficulty": 8, "time": 95000, - "book_learn": [[ "recipe_lab_elec", 7 ] , [ "recipe_mininuke_launch", 5]], + "book_learn": [ [ "recipe_lab_elec", 7 ] , [ "recipe_mininuke_launch", 5 ] ], "qualities":[ - {"id":"SAW_M","level":1}, - {"id":"SCREW","level":1}, - {"id":"WRENCH","level":1} - ], "tools": [ - [ - [ "boltcutters", -1 ], - [ "toolset", -1 ] - ] + { "id": "SAW_M", "level": 1 }, + { "id": "SCREW", "level": 1 }, + { "id": "WRENCH", "level": 1 } ], + "tools": [ [ [ "boltcutters", -1 ], [ "toolset", -1 ] ] ], "components": [ - [ - ["mininuke", 1] - ], - [ - [ "cable", 2 ] - ], - [ - [ "circuit", 1 ] - ], - [ - [ "transponder", 1 ] - ] + [ [ "mininuke", 1 ] ], + [ [ "cable", 2 ] ], + [ [ "circuit", 1 ] ], + [ [ "transponder", 1 ] ], + [ [ "pipe", 8 ] ], + [ [ "chem_rocket_fuel", 1750 ] ] ] },{ "type" : "recipe", diff --git a/data/json/recipes/recipe_companion.json b/data/json/recipes/recipe_companion.json index 4d500ede5f9ac..89d84085ac461 100644 --- a/data/json/recipes/recipe_companion.json +++ b/data/json/recipes/recipe_companion.json @@ -1002,7 +1002,8 @@ "time": 280000, "autolearn": false, "never_learn": true, - "components": [ [ [ "steel_lump", 2 ], [ "steel_chunk", 8 ], [ "scrap", 24 ] ], [ [ "charcoal", 100 ] ] ] + "using": [ [ "steel_standard", 6 ] ], + "components": [ [ [ "charcoal", 100 ] ] ] }, { "type": "recipe", @@ -1543,7 +1544,8 @@ "time": 140000, "autolearn": false, "never_learn": true, - "components": [ [ [ "steel_lump", 2 ], [ "steel_chunk", 8 ], [ "scrap", 24 ] ], [ [ "charcoal", 200 ] ] ] + "using": [ [ "steel_standard", 6 ] ], + "components": [ [ [ "charcoal", 200 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/recipe_deconstruction.json b/data/json/recipes/recipe_deconstruction.json index 0c02509f4e63b..cce4ac12ccae7 100644 --- a/data/json/recipes/recipe_deconstruction.json +++ b/data/json/recipes/recipe_deconstruction.json @@ -1990,6 +1990,29 @@ ] }, { + "//": "TODO: use copy-from inheritance for solarpack uncrafts -- it is currently not working properly #24702", + "result": "solarpack", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 8, + "skills_required": [ [ "fabrication", 2 ], [ "mechanics", 2 ] ], + "time": 50000, + "using": [ [ "soldering_standard", 35 ], [ "welding_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 2 } ], + "components": [ + [ [ "power_supply", 2 ] ], + [ [ "amplifier", 2 ] ], + [ [ "solar_panel", 1 ] ], + [ [ "cable", 20 ] ], + [ [ "sheet_metal", 1 ] ], + [ [ "sheet_metal_small", 4 ] ], + [ [ "steel_chunk", 4 ] ], + [ [ "scrap", 8 ] ], + [ [ "rope_6", 1 ] ] + ] + }, + { + "//": "TODO: use copy-from inheritance for solarpack uncrafts -- it is currently not working properly #24702", "result": "solarpack_on", "type": "uncraft", "skill_used": "electronics", @@ -2003,11 +2026,37 @@ [ [ "amplifier", 2 ] ], [ [ "solar_panel", 1 ] ], [ [ "cable", 20 ] ], - [ [ "sheet_metal", 3 ] ], + [ [ "sheet_metal", 1 ] ], + [ [ "sheet_metal_small", 4 ] ], + [ [ "steel_chunk", 4 ] ], + [ [ "scrap", 8 ] ], + [ [ "rope_6", 1 ] ] + ] + }, + { + "//": "TODO: use copy-from inheritance for solarpack uncrafts -- it is currently not working properly #24702", + "result": "q_solarpack", + "type": "uncraft", + "skill_used": "electronics", + "difficulty": 10, + "skills_required": [ [ "fabrication", 2 ], [ "mechanics", 2 ] ], + "time": 50000, + "using": [ [ "soldering_standard", 35 ], [ "welding_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 2 } ], + "components": [ + [ [ "power_supply", 2 ] ], + [ [ "amplifier", 2 ] ], + [ [ "solar_panel_v3", 1 ] ], + [ [ "cable", 20 ] ], + [ [ "sheet_metal", 1 ] ], + [ [ "sheet_metal_small", 4 ] ], + [ [ "steel_chunk", 4 ] ], + [ [ "scrap", 8 ] ], [ [ "rope_6", 1 ] ] ] }, { + "//": "TODO: use copy-from inheritance for solarpack uncrafts -- it is currently not working properly #24702", "result": "q_solarpack_on", "type": "uncraft", "skill_used": "electronics", @@ -2021,7 +2070,10 @@ [ [ "amplifier", 2 ] ], [ [ "solar_panel_v3", 1 ] ], [ [ "cable", 20 ] ], - [ [ "sheet_metal", 3 ] ], + [ [ "sheet_metal", 1 ] ], + [ [ "sheet_metal_small", 4 ] ], + [ [ "steel_chunk", 4 ] ], + [ [ "scrap", 8 ] ], [ [ "rope_6", 1 ] ] ] }, diff --git a/data/json/recipes/recipe_electronics.json b/data/json/recipes/recipe_electronics.json index ba33c8b5f836f..2a5fd0b753889 100644 --- a/data/json/recipes/recipe_electronics.json +++ b/data/json/recipes/recipe_electronics.json @@ -926,18 +926,21 @@ "skills_required": [ [ "fabrication", 2 ], [ "mechanics", 2 ] ], "difficulty": 8, "time": 50000, - "reversible": true, "decomp_learn": 5, "autolearn": true, "book_learn": [ [ "manual_electronics", 7 ], [ "textbook_electronics", 6 ], [ "advanced_electronics", 6 ] ], "using": [ [ "soldering_standard", 35 ], [ "welding_standard", 20 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 2 } ], + "byproducts": [ + [ "sheet_metal_small", 8 ], + [ "scrap", 8 ] + ], "components": [ [ [ "power_supply", 2 ] ], [ [ "amplifier", 2 ] ], - [ [ "solar_cell", 12 ], [ "solar_panel", 1 ] ], + [ [ "solar_panel", 1 ] ], [ [ "cable", 20 ] ], - [ [ "sheet_metal", 3 ] ], + [ [ "sheet_metal", 2 ] ], [ [ "rope_6", 1 ] ] ] },{ @@ -949,18 +952,21 @@ "skills_required": [ [ "fabrication", 2 ], [ "mechanics", 2 ] ], "difficulty": 10, "time": 50000, - "reversible": true, "decomp_learn": 5, "autolearn": true, "book_learn": [ [ "recipe_augs" , 7 ], [ "recipe_lab_elec", 7 ], [ "advanced_electronics", 8 ] ], "using": [ [ "soldering_standard", 35 ], [ "welding_standard", 20 ] ], "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 2 } ], + "byproducts": [ + [ "sheet_metal_small", 8 ], + [ "scrap", 8 ] + ], "components": [ [ [ "power_supply", 2 ] ], [ [ "amplifier", 2 ] ], [ [ "cable", 20 ] ], [ [ "solar_panel_v3", 1 ] ], - [ [ "sheet_metal", 3 ] ], + [ [ "sheet_metal", 2 ] ], [ [ "rope_6", 1 ] ] ] },{ diff --git a/data/json/recipes/recipe_others.json b/data/json/recipes/recipe_others.json index de61209c11291..248674c2fc041 100644 --- a/data/json/recipes/recipe_others.json +++ b/data/json/recipes/recipe_others.json @@ -781,7 +781,7 @@ "autolearn": true, "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal", 1 ] ] ] + "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal_small", 5 ] ] ] }, { "type": "recipe", @@ -1543,7 +1543,7 @@ "time": 2000, "autolearn": true, "qualities": [ { "id": "HAMMER", "level": 2 } ], - "components": [ [ [ "sheet_metal", 2 ] ] ] + "components": [ [ [ "sheet_metal", 1 ] ] ] }, { "type": "recipe", @@ -1556,7 +1556,7 @@ "autolearn": true, "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 } ], - "components": [ [ [ "sheet_metal", 2 ] ] ] + "components": [ [ [ "sheet_metal", 1 ] ] ] }, { "type": "recipe", @@ -1583,7 +1583,7 @@ "autolearn": true, "using": [ [ "welding_standard", 2 ] ], "qualities": [ { "id": "HAMMER", "level": 2 } ], - "components": [ [ [ "sheet_metal", 1 ], [ "scrap", 2 ] ] ] + "components": [ [ [ "sheet_metal_small", 3 ] ] ] }, { "type": "recipe", @@ -2107,7 +2107,7 @@ "autolearn": true, "qualities": [ { "id": "HAMMER", "level": 2 } ], "tools": [ [ [ "forge", 100 ], [ "oxy_torch", 20 ] ] ], - "components": [ [ [ "frame", 1 ] ], [ [ "sheet_metal", 2 ] ] ] + "components": [ [ [ "frame", 1 ] ], [ [ "sheet_metal", 1 ] ] ] }, { "type": "recipe", @@ -3200,7 +3200,7 @@ "reversible": true, "autolearn": true, "components": [ - [ [ "sheet_metal", 2 ] ], + [ [ "sheet_metal_small", 5 ] ], [ [ "nail", 11 ] ], [ [ "wire", 1 ] ], [ [ "pockknife", 1 ], [ "primitive_knife", 1 ], [ "switchblade", 1 ], [ "knife_steak", 1 ] ], @@ -3391,7 +3391,7 @@ "autolearn": true, "using": [ [ "welding_standard", 3 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "sheet_metal", 3 ] ], [ [ "steel_chunk", 3 ], [ "scrap", 9 ] ] ] + "components": [ [ [ "sheet_metal_small", 4 ] ], [ [ "steel_chunk", 3 ], [ "scrap", 9 ] ] ] }, { "type": "recipe", @@ -3405,7 +3405,7 @@ "autolearn": true, "using": [ [ "welding_standard", 3 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "sheet_metal", 3 ] ], [ [ "steel_chunk", 3 ], [ "scrap", 9 ] ] ] + "components": [ [ [ "sheet_metal", 1 ] ], [ [ "steel_chunk", 3 ], [ "scrap", 9 ] ] ] }, { "type": "recipe", @@ -3873,7 +3873,7 @@ "reversible": true, "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal", 2 ] ], [ [ "motor", 2 ] ], [ [ "processor", 1 ] ] ] + "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal", 1 ] ], [ [ "motor", 2 ] ], [ [ "processor", 1 ] ] ] }, { "type": "recipe", @@ -3887,7 +3887,7 @@ "reversible": true, "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal", 2 ] ], [ [ "motor", 2 ] ], [ [ "wheel", 1 ] ], [ [ "processor", 1 ] ] ] + "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal", 1 ] ], [ [ "motor", 2 ] ], [ [ "wheel", 1 ] ], [ [ "processor", 1 ] ] ] }, { "type": "recipe", @@ -3901,7 +3901,7 @@ "reversible": true, "using": [ [ "welding_standard", 5 ] ], "qualities": [ { "id": "HAMMER", "level": 2 }, { "id": "SAW_M", "level": 1 } ], - "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal", 2 ] ], [ [ "frame", 1 ] ], [ [ "wheel", 1 ] ] ] + "components": [ [ [ "pipe", 2 ] ], [ [ "sheet_metal", 1 ] ], [ [ "frame", 1 ] ], [ [ "wheel", 1 ] ] ] }, { "type": "recipe", @@ -4080,7 +4080,7 @@ "autolearn": true, "book_learn": [ [ "textbook_fabrication", 2 ], [ "textbook_mechanics", 3 ] ], "qualities": [ { "id": "SAW_M", "level": 1 }, { "id": "DRILL", "level": 1 }, { "id": "SCREW", "level": 1 } ], - "components": [ [ [ "scrap", 6 ] ], [ [ "pipe", 6 ] ], [ [ "nail", 12 ] ], [ [ "sheet_metal", 2 ] ] ] + "components": [ [ [ "scrap", 6 ] ], [ [ "pipe", 6 ] ], [ [ "nail", 12 ] ], [ [ "sheet_metal", 1 ] ] ] }, { "type": "recipe", diff --git a/data/json/recipes/recipe_weapon.json b/data/json/recipes/recipe_weapon.json index 370f98d140022..b701a658f50cf 100644 --- a/data/json/recipes/recipe_weapon.json +++ b/data/json/recipes/recipe_weapon.json @@ -4121,7 +4121,7 @@ "components": [ [ -[ "sheet_metal", 4 ] +[ "sheet_metal", 2 ] ], [ [ "pilot_light", 2 ] diff --git a/data/json/recipes/weapon/magazines.json b/data/json/recipes/weapon/magazines.json index 72e2ef829230b..8189415b6f188 100644 --- a/data/json/recipes/weapon/magazines.json +++ b/data/json/recipes/weapon/magazines.json @@ -105,7 +105,7 @@ { "id": "SCREW_FINE", "level": 1 } ], "components": [ - [ [ "sheet_metal", 1 ] ], + [ [ "sheet_metal_small", 1 ] ], [ [ "spring", 1 ] ], [ [ "duct_tape", 40 ] ] ] @@ -126,7 +126,7 @@ { "id": "SCREW_FINE", "level": 1 } ], "components": [ - [ [ "sheet_metal", 1 ] ], + [ [ "sheet_metal_small", 1 ] ], [ [ "spring", 1 ] ], [ [ "duct_tape", 40 ] ] ] diff --git a/data/json/regional_map_settings.json b/data/json/regional_map_settings.json index 7addfa1b6b8c0..ad9b9de3dd845 100644 --- a/data/json/regional_map_settings.json +++ b/data/json/regional_map_settings.json @@ -48,7 +48,336 @@ }, "boosted_other_percent": 50.0, "//": "...accounts for this % of total coverage" }, + "forest_mapgen_settings": { "//": "each section beneath this corresponds to an overmap terrain type", + "forest": { "//": "'forest' overmap terrain is generally at the edge of forests", + "sparseness_adjacency_factor": 3, "//": "the difference between this for the terrain being generated compared to its adjacent terrains controls how sparse the terrain will be", + "item_group": "forest", "//": "name of the item group used to place items randomly within the overmap terrain", + "item_group_chance": 60, "//": "% chance, between 1 and 100, that an item will be placed", + "item_spawn_iterations": 1, "//": "number of times that the item spawning will be called", + "clear_groundcover": false, "//": "if set to true, clear all previously defined 'groundcover' for this terrain. only relevant for 'region_overlay' that override these settings", + "groundcover": { "//": "weighted list of terrain types placed as groundcover before anything else. higher values are more frequent", + "t_grass_long": 2, + "t_grass": 1, + "t_dirt": 1 + }, + "clear_components": false, "//": "if set to true, clear all previously defined 'components' for this terrain. only relevant for 'region_overlay' that override these settings", + "components": { "//": "members are named components that make up the mapgen. the names are not special, and are the handles for 'region_overlay' to override", + "trees": { "//": "'trees' component", + "sequence": 0, "//": "sequence in which the components are processed. a region_overlay can reorder the components.", + "chance": 12, "//": "one_in(x) chance that something from this component will be placed", + "clear_types": false, "//": "if set to true, clear all previously defined types for this component. only relevant for 'region_overlay' that override these settings", + "types": { "//": "weighted list of terrain and furniture types that make up this component. higher values are more frequent, but are all just relative to others for this component.", + "t_tree_young": 128, + "t_tree": 32, + "t_tree_birch": 32, + "t_tree_pine": 32, + "t_tree_maple": 32, + "t_tree_willow": 32, + "t_tree_hickory": 32, + "t_tree_blackjack": 8, + "t_tree_coffee": 8, + "t_tree_apple": 2, + "t_tree_apricot": 2, + "t_tree_cherry": 2, + "t_tree_peach": 2, + "t_tree_pear": 2, + "t_tree_plum": 2, + "t_tree_elderberry": 2, + "t_tree_mulberry": 2, + "t_tree_deadpine": 1, + "t_tree_hickory_dead": 1, + "t_tree_dead": 1 + } + }, + "shrubs_and_flowers": { + "sequence": 1, + "chance": 10, + "clear_types": false, + "types": { + "t_underbrush": 25, + "t_shrub": 5, + "t_shrub_blueberry": 1, + "t_shrub_strawberry": 1, + "t_shrub_blackberry": 1, + "t_shrub_raspberry": 1, + "t_shrub_huckleberry": 1, + "t_shrub_grape": 1, + "t_shrub_rose": 1, + "t_shrub_hydrangea": 1, + "f_flower_tulip": 1, + "f_flower_spurge": 1, + "f_chamomile": 1, + "f_dandelion": 1, + "f_datura": 1, + "f_dahlia": 1, + "f_bluebell": 1, + "f_mutpoppy": 1 + } + }, + "clutter": { + "sequence": 2, + "chance": 80, + "clear_types": false, + "types": { + "t_trunk": 128, + "t_dirtmound": 128, + "f_boulder_small": 128, + "f_rubble_rock": 32, + "f_boulder_medium": 8, + "f_boulder_large": 1, + "t_pit": 1, + "t_pit_shallow": 1 + } + }, + "water": { + "sequence": 3, + "chance": 512, + "clear_types": false, + "types": { + "t_water_sh": 1 + } + } + } + }, + "forest_thick": { + "sparseness_adjacency_factor": 4, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + "t_grass_long": 2, + "t_grass": 1, + "t_dirt": 1 + }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 5, + "clear_types": false, + "types": { + "t_tree": 128, + "t_tree_young": 128, + "t_tree_birch": 32, + "t_tree_pine": 32, + "t_tree_maple": 32, + "t_tree_willow": 32, + "t_tree_hickory": 32, + "t_tree_blackjack": 4, + "t_tree_coffee": 4, + "t_tree_apple": 1, + "t_tree_apricot": 1, + "t_tree_cherry": 1, + "t_tree_peach": 1, + "t_tree_pear": 1, + "t_tree_plum": 1, + "t_tree_elderberry": 1, + "t_tree_mulberry": 1, + "t_tree_deadpine": 8, + "t_tree_hickory_dead": 8, + "t_tree_dead": 8 + } + }, + "shrubs_and_flowers": { + "sequence": 1, + "chance": 5, + "clear_types": false, + "types": { + "t_underbrush": 25, + "t_shrub": 5, + "t_shrub_blueberry": 1, + "t_shrub_strawberry": 1, + "t_shrub_blackberry": 1, + "t_shrub_raspberry": 1, + "t_shrub_huckleberry": 1, + "t_shrub_grape": 1, + "t_shrub_rose": 1, + "t_shrub_hydrangea": 1, + "f_flower_tulip": 1, + "f_flower_spurge": 1, + "f_chamomile": 1, + "f_dandelion": 1, + "f_datura": 1, + "f_dahlia": 1, + "f_bluebell": 1, + "f_mutpoppy": 1 + } + }, + "clutter": { + "sequence": 2, + "chance": 64, + "clear_types": false, + "types": { + "t_trunk": 64, + "t_dirtmound": 64, + "f_boulder_small": 32, + "f_rubble_rock": 32, + "f_boulder_medium": 16, + "f_boulder_large": 4, + "t_pit": 1, + "t_pit_shallow": 1 + } + }, + "water": { + "sequence": 3, + "chance": 512, + "clear_types": false, + "types": { + "t_water_sh": 1 + } + } + } + }, + "forest_water": { + "sparseness_adjacency_factor": 2, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + "t_grass_long": 2, + "t_grass": 1, + "t_dirt": 1 + }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 45, + "clear_types": false, + "types": { + "t_tree": 30, + "t_tree_birch": 30, + "t_tree_maple": 60, + "t_tree_willow": 40, + "t_tree_hickory": 30, + "t_tree_apple": 1, + "t_tree_cherry": 1, + "t_tree_peach": 1, + "t_tree_pear": 1, + "t_tree_plum": 1, + "t_tree_elderberry": 1, + "t_tree_mulberry": 1, + "t_tree_deadpine": 30, + "t_tree_hickory_dead": 30, + "t_tree_dead": 30 + } + }, + "shrubs_and_flowers": { + "sequence": 1, + "chance": 15, + "clear_types": false, + "types": { + "t_underbrush": 25, + "t_shrub": 5, + "t_shrub_blueberry": 1, + "t_shrub_strawberry": 1, + "t_shrub_blackberry": 1, + "t_shrub_raspberry": 1, + "t_shrub_huckleberry": 1, + "t_shrub_grape": 1, + "t_shrub_rose": 1, + "t_shrub_hydrangea": 1, + "f_flower_tulip": 1, + "f_flower_spurge": 1, + "f_chamomile": 1, + "f_dandelion": 1, + "f_datura": 1, + "f_dahlia": 1, + "f_bluebell": 1, + "f_mutpoppy": 1 + } + }, + "clutter": { + "sequence": 2, + "chance": 75, + "clear_types": false, + "types": { + "t_trunk": 2, + "f_boulder_small": 2, + "f_boulder_medium": 1 + } + }, + "water": { + "sequence": 3, + "chance": 2, + "clear_types": false, + "types": { + "t_swater_sh": 12, + "t_swater_dp": 1, + "t_water_sh": 6 + } + } + } + } + }, "map_extras": { "//": "mapping for weighted lists of extras", + "forest": { + "chance": 20, "//": "one in # chance of spawning an extra", + "extras": { "//": "weighted list", + "mx_helicopter": 40, + "mx_military": 8, + "mx_science": 20, + "mx_collegekids": 25, + "mx_drugdeal": 20, + "mx_supplydrop": 10, + "mx_portal": 3, + "mx_minefield": 50, + "mx_crater": 10, + "mx_fumarole": 8, + "mx_portal_in": 1, + "mx_anomaly": 3, + "mx_spider": 200, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125 + } + }, + "forest_thick": { + "chance": 20, "//": "one in # chance of spawning an extra", + "extras": { "//": "weighted list", + "mx_helicopter": 40, + "mx_military": 8, + "mx_science": 20, + "mx_collegekids": 25, + "mx_drugdeal": 20, + "mx_supplydrop": 10, + "mx_portal": 3, + "mx_minefield": 50, + "mx_crater": 10, + "mx_fumarole": 8, + "mx_portal_in": 1, + "mx_anomaly": 3, + "mx_shia": 1, + "mx_spider": 200, + "mx_jabberwock": 1, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125 + } + }, + "forest_water": { + "chance": 20, "//": "one in # chance of spawning an extra", + "extras": { "//": "weighted list", + "mx_helicopter": 40, + "mx_military": 8, + "mx_science": 20, + "mx_collegekids": 25, + "mx_drugdeal": 20, + "mx_supplydrop": 10, + "mx_portal": 3, + "mx_minefield": 50, + "mx_crater": 10, + "mx_fumarole": 8, + "mx_portal_in": 1, + "mx_anomaly": 3, + "mx_spider": 200, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125 + } + }, "field": { "chance": 90, "//": "one in # chance of spawning an extra", "extras": { "//": "weighted list", diff --git a/data/json/scenarios/scenarios.json b/data/json/scenarios/scenarios.json index f3c769969c514..f2fbe2270bc3f 100644 --- a/data/json/scenarios/scenarios.json +++ b/data/json/scenarios/scenarios.json @@ -82,10 +82,10 @@ "ident": "lab_chal", "name": "Challenge-Lab", "points": -8, - "description": "You've been locked in a lab with no (obvious) way out! Find a way to escape or starve to death.", + "description": "You were locked in a lab cell until some kind of monster broke the glass. The lab is in lockdown! Find a way to escape.", "start_name": "Locked Lab", "professions": [ "unemployed", "mutant_patient", "mutant_volunteer", "labtech", "broken_cyborg" ], - "allowed_locs": [ "lab_stairs", "lab_finale", "ice_lab_stairs", "ice_lab_finale" ], + "allowed_locs": [ "lab_escape_cells" ], "traits": [ "ELFAEYES", "URSINE_EYE", diff --git a/data/json/start_locations.json b/data/json/start_locations.json index d2d9c7303e930..b4180b3ac31af 100644 --- a/data/json/start_locations.json +++ b/data/json/start_locations.json @@ -154,27 +154,9 @@ }, { "type": "start_location", - "ident": "lab_stairs", + "ident": "lab_escape_cells", "name": "Science lab", - "target": "lab_stairs" - }, - { - "type": "start_location", - "ident": "lab_finale", - "name": "Bottom of a science lab", - "target": "lab_finale" - }, - { - "type": "start_location", - "ident": "ice_lab_stairs", - "name": "Frozen science lab", - "target": "ice_lab_stairs" - }, - { - "type": "start_location", - "ident": "ice_lab_finale", - "name": "Deep-frozen science lab", - "target": "ice_lab_finale" + "target": "lab_escape_cells" }, { "type": "start_location", diff --git a/data/json/terrain.json b/data/json/terrain.json index 73f9441989654..5fed150093ff7 100644 --- a/data/json/terrain.json +++ b/data/json/terrain.json @@ -523,7 +523,7 @@ "type": "terrain", "id": "t_grass_long", "name": "long grass", - "description": "Long shaggy grass that hasn't been cut recently.", + "description": "Long shaggy grass about shin high.", "looks_like": "t_grass", "symbol": ",", "color": "green", @@ -3377,6 +3377,7 @@ "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], "transforms_into": "t_tree_mulberry_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_tree_apple", "harvest_by_season": [ { "seasons": [ "summer" ], @@ -3407,6 +3408,7 @@ "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "HARVESTED" ], "examine_action": "harvested_plant", "transforms_into": "t_tree_mulberry", + "looks_like": "t_tree_apple_harvested", "bash": { "str_min": 80, "str_max": 180, @@ -3428,6 +3430,7 @@ "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT" ], "transforms_into": "t_tree_elderberry_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_tree_plum", "harvest_by_season": [ { "seasons": [ "summer" ], @@ -3458,6 +3461,7 @@ "flags": [ "FLAMMABLE_ASH", "NOITEM", "SUPPORTS_ROOF", "TREE", "REDUCE_SCENT", "HARVESTED" ], "examine_action": "harvested_plant", "transforms_into": "t_tree_elderberry", + "looks_like": "t_tree_plum_harvested", "bash": { "str_min": 80, "str_max": 180, @@ -3953,6 +3957,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP" ], "transforms_into": "t_shrub_blackberry_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_shrub_blueberry", "harvest_by_season": [ { "seasons": [ "summer" ], @@ -3982,6 +3987,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP", "HARVESTED" ], "transforms_into": "t_shrub_blackberry", "examine_action": "harvested_plant", + "looks_like": "t_shrub_blueberry_harvested", "bash": { "str_min": 4, "str_max": 60, @@ -4002,6 +4008,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT" ], "transforms_into": "t_shrub_huckleberry_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_shrub_blueberry", "harvest_by_season": [ { "seasons": [ "summer" ], @@ -4031,6 +4038,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "HARVESTED" ], "transforms_into": "t_shrub_huckleberry", "examine_action": "harvested_plant", + "looks_like": "t_shrub_blueberry_harvested", "bash": { "str_min": 4, "str_max": 60, @@ -4051,6 +4059,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP" ], "transforms_into": "t_shrub_raspberry_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_shrub_strawberry", "harvest_by_season": [ { "seasons": [ "summer" ], @@ -4080,6 +4089,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP", "HARVESTED" ], "transforms_into": "t_shrub_raspberry", "examine_action": "harvested_plant", + "looks_like": "t_shrub_strawberry_harvested", "bash": { "str_min": 4, "str_max": 60, @@ -4100,6 +4110,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT" ], "transforms_into": "t_shrub_grape_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_shrub_blueberry", "harvest_by_season": [ { "seasons": [ "summer" ], @@ -4129,6 +4140,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "HARVESTED" ], "transforms_into": "t_shrub_grape", "examine_action": "harvested_plant", + "looks_like": "t_shrub_blueberry_harvested", "bash": { "str_min": 4, "str_max": 60, @@ -4149,6 +4161,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP" ], "transforms_into": "t_shrub_rose_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_shrub_strawberry", "harvest_by_season": [ { "seasons": [ "autumn" ], "entries": [ { "drop": "rose_hips", "base_num": [ 2, 5 ], "scaled_num": [ 0, 0.5 ] } ] } ], "//": "Insert rose (flower) harvest in summer once flowers have a use (same for other generic flowers).", "bash": { @@ -4171,6 +4184,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "SHARP", "HARVESTED" ], "transforms_into": "t_shrub_rose", "examine_action": "harvested_plant", + "looks_like": "t_shrub_strawberry_harvested", "bash": { "str_min": 4, "str_max": 60, @@ -4191,6 +4205,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT" ], "transforms_into": "t_shrub_hydrangea_harvested", "examine_action": "harvest_ter_nectar", + "looks_like": "t_shrub_blueberry", "//": "Insert hydrangea harvest in autumn once flowers have a use (same for other generic flowers).", "bash": { "str_min": 4, @@ -4212,6 +4227,7 @@ "flags": [ "TRANSPARENT", "CONTAINER", "FLAMMABLE_ASH", "THIN_OBSTACLE", "SHRUB", "SHORT", "HARVESTED" ], "transforms_into": "t_shrub_hydrangea", "examine_action": "harvested_plant", + "looks_like": "t_shrub_blueberry_harvested", "bash": { "str_min": 4, "str_max": 60, diff --git a/data/json/test_regions.json b/data/json/test_regions.json index b3923e2841396..77333abe9ce73 100644 --- a/data/json/test_regions.json +++ b/data/json/test_regions.json @@ -21,6 +21,121 @@ }, "boosted_other_percent": 20.0, "//": "...accounts for this % of plant coverage" }, + "forest_mapgen_settings": { + "forest": { + "sparseness_adjacency_factor": 3, + "item_group": "forest", + "item_group_chance": 1, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 20, + "clear_types": false, + "types": { + "t_tree_willow": 1, + "t_tree_dead": 1, + "f_mutcactus_test": 200 + } + }, + "other": { + "sequence": 1, + "chance": 20, + "clear_types": false, + "types": { + "t_shrub": 1 + } + }, + "water": { + "sequence": 2, + "chance": 1, + "clear_types": false, + "types": { + } + } + } + }, + "forest_thick": { + "sparseness_adjacency_factor": 4, + "item_group": "forest", + "item_group_chance": 1, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 20, + "clear_types": false, + "types": { + "f_mutcactus_test": 4, + "t_tree_dead": 1 + } + }, + "other": { + "sequence": 1, + "chance": 10, + "clear_types": false, + "types": { + "t_shrub": 16, + "t_pit": 1 + } + }, + "water": { + "sequence": 2, + "chance": 1, + "clear_types": false, + "types": { + } + } + } + }, + "forest_water": { + "sparseness_adjacency_factor": 2, + "item_group": "forest", + "item_group_chance": 1, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 100, + "clear_types": false, + "types": { + "t_tree_willow": 2, + "t_tree_dead": 1 + } + }, + "other": { + "sequence": 1, + "chance": 10, + "clear_types": false, + "types": { + "t_grass": 2, + "t_shrub": 2, + "t_dirt": 1 + } + }, + "water": { + "sequence": 2, + "chance": 20, + "clear_types": false, + "types": { + "t_water_sh": 1 + } + } + } + } + }, "num_forests": 2, "//": "# of forest chunks", "forest_size_min": 1, "//": "size range of forest chunk", "forest_size_max": 100, "//": "note: 32400 tiles in omap, 250*minmax = 3750-10000 default_oters become forests", diff --git a/data/json/uncraft/cbm/cbm.json b/data/json/uncraft/cbm/cbm.json new file mode 100644 index 0000000000000..d667a6d8abe42 --- /dev/null +++ b/data/json/uncraft/cbm/cbm.json @@ -0,0 +1,144 @@ +[ + { + "type": "uncraft", + "result": "bio_power_storage", + "skill_used": "electronics", + "difficulty": 6, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 6 ] ], [ [ "amplifier", 4 ] ], [ [ "plut_cell", 1 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_power_storage_mkII", + "skill_used": "electronics", + "difficulty": 10, + "time": 70000, + "using": [ [ "soldering_standard", 32 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 10 ] ], [ [ "amplifier", 6 ] ], [ [ "plut_cell", 2 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_solar", + "skill_used": "electronics", + "difficulty": 7, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 4 ] ], [ [ "amplifier", 2 ] ], [ [ "solar_cell", 4 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_batteries", + "skill_used": "electronics", + "difficulty": 7, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 2 ] ], [ [ "amplifier", 2 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_reactor", + "skill_used": "electronics", + "difficulty": 10, + "time": 50000, + "using": [ [ "soldering_standard", 120 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "minireactor", 1 ] ], [ [ "metal_tank_little", 1 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_plut_filter", + "skill_used": "electronics", + "difficulty": 10, + "time": 50000, + "using": [ [ "soldering_standard", 80 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "tools": [ [ [ "laptop", -1 ], [ "control_laptop", -1 ] ] ], + "components": [ [ [ "bio_blood_filter", 1 ] ], [ [ "metal_tank_little", 1 ] ], [ [ "burnt_out_bionic", 1 ] ], [ [ "RAM", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_reactor_upgrade", + "skill_used": "electronics", + "difficulty": 10, + "time": 50000, + "using": [ [ "soldering_standard", 120 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "tools": [ [ [ "laptop", -1 ], [ "control_laptop", -1 ] ] ], + "components": [ [ [ "bio_radscrubber", 1 ] ], [ [ "bio_geiger", 1 ] ], [ [ "RAM", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_advreactor", + "skill_used": "electronics", + "difficulty": 10, + "time": 5000, + "using": [ [ "soldering_standard", 10 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "bio_reactor", 1 ] ], [ [ "bio_reactor_upgrade", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_ups", + "skill_used": "electronics", + "difficulty": 6, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 2 ] ], [ [ "recharge_station", 1 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_power_armor_interface", + "skill_used": "electronics", + "difficulty": 6, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 2 ] ], [ [ "amplifier", 2 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_power_armor_interface_mkII", + "skill_used": "electronics", + "difficulty": 9, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 5 ] ], [ [ "amplifier", 3 ] ], [ [ "plut_cell", 5 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_evap", + "skill_used": "electronics", + "difficulty": 7, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 2 ] ], [ [ "hose", 1 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_flashlight", + "skill_used": "electronics", + "difficulty": 6, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 1 ] ], [ [ "amplifier", 1 ] ], [ [ "lens", 2 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + }, + { + "type": "uncraft", + "result": "bio_water_extractor", + "skill_used": "electronics", + "difficulty": 7, + "time": 50000, + "using": [ [ "soldering_standard", 20 ] ], + "qualities": [ { "id": "SCREW", "level": 1 } ], + "components": [ [ [ "power_supply", 2 ] ], [ [ "element", 1 ] ], [ [ "hose", 1 ] ], [ [ "burnt_out_bionic", 1 ] ] ] + } +] diff --git a/data/json/uncraft/generic.json b/data/json/uncraft/generic.json index 8f449d6a19f4f..9da0392417fad 100644 --- a/data/json/uncraft/generic.json +++ b/data/json/uncraft/generic.json @@ -15,6 +15,15 @@ "difficulty": 1, "time": 15000, "qualities": [ { "id": "SAW_M", "level": 2 } ], - "components": [ [ [ "scrap", 20 ] ] ] + "components": [ [ [ "sheet_metal_small", 24 ] ] ] + }, + { + "result": "sheet_metal_small", + "type": "uncraft", + "skill_used": "fabrication", + "difficulty": 1, + "time": 1200, + "qualities": [ { "id": "SAW_M", "level": 2 } ], + "components": [ [ [ "scrap", 5 ] ] ] } ] diff --git a/data/json/vehicle_parts.json b/data/json/vehicle_parts.json index 9f6c70fe74201..fd659a789ce67 100644 --- a/data/json/vehicle_parts.json +++ b/data/json/vehicle_parts.json @@ -53,9 +53,9 @@ "id": "ig_vp_sheet_metal", "subtype": "collection", "entries": [ - { "item": "steel_lump", "count": [ 4, 6 ] }, + { "item": "steel_lump", "count": [ 3, 4 ] }, { "item": "steel_chunk", "count": [ 4, 6 ] }, - { "item": "scrap", "count": [ 4, 6 ] } + { "item": "scrap", "count": [ 8, 10 ] } ] }, { diff --git a/data/json/vehicleparts/combustion.json b/data/json/vehicleparts/combustion.json index d214051f165d4..783105c22daf9 100644 --- a/data/json/vehicleparts/combustion.json +++ b/data/json/vehicleparts/combustion.json @@ -12,7 +12,7 @@ "noise_factor": 15, "damaged_power_factor": 0.25, "m2c": 50, - "flags": [ "ENGINE", "TOOL_WRENCH", "E_COMBUSTION", "E_ALTERNATOR", "E_HIGHER_SKILL" ], + "flags": [ "ENGINE", "TOOL_WRENCH", "E_COMBUSTION", "E_ALTERNATOR", "E_HIGHER_SKILL", "E_HEATER" ], "description": "A combustion engine. Burns fuel from a tank in the vehicle." }, { diff --git a/data/json/vehicleparts/engineering.json b/data/json/vehicleparts/engineering.json index a9020cd3ac95f..febfc77c8fe66 100644 --- a/data/json/vehicleparts/engineering.json +++ b/data/json/vehicleparts/engineering.json @@ -11,7 +11,7 @@ "broken_color": "light_blue", "difficulty": 5, "durability": 200, - "description": "A rigid steel boom crane. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have an unblocked direct path to where it is going and it must be within four tiles of it.", + "description": "A rigid steel boom crane. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have line of sight to where it is going and it must be within four tiles of it.", "breaks_into": [ { "item": "pipe", "count": [ 8, 32 ] }, { "item": "scrap", "count": [ 8, 24 ] } ], "qualities": [ [ "LIFT", 40 ], [ "JACK", 40 ] ], "flags": [ "TOOL_WRENCH", "PROTRUSION" ] @@ -29,7 +29,7 @@ "looks_like": "crane_medium", "difficulty": 5, "durability": 200, - "description": "A rigid steel boom crane. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have an unblocked direct path to where it is going and it must be within four tiles of it.", + "description": "A rigid steel boom crane. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have line of sight to where it is going and it must be within four tiles of it.", "breaks_into": [ { "item": "pipe", "count": [ 8, 32 ] }, { "item": "scrap", "count": [ 8, 24 ] } ], "qualities": [ [ "LIFT", 40 ], [ "JACK", 40 ] ], "flags": [ "TOOL_WRENCH", "OBSTACLE" ] @@ -46,7 +46,7 @@ "broken_color": "light_blue", "difficulty": 2, "durability": 100, - "description": "An extendable cantilever crane. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have an unblocked direct path to where it is going and it must be within four tiles of it.", + "description": "An extendable cantilever crane. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have line of sight to where it is going and it must be within four tiles of it.", "folded_volume": 12, "breaks_into": [ { "item": "pipe", "count": [ 2, 8 ] }, { "item": "scrap", "count": [ 2, 6 ] } ], "qualities": [ [ "LIFT", 7 ], [ "JACK", 7 ] ], @@ -64,7 +64,7 @@ "broken_color": "light_blue", "difficulty": 2, "durability": 100, - "description": "A small pallet lifter. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have an unblocked direct path to where it is going and it must be within four tiles of it.", + "description": "A small pallet lifter. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have line of sight to where it is going and it must be within four tiles of it.", "folded_volume": 12, "breaks_into": [ { "item": "pipe", "count": [ 1, 4 ] }, { "item": "scrap", "count": [ 2, 6 ] } ], "qualities": [ [ "LIFT", 1 ], [ "JACK", 1 ] ], @@ -83,7 +83,7 @@ "difficulty": 2, "damage_modifier": 200, "durability": 300, - "description": "A pair of forklift arms. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have an unblocked direct path to where it is going and it must be within four tiles of it.", + "description": "A pair of forklift arms. If it is in your line of sight and within two tiles of another vehicle, you will automatically use it when you want jack up the other vehicle to change the its wheels. To use it to lift a heavy component like an engine that you are installing or removing, the crane must have line of sight to where it is going and it must be within four tiles of it.", "size": 50, "breaks_into": [ { "item": "steel_lump", "count": [ 4, 6 ] }, diff --git a/data/json/vehicleparts/motor.json b/data/json/vehicleparts/motor.json index 6f0bff98e27e4..4e27e50574860 100644 --- a/data/json/vehicleparts/motor.json +++ b/data/json/vehicleparts/motor.json @@ -12,7 +12,7 @@ "symbol": "*", "color": "yellow", "broken_color": "red", - "flags": [ "ENGINE", "TOOL_WRENCH", "E_HIGHER_SKILL" ] + "flags": [ "ENGINE", "TOOL_WRENCH", "E_HIGHER_SKILL", "E_HEATER" ] }, { "id": "engine_electric_small", diff --git a/data/legacy/1/obsolete.json b/data/legacy/1/obsolete.json index 9a1f5eb5130d8..dd1a49eb2373c 100644 --- a/data/legacy/1/obsolete.json +++ b/data/legacy/1/obsolete.json @@ -88,7 +88,7 @@ "container" : "jug_plastic", "flags" : "TRADER_AVOID", "symbol" : "~", - "nutrition" : 2, + "calories" : 17, "quench" : 6, "fun" : -15, "price" : 0, diff --git a/data/mods/BrightNights/recipe.json b/data/mods/BrightNights/recipe.json index ef71d8ac70bba..de7ff20833ec2 100644 --- a/data/mods/BrightNights/recipe.json +++ b/data/mods/BrightNights/recipe.json @@ -33,12 +33,7 @@ "autolearn": [ [ "electronics", 2 ] ], "qualities": [ { "id": "SCREW", "level": 1 } ], "tools": [ [ [ "soldering_iron", 35 ], [ "toolset", 35 ] ] ], - "components": [ - [ [ "power_supply", 2 ] ], - [ [ "processor", 2 ] ], - [ [ "scrap", 5 ] ], - [ [ "cable", 8 ] ] - ] + "components": [ [ [ "power_supply", 2 ] ], [ [ "processor", 2 ] ], [ [ "scrap", 5 ] ], [ [ "cable", 8 ] ] ] }, { "result": "bandages", @@ -52,7 +47,13 @@ "components": [ [ [ "rag", 3 ], [ "medical_gauze", 1 ] ], [ [ "duct_tape", 20 ], [ "medical_tape", 5 ] ], - [ [ "disinfectant", 1 ], [ "thyme_oil", 1 ], [ "chem_ethanol", 250 ], [ "denat_alcohol", 250 ], [ "hard_liquor", 28, "LIST" ] ] + [ + [ "disinfectant", 1 ], + [ "thyme_oil", 1 ], + [ "chem_ethanol", 250 ], + [ "denat_alcohol", 250 ], + [ "hard_liquor", 28, "LIST" ] + ] ], "flags": [ "BLIND_HARD" ] }, @@ -67,7 +68,14 @@ "components": [ [ [ "rag", 1 ] ], [ [ "stick", 1 ], [ "2x4", 1 ], [ "pool_cue", 1 ], [ "torch_done", 1 ] ], - [ [ "lamp_oil", 50 ], [ "chem_ethanol", 100 ], [ "denat_alcohol", 100 ], [ "hard_liquor", 14, "LIST" ], [ "gasoline", 250 ], [ "diesel", 250 ] ] + [ + [ "lamp_oil", 50 ], + [ "chem_ethanol", 100 ], + [ "denat_alcohol", 100 ], + [ "hard_liquor", 14, "LIST" ], + [ "gasoline", 250 ], + [ "diesel", 250 ] + ] ], "flags": [ "BLIND_EASY" ] }, @@ -83,7 +91,14 @@ "components": [ [ [ "rag", 1 ] ], [ [ "bottle_glass", 1 ], [ "flask_glass", 1 ], [ "clay_canister", 1 ] ], - [ [ "gasoline", 500 ], [ "diesel", 500 ], [ "chem_ethanol", 500 ], [ "hard_liquor", 52, "LIST" ], [ "denat_alcohol", 500 ], [ "lamp_oil", 500 ] ] + [ + [ "gasoline", 500 ], + [ "diesel", 500 ], + [ "chem_ethanol", 500 ], + [ "hard_liquor", 52, "LIST" ], + [ "denat_alcohol", 500 ], + [ "lamp_oil", 500 ] + ] ], "flags": [ "BLIND_EASY" ] }, @@ -97,10 +112,7 @@ "time": 5000, "autolearn": [ [ "electronics", 7 ] ], "book_learn": [ [ "textbook_atomic", 5 ] ], - "qualities": [ - { "id": "SCREW", "level": 1 }, - { "id": "SAW_M", "level": 1 } - ], + "qualities": [ { "id": "SCREW", "level": 1 }, { "id": "SAW_M", "level": 1 } ], "tools": [ [ [ "soldering_iron", 50 ] ] ], "components": [ [ [ "nuclear_fuel", 2 ] ], diff --git a/data/mods/BrightNights/regional_map_settings.json b/data/mods/BrightNights/regional_map_settings.json index 9dd47d6d5668f..7eb017a47a8a2 100644 --- a/data/mods/BrightNights/regional_map_settings.json +++ b/data/mods/BrightNights/regional_map_settings.json @@ -31,7 +31,278 @@ }, "boosted_other_percent": 50.0, "//": "...accounts for this % of total coverage" }, + "forest_mapgen_settings": { "//": "each section beneath this corresponds to an overmap terrain type", + "forest": { "//": "'forest' overmap terrain is generally at the edge of forests", + "sparseness_adjacency_factor": 3, "//": "the difference between this for the terrain being generated compared to its adjacent terrains controls how sparse the terrain will be", + "item_group": "forest", "//": "name of the item group used to place items randomly within the overmap terrain", + "item_group_chance": 60, "//": "% chance, between 1 and 100, that an item will be placed", + "item_spawn_iterations": 1, "//": "number of times that the item spawning will be called", + "clear_groundcover": false, "//": "if set to true, clear all previously defined 'groundcover' for this terrain. only relevant for 'region_overlay' that override these settings", + "groundcover": { "//": "weighted list of terrain types placed as groundcover before anything else. higher values are more frequent", + "t_grass": 3, + "t_dirt": 1 + }, + "clear_components": false, "//": "if set to true, clear all previously defined 'components' for this terrain. only relevant for 'region_overlay' that override these settings", + "components": { "//": "members are named components that make up the mapgen. the names are not special, and are the handles for 'region_overlay' to override", + "trees": { "//": "'trees' component", + "sequence": 0, "//": "sequence in which the components are processed. a region_overlay can reorder the components.", + "chance": 12, "//": "one_in(x) chance that something from this component will be placed", + "clear_types": false, "//": "if set to true, clear all previously defined types for this component. only relevant for 'region_overlay' that override these settings", + "types": { "//": "weighted list of terrain and furniture types that make up this component. higher values are more frequent, but are all just relative to others for this component.", + "t_tree_young": 128, + "t_tree": 32, + "t_tree_birch": 32, + "t_tree_pine": 32, + "t_tree_maple": 32, + "t_tree_willow": 32, + "t_tree_hickory": 32, + "t_tree_blackjack": 8, + "t_tree_coffee": 8, + "t_tree_apple": 2, + "t_tree_apricot": 2, + "t_tree_cherry": 2, + "t_tree_peach": 2, + "t_tree_pear": 2, + "t_tree_plum": 2, + "t_tree_deadpine": 1, + "t_tree_hickory_dead": 1, + "t_tree_dead": 1 + } + }, + "shrubs_and_flowers": { + "sequence": 1, + "chance": 10, + "clear_types": false, + "types": { + "t_underbrush": 8, + "t_shrub_blueberry": 1, + "t_shrub_strawberry": 1, + "t_shrub": 1, + "f_chamomile": 1, + "f_dandelion": 1, + "f_datura": 1, + "f_dahlia": 1, + "f_bluebell": 1, + "f_mutpoppy": 1 + } + }, + "clutter": { + "sequence": 2, + "chance": 80, + "clear_types": false, + "types": { + "t_trunk": 128, + "t_dirtmound": 128, + "f_boulder_small": 128, + "f_rubble_rock": 32, + "f_boulder_medium": 8, + "f_boulder_large": 1, + "t_pit": 1, + "t_pit_shallow": 1 + } + }, + "water": { + "sequence": 3, + "chance": 512, + "clear_types": false, + "types": { + "t_water_sh": 1 + } + } + } + }, + "forest_thick": { + "sparseness_adjacency_factor": 4, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + "t_grass": 2, + "t_dirt": 1 + }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 5, + "clear_types": false, + "types": { + "t_tree": 128, + "t_tree_young": 128, + "t_tree_birch": 32, + "t_tree_pine": 32, + "t_tree_maple": 32, + "t_tree_willow": 32, + "t_tree_hickory": 32, + "t_tree_blackjack": 4, + "t_tree_coffee": 4, + "t_tree_apple": 1, + "t_tree_apricot": 1, + "t_tree_cherry": 1, + "t_tree_peach": 1, + "t_tree_pear": 1, + "t_tree_plum": 1, + "t_tree_deadpine": 8, + "t_tree_hickory_dead": 8, + "t_tree_dead": 8 + } + }, + "shrubs_and_flowers": { + "sequence": 1, + "chance": 5, + "clear_types": false, + "types": { + "t_underbrush": 16, + "t_shrub_blueberry": 2, + "t_shrub_strawberry": 2, + "t_shrub": 1, + "f_chamomile": 1, + "f_dandelion": 1, + "f_datura": 1, + "f_dahlia": 1, + "f_bluebell": 1, + "f_mutpoppy": 1 + } + }, + "clutter": { + "sequence": 2, + "chance": 64, + "clear_types": false, + "types": { + "t_trunk": 64, + "t_dirtmound": 64, + "f_boulder_small": 32, + "f_rubble_rock": 32, + "f_boulder_medium": 16, + "f_boulder_large": 4, + "t_pit": 1, + "t_pit_shallow": 1 + } + }, + "water": { + "sequence": 3, + "chance": 512, + "clear_types": false, + "types": { + "t_water_sh": 1 + } + } + } + }, + "forest_water": { + "sparseness_adjacency_factor": 2, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + "t_grass": 2, + "t_grass_long": 2, + "t_dirt": 1 + }, + "clear_components": false, + "components": { + "trees": { + "sequence": 0, + "chance": 40, + "clear_types": false, + "types": { + "t_tree": 1, + "t_tree_birch": 1, + "t_tree_maple": 4, + "t_tree_willow": 2, + "t_tree_hickory": 1, + "t_tree_deadpine": 1, + "t_tree_hickory_dead": 1, + "t_tree_dead": 1 + } + }, + "shrubs_and_flowers": { + "sequence": 1, + "chance": 10, + "clear_types": false, + "types": { + "t_underbrush": 1, + "t_shrub": 1 + } + }, + "water": { + "sequence": 2, + "chance": 2, + "clear_types": false, + "types": { + "t_swater_sh": 16, + "t_swater_dp": 1, + "t_water_sh": 8 + } + } + } + } + }, "map_extras": { "//": "mapping for weighted lists of extras", + "forest": { + "chance": 20, "//": "one in # chance of spawning an extra", + "extras": { "//": "weighted list", + "mx_helicopter": 5, + "mx_military": 8, + "mx_science": 20, + "mx_collegekids": 15, + "mx_drugdeal": 30, + "mx_supplydrop": 2, + "mx_portal": 3, + "mx_crater": 10, + "mx_fumarole": 8, + "mx_portal_in": 1, + "mx_anomaly": 3, + "mx_spider": 200, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125 + } + }, + "forest_thick": { + "chance": 20, "//": "one in # chance of spawning an extra", + "extras": { "//": "weighted list", + "mx_helicopter": 5, + "mx_military": 8, + "mx_science": 20, + "mx_collegekids": 15, + "mx_drugdeal": 30, + "mx_supplydrop": 2, + "mx_portal": 3, + "mx_crater": 10, + "mx_fumarole": 8, + "mx_portal_in": 1, + "mx_anomaly": 3, + "mx_shia": 1, + "mx_spider": 200, + "mx_jabberwock": 1, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125 + } + }, + "forest_water": { + "chance": 20, "//": "one in # chance of spawning an extra", + "extras": { "//": "weighted list", + "mx_helicopter": 5, + "mx_military": 8, + "mx_science": 20, + "mx_collegekids": 15, + "mx_drugdeal": 30, + "mx_supplydrop": 2, + "mx_portal": 3, + "mx_crater": 10, + "mx_fumarole": 8, + "mx_portal_in": 1, + "mx_anomaly": 3, + "mx_spider": 200, + "mx_grove": 500, + "mx_shrubbery": 500, + "mx_clearcut": 125 + } + }, "field": { "chance": 90, "//": "one in # chance of spawning an extra", "extras": { "//": "weighted list", diff --git a/data/mods/CrazyCataclysm/crazy_comestibles.json b/data/mods/CrazyCataclysm/crazy_comestibles.json index 022bcde139d60..6bdc5cdb2b921 100644 --- a/data/mods/CrazyCataclysm/crazy_comestibles.json +++ b/data/mods/CrazyCataclysm/crazy_comestibles.json @@ -8,7 +8,7 @@ "spoils_in": 0, "symbol": "%", "quench": 25, - "nutrition": 25, + "calories": 217, "description": "The hit cookie from Mycus Industries! Now comes in addicting flavors such as Marloss, Chanterelle, and The Encroaching, Unavoidable Death of Human Civilization.", "price": 0, "material": [ "wheat", "fruit" ], diff --git a/data/mods/Fuji_Structures/items/itemgroups.json b/data/mods/Fuji_Structures/items/itemgroups.json new file mode 100644 index 0000000000000..a4f7f7b68ab2f --- /dev/null +++ b/data/mods/Fuji_Structures/items/itemgroups.json @@ -0,0 +1,25 @@ +[ + { + "type": "item_group", + "id": "gunshop_accessories", + "items": [ [ "powered_earmuffs", 50 ], [ "ear_plugs", 80 ] ] + }, + { + "type": "item_group", + "id": "games", + "items": [ + [ "chess", 50 ], + [ "checkers", 50 ], + [ "cards", 50 ], + [ "cards_magic", 50 ], + [ "pictionary", 50 ], + [ "monopoly", 50 ], + [ "dnd", 50 ], + [ "g_warhammer", 50 ], + [ "g_warhammer40k", 50 ], + [ "catan", 50 ], + [ "battleship", 50 ], + [ "clue", 50 ] + ] + } +] diff --git a/data/mods/Fuji_Structures/items/items_games.json b/data/mods/Fuji_Structures/items/items_games.json new file mode 100644 index 0000000000000..63518ef9d20b6 --- /dev/null +++ b/data/mods/Fuji_Structures/items/items_games.json @@ -0,0 +1,194 @@ +[ + { + "id": "chess", + "type": "BOOK", + "name": "chess set", + "description": "A wooden box containing all the equipment needed to play a game of chess.", + "weight": 907, + "volume": 8, + "price": 7500, + "material": [ "wood" ], + "symbol": "?", + "color": "brown", + "intelligence": 10, + "time": 30, + "chapters": 12, + "fun": 10 + }, + { + "id": "checkers", + "type": "BOOK", + "name": "checkers set", + "description": "A wooden box containing a set of round tokens used to play checkers.", + "weight": 788, + "volume": 6, + "price": 2000, + "material": [ "wood" ], + "symbol": "?", + "color": "brown", + "intelligence": 5, + "time": 20, + "chapters": 5, + "fun": 3 + }, + { + "id": "cards", + "type": "BOOK", + "name": "deck of cards", + "description": "A collection of 52 cards made to play poker.", + "weight": 96, + "volume": 0.5, + "price": 599, + "material": [ "paper" ], + "symbol": "?", + "color": "white", + "intelligence": 8, + "time": 10, + "chapters": 8, + "fun": 5 + }, + { + "id": "cards_magic", + "type": "BOOK", + "name": "deck of Sorcery cards", + "description": "A set of cards meant to play the game \"Sorcery.\" Each card has a fun picture of a different monster.", + "weight": 210, + "volume": 1, + "price": 2300, + "material": [ "paper" ], + "symbol": "?", + "color": "blue", + "intelligence": 9, + "time": 20, + "chapters": 16, + "fun": 10 + }, + { + "id": "pictionary", + "type": "BOOK", + "name": "Picturesque", + "description": "A game where one draws an image, and the others attempt to guess what it is.", + "weight": 350, + "volume": 2, + "price": 1500, + "material": [ "plastic" ], + "symbol": "?", + "color": "yellow", + "intelligence": 7, + "time": 10, + "chapters": 5, + "fun": 1 + }, + { + "id": "monopoly", + "type": "BOOK", + "name": "Capitalism", + "description": "A game where players traverse around the board buying property and swindling their friends.", + "weight": 300, + "volume": 2, + "price": 99, + "material": [ "plastic" ], + "symbol": "?", + "color": "red", + "intelligence": 5, + "time": 240, + "chapters": 1, + "fun": -5 + }, + { + "id": "dnd", + "type": "BOOK", + "name": "Blobs and Bandits", + "description": "A roleplaying game set in the post-apocalypse, so you can pretend to survive the apocalypse while surviving the apocalypse.", + "weight": 680, + "volume": 5, + "price": 12950, + "material": [ "plastic" ], + "symbol": "?", + "color": "red", + "intelligence": 5, + "time": 120, + "chapters": 100, + "fun": 5 + }, + { + "id": "g_warhammer", + "type": "BOOK", + "name": "Battlehammer", + "description": "A strategy game featuring a set of tiny figurines of fantasy creatures.", + "weight": 680, + "volume": 5, + "price": 10880, + "material": [ "plastic" ], + "symbol": "?", + "color": "yellow", + "intelligence": 9, + "time": 60, + "chapters": 20, + "fun": 4 + }, + { + "id": "g_warhammer40k", + "type": "BOOK", + "name": "Battlehammer 20k", + "description": "A strategy game featuring a set of tiny figurines of space aliens and grotesque space marines.", + "weight": 680, + "volume": 5, + "price": 10880, + "material": [ "plastic" ], + "symbol": "?", + "color": "yellow", + "intelligence": 9, + "time": 60, + "chapters": 20, + "fun": 4 + }, + { + "id": "catan", + "type": "BOOK", + "name": "Settlers of the Ranch", + "description": "A strategy game where players build settlements and trade for supplies.", + "weight": 804, + "volume": 5, + "price": 7050, + "material": [ "wood" ], + "symbol": "?", + "color": "light_blue", + "intelligence": 8, + "time": 60, + "chapters": 10, + "fun": 3 + }, + { + "id": "battleship", + "type": "BOOK", + "name": "Warships", + "description": "A game where players try to guess where the opponent placed their ships on the board.", + "weight": 450, + "volume": 2, + "price": 2000, + "material": [ "plastic" ], + "symbol": "?", + "color": "blue", + "intelligence": 4, + "time": 10, + "chapters": 5, + "fun": 2 + }, + { + "id": "clue", + "type": "BOOK", + "name": "Murder Mystery", + "description": "A game where players try to figure out who murdered the butler.", + "weight": 370, + "volume": 2, + "price": 2480, + "material": [ "paper" ], + "symbol": "?", + "color": "blue", + "intelligence": 6, + "time": 20, + "chapters": 5, + "fun": 3 + } +] diff --git a/data/mods/Fuji_Structures/items/vehicle_groups.json b/data/mods/Fuji_Structures/items/vehicle_groups.json new file mode 100644 index 0000000000000..2962e36e0b99b --- /dev/null +++ b/data/mods/Fuji_Structures/items/vehicle_groups.json @@ -0,0 +1,25 @@ +[ + { + "type": "vehicle_group", + "id": "dealership", + "vehicles": [ + [ "car", 500 ], + [ "electric_car", 100 ], + [ "car_sports", 300 ], + [ "car_sports_atomic", 100 ], + [ "car_sports_electric", 300 ], + [ "suv", 500 ], + [ "suv_electric", 500 ], + [ "car_mini", 500 ], + [ "beetle", 500 ], + [ "motorcycle", 200 ], + [ "superbike", 200 ], + [ "motorcycle_sidecart", 100 ], + [ "scooter", 100 ], + [ "scooter_electric", 150 ], + [ "pickup", 800 ], + [ "hippie_van", 200 ], + [ "rv", 50 ] + ] + } +] diff --git a/data/mods/Fuji_Structures/modinfo.json b/data/mods/Fuji_Structures/modinfo.json new file mode 100644 index 0000000000000..96fa80c0441bd --- /dev/null +++ b/data/mods/Fuji_Structures/modinfo.json @@ -0,0 +1,13 @@ +{ + "type": "MOD_INFO", + "mod-type": "SUPPLEMENTAL", + "ident": "FujiStruct", + "name": "Fuji's More Buildings", + "description": "Adds more buildings and more variations to existing buildings. (Requires More Locations)", + "category": "buildings", + "author": "Fuji", + "dependencies": [ + "dda", + "more_locations" + ] +} diff --git a/data/mods/Fuji_Structures/monsters/monstergroups.json b/data/mods/Fuji_Structures/monsters/monstergroups.json new file mode 100644 index 0000000000000..476862dd437a9 --- /dev/null +++ b/data/mods/Fuji_Structures/monsters/monstergroups.json @@ -0,0 +1,22 @@ +[ + { + "type": "monstergroup", + "name": "GROUP_BUNKER", + "default": "mon_irradiated_wanderer_1", + "monsters": [ + { "monster": "mon_irradiated_wanderer_1", "freq": 240, "cost_multiplier": 0 }, + { "monster": "mon_irradiated_wanderer_2", "freq": 100, "cost_multiplier": 0, "pack_size": [ 1, 5 ] }, + { "monster": "mon_irradiated_wanderer_3", "freq": 10, "cost_multiplier": 5, "pack_size": [ 1, 3 ] }, + { "monster": "mon_irradiated_wanderer_4", "freq": 40, "cost_multiplier": 2, "pack_size": [ 1, 2 ] }, + { "monster": "mon_zombie_armored", "freq": 25, "cost_multiplier": 20, "pack_size": [ 2, 6 ] }, + { "monster": "mon_zombie_bio_op", "freq": 50, "cost_multiplier": 10 }, + { "monster": "mon_zombie_soldier", "freq": 200, "cost_multiplier": 3 } + ] + }, + { + "type": "monstergroup", + "name": "GROUP_SCI", + "default": "mon_zombie_scientist", + "monsters": [ { "monster": "mon_zombie_scientist", "freq": 240, "cost_multiplier": 0 } ] + } +] diff --git a/data/mods/Fuji_Structures/npc/NC_BUNKER_MERCHANT.json b/data/mods/Fuji_Structures/npc/NC_BUNKER_MERCHANT.json new file mode 100644 index 0000000000000..de87dc5229cec --- /dev/null +++ b/data/mods/Fuji_Structures/npc/NC_BUNKER_MERCHANT.json @@ -0,0 +1,72 @@ +[ + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_pants_male", + "items": [ [ "pants_cargo", 60 ], [ "pants", 20 ], [ "shorts_cargo", 20 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_pants_female", + "items": [ [ "pants_cargo", 60 ], [ "pants", 20 ], [ "shorts_cargo", 20 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_shoes", + "items": [ [ "boots_combat", 90 ], [ "boots", 10 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_shirt_male", + "items": [ [ "undershirt", 30 ], [ "sweatshirt", 20 ], [ "under_armor", 20 ], [ "longshirt", 20 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_shirt_female", + "items": [ [ "undershirt", 30 ], [ "sweatshirt", 20 ], [ "under_armor", 20 ], [ "longshirt", 20 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_gloves", + "items": [ [ "null", 20 ], [ "gloves_tactical", 60 ], [ "gloves_fingerless", 20 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_coat", + "items": [ [ "hoodie", 50 ], [ "kevlar", 50 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_extra", + "items": [ [ "rucksack", 100 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_hat", + "items": [ [ "hat_ball", 100 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_eyes", + "items": [ [ "null", 80 ], [ "glasses_bal", 20 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_masks", + "items": [ [ "scarf", 100 ] ] + }, + { + "type": "item_group", + "id": "NC_BUNKER_MERCHANT_misc", + "items": [ + { "group": "ammo_reloaded", "prob": 100, "count-min": 5, "count-max": 10 }, + { "group": "everyday_gear", "prob": 100, "count-min": 5, "count-max": 25 }, + { "group": "guns_survival", "prob": 100, "count-min": 5, "count-max": 5 }, + { "group": "tools_survival", "prob": 100, "count-min": 5, "count-max": 5 }, + { "group": "supplies_electronics", "prob": 100, "count-min": 5, "count-max": 5 }, + { "group": "clothing_outdoor_torso", "prob": 100, "count-min": 5, "count-max": 5 }, + { "group": "clothing_outdoor_pants", "prob": 100, "count-min": 5, "count-max": 5 }, + { "group": "clothing_outdoor_shoes", "prob": 100, "count-min": 5, "count-max": 5 }, + { "group": "drugs_soldier", "prob": 100, "count-min": 5, "count-max": 5 } + ] + } +] diff --git a/data/mods/Fuji_Structures/npc/TALK_BUNKER_MERCHANT.json b/data/mods/Fuji_Structures/npc/TALK_BUNKER_MERCHANT.json new file mode 100644 index 0000000000000..66662c3735f29 --- /dev/null +++ b/data/mods/Fuji_Structures/npc/TALK_BUNKER_MERCHANT.json @@ -0,0 +1,46 @@ +[ + { + "type": "talk_topic", + "id": "TALK_BUNKER_MERCHANT", + "dynamic_line": "Heya, scav.", + "responses": [ + { "text": "Did you build this place?", "topic": "TALK_BUNKER_MERCHANT_HERE" }, + { "text": "Who are you?", "topic": "TALK_BUNKER_MERCHANT_WHO" }, + { "text": "Why do you still use cash?", "topic": "TALK_BUNKER_MERCHANT_WHY" }, + { "text": "You're a trader?", "topic": "TALK_BUNKER_MERCHANT_TRADE" }, + { "text": "I need some supplies.", "effect": "start_trade", "topic": "TALK_BUNKER_MERCHANT" }, + { "text": "Need help with anything?", "topic": "TALK_BUNKER_MERCHANT_MISSION" }, + { "text": "Well, bye.", "topic": "TALK_DONE" } + ] + }, + { + "type": "talk_topic", + "id": "TALK_BUNKER_MERCHANT_HERE", + "dynamic_line": "No, no... Well, maybe a little. It was just as wrecked down here as it is up top when I found it, wasn't too hard to fix up. You're welcome to stay in the spare room awhile, just don't hog it. You're not the only scav out there.", + "responses": [ { "text": "Interesting...", "topic": "TALK_BUNKER_MERCHANT" } ] + }, + { + "type": "talk_topic", + "id": "TALK_BUNKER_MERCHANT_WHO", + "dynamic_line": "Just a scav who got lucky. Now I'm content to sit around here on my pile of treasure. I'm more than willing to trade if you've got the cash.", + "responses": [ { "text": "I see...", "topic": "TALK_BUNKER_MERCHANT" } ] + }, + { + "type": "talk_topic", + "id": "TALK_BUNKER_MERCHANT_WHY", + "dynamic_line": "Why not? Everyone else does, so I suppose that's all that matters. My ATM over there still works, connected to the bank servers and everything.", + "responses": [ { "text": "Hmm...", "topic": "TALK_BUNKER_MERCHANT" } ] + }, + { + "type": "talk_topic", + "id": "TALK_BUNKER_MERCHANT_TRADE", + "dynamic_line": "I suppose I am. Scavs like you need supplies, right? And I could always use more money.", + "responses": [ { "text": "Alright...", "topic": "TALK_BUNKER_MERCHANT" } ] + }, + { + "type": "talk_topic", + "id": "TALK_BUNKER_MERCHANT_MISSION", + "dynamic_line": "Not at the moment, check back later perhaps.", + "responses": [ { "text": "Sure...", "topic": "TALK_BUNKER_MERCHANT" } ] + } +] diff --git a/data/mods/Fuji_Structures/npc/classes.json b/data/mods/Fuji_Structures/npc/classes.json new file mode 100644 index 0000000000000..3af454302dfd7 --- /dev/null +++ b/data/mods/Fuji_Structures/npc/classes.json @@ -0,0 +1,21 @@ +[ + { + "type": "npc_class", + "id": "NC_BUNKER_MERCHANT", + "name": "Merchant", + "common": false, + "job_description": "", + "bonus_str": { "rng": [ -1, 2 ] }, + "bonus_dex": { "rng": [ -1, 1 ] }, + "bonus_int": { "rng": [ -1, 4 ] }, + "bonus_per": { "rng": [ -1, 2 ] }, + "skills": [ + { "skill": "ALL", "level": { "mul": [ { "one_in": 3 }, { "sum": [ { "dice": [ 2, 2 ] }, { "constant": 0 } ] } ] } }, + { "skill": "gun", "bonus": { "rng": [ 1, 5 ] } }, + { "skill": "rifle", "bonus": { "rng": [ 1, 5 ] } }, + { "skill": "pistol", "bonus": { "rng": [ 1, 4 ] } }, + { "skill": "smg", "bonus": { "rng": [ 1, 3 ] } }, + { "skill": "barter", "bonus": { "rng": [ 1, 6 ] } } + ] + } +] diff --git a/data/mods/Fuji_Structures/npc/npc.json b/data/mods/Fuji_Structures/npc/npc.json new file mode 100644 index 0000000000000..c0e40e0b52bf5 --- /dev/null +++ b/data/mods/Fuji_Structures/npc/npc.json @@ -0,0 +1,12 @@ +[ + { + "type": "npc", + "id": "bunker_merchant", + "name_suffix": "Merchant", + "class": "NC_BUNKER_MERCHANT", + "attitude": 0, + "mission": 3, + "chat": "TALK_BUNKER_MERCHANT", + "faction": "wasteland_scavengers" + } +] diff --git a/data/mods/Fuji_Structures/starts/professions.json b/data/mods/Fuji_Structures/starts/professions.json new file mode 100644 index 0000000000000..5dcab5469feba --- /dev/null +++ b/data/mods/Fuji_Structures/starts/professions.json @@ -0,0 +1,61 @@ +[ + { + "type": "profession", + "ident": "rookie", + "name": "Rookie", + "description": "It's been months since the Cataclysm and somehow you're still greener than a tree. Maybe you're just a slow learner, who knows.", + "points": 0, + "skills": [ { "level": 1, "name": "survival" }, { "level": 1, "name": "gun" } ], + "items": { + "both": { + "items": [ "undershirt", "jacket_leather", "pants", "boots", "sockmitts", "socks_wool", "backpack", "shot_slug" ], + "entries": [ + { "item": "shotgun_d", "ammo-item": "shot_00", "charges": 2 }, + { "item": "shot_00", "charges": 12, "container-item": "bandolier_shotgun" }, + { "item": "knife_combat", "container-item": "sheath" } + ] + }, + "male": [ "boxer_shorts" ], + "female": [ "boxer_shorts" ] + }, + "flags": [ "SCEN_ONLY" ] + }, + { + "type": "profession", + "ident": "novice", + "name": "Novice", + "description": "You're a merely competent survivor so far. Let's change that, yeah?", + "points": 1, + "skills": [ + { "level": 2, "name": "survival" }, + { "level": 1, "name": "gun" }, + { "level": 1, "name": "mechanics" }, + { "level": 1, "name": "electronics" }, + { "level": 1, "name": "tailor" } + ], + "items": { + "both": { + "items": [ + "hood_rain", + "undershirt", + "kevlar", + "jacket_army", + "pants_cargo", + "boots_bunker", + "gloves_fingerless", + "socks_wool", + "backpack", + "e_tool" + ], + "entries": [ + { "item": "hk_mp5", "ammo-item": "9mmfmj", "charges": 30, "contents-item": "folding_stock" }, + { "item": "mp5mag", "ammo-item": "9mmfmj", "charges": 30, "container-item": "chestrig" }, + { "item": "knife_combat", "container-item": "sheath" } + ] + }, + "male": [ "boxer_shorts" ], + "female": [ "boxer_shorts" ] + }, + "flags": [ "SCEN_ONLY" ] + } +] diff --git a/data/mods/Fuji_Structures/starts/scenarios.json b/data/mods/Fuji_Structures/starts/scenarios.json new file mode 100644 index 0000000000000..1cbbc1f80ab4b --- /dev/null +++ b/data/mods/Fuji_Structures/starts/scenarios.json @@ -0,0 +1,13 @@ +[ + { + "type": "scenario", + "name": "Scavenger", + "description": "You're a seasoned scavenger, or at least it's been a season since you've become a scavenger. Either way, you found a bunker with a fellow scav in it. Turns out they were a lot better at it than you were.", + "ident": "scav", + "points": 1, + "start_name": "Scavenger Bunker", + "allowed_locs": [ "s_bunker_shop_g" ], + "flags": [ "SUM_ADV_START" ], + "professions": [ "rookie", "novice" ] + } +] diff --git a/data/mods/Fuji_Structures/starts/start_locations.json b/data/mods/Fuji_Structures/starts/start_locations.json new file mode 100644 index 0000000000000..4a7089046edb5 --- /dev/null +++ b/data/mods/Fuji_Structures/starts/start_locations.json @@ -0,0 +1,8 @@ +[ + { + "type": "start_location", + "ident": "s_bunker_shop_g", + "name": "Scavenger Bunker", + "target": "s_bunker_shop_g" + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_atc.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_atc.json new file mode 100644 index 0000000000000..8166885727fdf --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_atc.json @@ -0,0 +1,63 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_atc" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "eeeeeeeeezzzzzzzzzlllzzz", + "aaaaaaaaebbbbbbzzjjjjjzz", + "aaaaaaaaebffffbejjkkkjjz", + "eaaaaaaaecffgfbejkkkkkjz", + "eaaaaaaaebhffibejkkkkkjz", + "eaaaaaaaebhffibejkkkkkjz", + "eqqaaaaaebbbcbbejjkkkjjz", + "eqqaaaaaezbfffbenjjjjjzz", + "eqqaaaaaezbiiibenzzzzzzz", + "eeeaaaaaezbbbbbenzzjjjzz", + "zzeaaaaaeeeeeezenzjjkjjz", + "zzeaaaaaeeeddeeennjkkkjz", + "zzeaaaaaeeeddeeenzjjkjjz", + "zzeaaaaaeeeeeezenzzjjjzz", + "zzeaaaaaezzzzzzenzzzzzzz", + "zzeaaaaaezozppzenzzjjjzz", + "eeeaaaaaezozppzenzjjkjjz", + "aaaaaaaaezozzzzennjkkkjz", + "aaaaaaaaezozppzezzjjkjjz", + "aaaaaaaaezozppzezzzjjjzz", + "aaaaaaaaezozzzzzzzzzzzzz", + "aaaaaaaae oooooooooooooo", + "eeeaaaaaezzzzzzzzzzzzzzz", + "zzeaaaaaezzzzzzzzzzzzzzz" + ], + "terrain": { + "z": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "a": "t_pavement", + "b": "t_wall", + "c": "t_door_c", + "d": "t_radio_tower", + "e": "t_sidewalk", + "f": "t_floor", + "g": "t_stairs_up", + "h": "t_floor", + "i": "t_console_broken", + "j": "t_wall_metal", + "k": "t_metal_floor", + "l": "t_gas_pump", + "m": "t_water_pump", + "n": "t_sewage_pipe", + "o": "t_chainfence_v", + "p": "t_generator_broken", + "q": "t_pavement" + }, + "furniture": { "h": "f_table", "q": "f_dumpster" }, + "gaspumps": { "l": { } }, + "place_loot": [ + { "group": "office_mess", "chance": 80, "repeat": [ 3 ], "x": [ 10, 13 ], "y": [ 2, 5 ] }, + { "group": "office_mess", "chance": 80, "repeat": [ 1 ], "x": [ 11, 13 ], "y": [ 7, 7 ] }, + { "group": "trash", "chance": 50, "repeat": [ 5 ], "x": [ 1, 2 ], "y": [ 6, 8 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_atc_2.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_atc_2.json new file mode 100644 index 0000000000000..a5a309c2497fa --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_atc_2.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_atc_2" ], + "object": { + "fill_ter": "t_open_air", + "rows": [ + " ", + " ", + " aaaa ", + " adca ", + " abba ", + " aaaa ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { "a": "t_wall", "b": "t_floor", "c": "t_stairs_down", "d": "t_stairs_up" }, + "furniture": { } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_atc_3.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_atc_3.json new file mode 100644 index 0000000000000..4efe9970c6b6a --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_atc_3.json @@ -0,0 +1,48 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_atc_3" ], + "object": { + "fill_ter": "t_open_air", + "rows": [ + " hhhhhhhh ", + " habbgbah ", + " hbcdccbh ", + " hbfcccbh ", + " hbfccebh ", + " hbcceebh ", + " habbbbah ", + " hhhhhhhh ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ], + "terrain": { + "a": "t_wall", + "b": "t_wall_glass", + "c": "t_floor", + "d": "t_stairs_down", + "e": "t_floor", + "f": "t_console_broken", + "g": "t_door_glass_c", + "h": "t_metal_floor" + }, + "furniture": { "e": "f_table" }, + "place_loot": [ { "group": "office_mess", "chance": 80, "repeat": [ 5 ], "x": [ 10, 13 ], "y": [ 2, 5 ] } ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_hangars.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_hangars.json new file mode 100644 index 0000000000000..4c16defc94cad --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_hangars.json @@ -0,0 +1,56 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_hangars" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "zzeeeeeeeeeeeeeeeeeeeezz", + "zzeeeeeeeeeeeeeeeeeeeezz", + "zzeeeeeeeeeeeeeeeeeeeezz", + "zzeeeeeeeeeeeeeeeeeeeezz", + "zadeeeeeeeazzadeeeeeeeaz", + "zaaccccccaazzaaccccccaaz", + "zadbbbbbbbazzadbbbbbbbaz", + "zabbbbbbbfazzabbbbbbbbaz", + "zabbbbbbbfazzabbbbbbbbaz", + "zabbbbbbbbazzabbbbbbbbaz", + "zabbbbbbbbazzabbbbbbbbaz", + "zabbbbbbbbazzabbbbbbbbaz", + "zabbbbbbbbazzabbbbbbbbaz", + "zabbbbbbbbazzabbbbbbbbaz", + "zabbbbbbbbazzabbbbbggbaz", + "zabbbbbbbbazzabbbbbggbaz", + "zabbbbbbbbazzabbbbbbbbaz", + "zabbbbbbbgazzabbbbbbbbaz", + "zabbbbbbggazzabbbbbbbbaz", + "zabbbbbbggazzabbbbbbbbaz", + "zagbbbbbggazzabbbbbbbbaz", + "haggbbbgggahhabffbbbggaz", + "zaaaaaaaaaazzaaaaaaaaaaz", + "zzzzzzzzzzzzzzzzzzzzzzzz" + ], + "terrain": { + "z": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "a": "t_wall", + "b": "t_thconc_floor", + "c": "t_door_metal_locked", + "d": "t_gates_mech_control", + "e": "t_pavement", + "f": "t_floor", + "g": "t_floor", + "h": "t_chainfence_v" + }, + "furniture": { "f": "f_locker", "g": "f_crate_o" }, + "place_loot": [ + { "group": "road", "chance": 50, "repeat": [ 10 ], "x": [ 3, 8 ], "y": [ 7, 20 ] }, + { "group": "road", "chance": 50, "repeat": [ 10 ], "x": [ 15, 20 ], "y": [ 20, 7 ] }, + { "group": "clothing_work_mask", "chance": 50, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 7, 7 ] }, + { "group": "clothing_work_mask", "chance": 50, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 21, 21 ] }, + { "group": "tools_mechanic", "chance": 50, "repeat": [ 4 ], "x": [ 16, 16 ], "y": [ 21, 21 ] }, + { "group": "tools_mechanic", "chance": 50, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 8, 8 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_parking.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_parking.json new file mode 100644 index 0000000000000..1c8cbfbefc6f1 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_parking.json @@ -0,0 +1,48 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_parking" ], + "object": { + "fill_ter": "t_pavement", + "rows": [ + "aaaaaaaaaaaaaaaaaaaaaaaa", + "a a", + "a a", + "a a", + "a a", + "abbbbbb bbbbbba", + "a a", + "a a", + "a a", + "a a", + "abbbbbb bbbbbba", + "a a", + "a a", + "a a", + "a a", + "abbbbbb bbbbbba", + "a a", + "a ", + "a ", + "a ", + "aaaaaaaa ", + "ccccccca ", + "ccccccca a", + "cccccccaaaaaaaaaaaaaaaaa" + ], + "terrain": { "a": "t_sidewalk", "b": "t_pavement_y", "c": [ "t_grass", "t_grass", "t_grass", "t_dirt" ] }, + "furniture": { }, + "place_loot": [ { "group": "road", "chance": 50, "repeat": [ 4 ], "x": [ 1, 22 ], "y": [ 1, 19 ] } ], + "place_vehicles": [ + { "vehicle": "dealership", "x": [ 3, 3 ], "y": [ 3, 3 ], "chance": 50, "rotation": 180 }, + { "vehicle": "dealership", "x": [ 3, 3 ], "y": [ 8, 8 ], "chance": 50, "rotation": 180 }, + { "vehicle": "dealership", "x": [ 3, 3 ], "y": [ 13, 13 ], "chance": 50, "rotation": 180 }, + { "vehicle": "dealership", "x": [ 3, 3 ], "y": [ 18, 18 ], "chance": 50, "rotation": 180 }, + { "vehicle": "dealership", "x": [ 20, 20 ], "y": [ 2, 2 ], "chance": 50, "rotation": 0 }, + { "vehicle": "dealership", "x": [ 20, 20 ], "y": [ 7, 7 ], "chance": 50, "rotation": 0 }, + { "vehicle": "dealership", "x": [ 20, 20 ], "y": [ 12, 12 ], "chance": 50, "rotation": 0 } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_runway.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway.json new file mode 100644 index 0000000000000..150b9c5f88004 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_runway" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "zzzzzzzzzzzzzzzzzzzzzzzz", + "cccccccccccccccccccccccc", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "bbbbbbbbbbbbbbbbbbbbbbbb", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aabbbbaaaabbbbaaaabbbbaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "bbbbbbbbbbbbbbbbbbbbbbbb", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz" + ], + "terrain": { "z": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], "a": "t_pavement", "b": "t_pavement_y", "c": "t_chainfence_v" }, + "furniture": { } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_hangars.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_hangars.json new file mode 100644 index 0000000000000..3a691cc6bb35a --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_hangars.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_runway_hangars" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "zzzzzzzzzzzzzzzzzzzzzzzz", + "cccccccccccccccccccccccc", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "bbbbbbbbbbbbbbbbbbbbbbbb", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aabbbbaaaabbbbaaaabbbbaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "bbbbbbbbbbbbbbbbbbbbbbbb", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "zzabaaaaaaaaaaaaaaaabazz", + "zzaaaaaaaaaaaaaaaaaaaazz", + "zzabaaaaaaaaaaaaaaaabazz", + "zzaaaaaaaaaaaaaaaaaaaazz", + "zzabaaaaaaaaaaaaaaaabazz" + ], + "terrain": { "z": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], "a": "t_pavement", "b": "t_pavement_y", "c": "t_chainfence_v" }, + "furniture": { } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_l.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_l.json new file mode 100644 index 0000000000000..e0866261117a2 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_l.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_runway_l" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zccccccccccccccccccccccc", + "zczzzzzzzzzzzzzzzzzzzzzz", + "zczzzzzzzzzzzzzzzzzzzzzz", + "zczzzzzzzzzzzzzzzzzzzzzz", + "zczzzzzzzzzzzzzzzzzzzzzz", + "zczzzzzaaaaaaaaaaaaaaaaa", + "zczzzzzbbbbbbbbbbbbbbbbb", + "zczzzzzaaaaaabaaaaaaaaab", + "zczzzzzaaaaabaaaaaaaaaba", + "zczzzzzaaaabbaaaaaaaabaa", + "zczzzzzaaabaaaaaaaaabaaa", + "zczzzzzaabaaaaaaaaabaaaa", + "zczzzzzaaabaaaaaaaaabaaa", + "zczzzzzaaaabaaaaaaaaabaa", + "zczzzzzaaaaabaaaaaaaaaba", + "zczzzzzaaaaaabaaaaaaaaab", + "zczzzzzbbbbbbbbbbbbbbbbb", + "zczzzzzaaaaaaaaaaaaaaaaa", + "zczzzzzzzzzzzzzzzzzzzzzz", + "zczzzzzzzzzzzzzzzzzzzzzz", + "zczzzzzzzzzzzzzzzzzzzzzz", + "zccccccccccccccccccccccc", + "zzzzzzzzzzzzzzzzzzzzzzzz" + ], + "terrain": { "z": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], "a": "t_pavement", "b": "t_pavement_y", "c": "t_chainfence_v" }, + "furniture": { } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_r.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_r.json new file mode 100644 index 0000000000000..1cb8e67567ecc --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_r.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_runway_r" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "zzzzzzzzzzzzzzzzzzzzzzzz", + "cccccccccccccccccccccccz", + "zzzzzzzzzzzzzzzzzzzzzzcz", + "zzzzzzzzzzzzzzzzzzzzzzcz", + "zzzzzzzzzzzzzzzzzzzzzzcz", + "zzzzzzzzzzzzzzzzzzzzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "bbbbbbbbbbbbbbbbbbzzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "aabbbbaaaabbbbaaaazzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "bbbbbbbbbbbbbbbbbbzzzzcz", + "aaaaaaaaaaaaaaaaaazzzzcz", + "zzzzzzzzzzzzzzzzzzzzzzcz", + "zzzzzzzzzzzzzzzzzzzzzzcz", + "zzzzzzzzzzzzzzzzzzzzzzcz", + "cccccccccccccccccccccccz", + "zzzzzzzzzzzzzzzzzzzzzzzz" + ], + "terrain": { "z": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], "a": "t_pavement", "b": "t_pavement_y", "c": "t_chainfence_v" }, + "furniture": { } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_term.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_term.json new file mode 100644 index 0000000000000..fda15a80ae217 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_runway_term.json @@ -0,0 +1,45 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_runway_term" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "zzzzzzzzzzzzzzzzzzzzzzzz", + "cccccccccccccccccccccccc", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "zzzzzzzzzzzzzzzzzzzzzzzz", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "bbbbbbbbbbbbbbbbbbbbbbbb", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aabbbbaaaabbbbaaaabbbbaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "bbbbbbbbbbbbbbbbbbbbbbbb", + "aaaaaaaaaaaaaaaaaaaaaaaa", + "zadaaaaaaaaaaaaaaaaaaaaz", + "zadaaaaaaaaaaaaaaaaaaaaz", + "zadaaaaaaaaaaaaaaaaaaaaz", + "zadaaaaaaaaaaaaaaaaaaaaz", + "zadaaaaaaaaaaaaaaaaaaaaz" + ], + "terrain": { + "z": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "a": "t_pavement", + "b": "t_pavement_y", + "c": "t_chainfence_v", + "d": "t_conveyor" + }, + "furniture": { }, + "place_vehicles": [ { "vehicle": "golf_cart", "x": [ 4, 21 ], "y": [ 19, 23 ], "chance": 100, "rotation": 270 } ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/airport/s_air_term.json b/data/mods/Fuji_Structures/worldgen/airport/s_air_term.json new file mode 100644 index 0000000000000..b1c97b4085ea1 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/airport/s_air_term.json @@ -0,0 +1,90 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_air_term" ], + "object": { + "fill_ter": "t_linoleum_gray", + "rows": [ + "oqbqqqqqqqqqqqqqqqqqqqqo", + "aaeaccaasssaasssaaqqqqqq", + "afbfffa uaqqqqqq", + "afbfffc l l aaccaao", + "afbfffa b h h a lan", + "afeffma b h h pa dn", + "afeffma b h h pa an", + "afbfmma b h h a an", + "afbbbbebb h h an", + "afffffa dn", + "aaaaaaa ii au uan", + "oatggga i hhhhl aaddaan", + "oaggggc i annnnnn", + "oakkkka i annnnnn", + "oaaddaaj i uannnnnn", + "onnnnnaaaasssrrsaannnnnn", + "oooooooooooooooooooooooo", + "qqqqqqqqqqqqqqqqqqqqqqqq", + "qqqqqqqqqqqqqqqqqqqqqqqq", + "qqqqqqqqqqqqqqqqqqqqqqqq", + "qqqqqqqqqqqqqqqqqqqqqqqq", + "qqqqqqqqqqqqqqqqqqqqqqqq", + "oooooooooooooooooooooooo", + "nnnnnnnnnnnnnnnnnnnnnnnn" + ], + "terrain": { + "a": "t_brick_wall", + "b": "t_conveyor", + "c": "t_door_c", + "d": "t_window", + "e": "t_machinery_light", + "f": "t_thconc_floor", + "g": "t_floor", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_console_broken", + "k": "t_floor", + "l": "t_linoleum_gray", + "m": "t_thconc_floor", + "n": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "o": "t_sidewalk", + "p": "t_linoleum_gray", + "q": "t_pavement", + "r": "t_door_glass_c", + "s": "t_wall_glass", + "t": "t_floor", + "u": "t_linoleum_gray" + }, + "furniture": { + "h": "f_bench", + "i": "f_counter", + "k": "f_table", + "l": "f_trashcan", + "m": "f_crate_c", + "p": "f_vending_c", + "t": "f_locker", + "u": "f_indoor_plant" + }, + "place_loot": [ + { "group": "allclothes", "chance": 80, "repeat": [ 10 ], "x": [ 5, 5 ], "y": [ 5, 6 ] }, + { "group": "allclothes", "chance": 80, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 7, 7 ] }, + { "group": "office", "chance": 80, "repeat": [ 5 ], "x": [ 5, 5 ], "y": [ 7, 7 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 2, 5 ], "y": [ 13, 13 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 11, 11 ] }, + { "group": "bags", "chance": 80, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 2, 4 ] }, + { "group": "bags", "chance": 80, "repeat": [ 1 ], "x": [ 8, 8 ], "y": [ 4, 8 ] }, + { "group": "bags", "chance": 80, "repeat": [ 1 ], "x": [ 2, 5 ], "y": [ 8, 8 ] }, + { "group": "bags", "chance": 80, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 8, 4 ] }, + { "group": "bags", "chance": 80, "repeat": [ 2 ], "x": [ 11, 14 ], "y": [ 11, 11 ] }, + { "group": "bags", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 8, 4 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 5 ], "x": [ 21, 21 ], "y": [ 4, 4 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 5 ], "x": [ 14, 14 ], "y": [ 3, 3 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 5 ], "x": [ 11, 11 ], "y": [ 3, 3 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 5 ], "x": [ 15, 15 ], "y": [ 11, 11 ] }, + { "group": "office", "chance": 50, "repeat": [ 5 ], "x": [ 9, 9 ], "y": [ 10, 14 ] }, + { "group": "vending_food", "chance": 80, "repeat": [ 1 ], "x": [ 16, 16 ], "y": [ 5, 5 ] }, + { "group": "vending_drink", "chance": 80, "repeat": [ 1 ], "x": [ 16, 16 ], "y": [ 6, 6 ] } + ], + "place_vehicles": [ { "vehicle": "dealership", "x": [ 14, 14 ], "y": [ 19, 19 ], "chance": 50, "rotation": 0 } ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/bunker_shop/s_bunker_shop_b.json b/data/mods/Fuji_Structures/worldgen/bunker_shop/s_bunker_shop_b.json new file mode 100644 index 0000000000000..0532376c25453 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/bunker_shop/s_bunker_shop_b.json @@ -0,0 +1,92 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_bunker_shop_b" ], + "object": { + "fill_ter": "t_rock", + "rows": [ + " fff ", + " fvffffff ", + " fbbbbbbf ", + " fbffffbf ", + " fffff fbf faf ", + " fftsrf fbf fff ", + " fvbbbf fbf ", + " ffffffdfffdfffff ", + " fnccmfbfjubbxfvf ", + " fllccbbdbbbbbebf ", + " fvccofjfbbbbbfbf ", + " fffffffffgggffbf ", + " fjhhhbfbf ", + " fffffffffbbpbbdbf ", + " fviiiiivfibbbbfff ", + " fffbbbbbbbfibvbwf ", + " fkdbiiiiibdbbbbhf ", + " fffbbbbbbbfiqqbhf ", + " fviiiiivffffdff ", + " ffffffffffnlcmf ", + " fvbbbdclcmf ", + " fftsrfcccvf ", + " ffffffffff ", + " " + ], + "terrain": { + "a": "t_stairs_up", + "b": "t_concrete_floor", + "c": "t_floor", + "d": "t_door_metal_c", + "e": "t_door_metal_locked", + "f": "t_concrete_wall", + "g": "t_reinforced_glass", + "h": "t_concrete_floor", + "i": "t_concrete_floor", + "j": "t_concrete_floor", + "k": "t_plut_generator", + "l": "t_floor", + "m": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_concrete_floor", + "q": "t_concrete_floor", + "r": "t_concrete_floor", + "s": "t_concrete_floor", + "t": "t_concrete_floor", + "u": "t_concrete_floor", + "v": "t_utility_light", + "w": "t_console_broken", + "x": "t_atm" + }, + "furniture": { + "h": "f_table", + "i": "f_rack", + "j": "f_locker", + "l": "f_bed", + "m": "f_dresser", + "n": "f_table", + "o": "f_sofa", + "p": "f_chair", + "q": "f_sofa", + "r": "f_toilet", + "s": "f_sink", + "t": "f_shower", + "u": "f_crate_o" + }, + "place_loot": [ + { "group": "mil_food_nodrugs", "chance": 90, "repeat": [ 10 ], "x": [ 6, 10 ], "y": [ 18, 18 ] }, + { "group": "ammo_rifle_milspec", "chance": 90, "repeat": [ 10 ], "x": [ 6, 10 ], "y": [ 16, 16 ] }, + { "group": "camping", "chance": 90, "repeat": [ 10 ], "x": [ 6, 10 ], "y": [ 14, 14 ] }, + { "group": "allclothes", "chance": 90, "repeat": [ 4 ], "x": [ 17, 17 ], "y": [ 19, 20 ] }, + { "group": "allclothes", "chance": 90, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 8, 8 ] }, + { "group": "book_military", "chance": 90, "repeat": [ 1 ], "x": [ 6, 6 ], "y": [ 8, 8 ] }, + { "group": "book_military", "chance": 90, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 12, 12 ] }, + { "group": "cleaning_bulk", "chance": 90, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 10, 10 ] }, + { "group": "cleaning_bulk", "chance": 90, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 12, 12 ] }, + { "group": "guns_milspec", "chance": 90, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 14, 15 ] }, + { "group": "mil_food_nodrugs", "chance": 90, "repeat": [ 5 ], "x": [ 13, 13 ], "y": [ 17, 17 ] }, + { "group": "mil_armor", "chance": 90, "repeat": [ 5 ], "x": [ 17, 17 ], "y": [ 15, 17 ] } + ], + "place_npcs": [ { "class": "bunker_merchant", "x": 15, "y": 13 } ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/bunker_shop/s_bunker_shop_g.json b/data/mods/Fuji_Structures/worldgen/bunker_shop/s_bunker_shop_g.json new file mode 100644 index 0000000000000..f8aba7f20305a --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/bunker_shop/s_bunker_shop_g.json @@ -0,0 +1,90 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_bunker_shop_g" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "kkkkkkkkkkkkkkkkkkkkkkkk", + "kkkkkkkkkkkkkkkkkkkkkkkk", + "kkkkkkkkkkkkkkkkkkkkkkkk", + "kkaasaaGnnGnnGnnGnnoookk", + "kkaEDDakkkkkkkkkkkkoqokk", + "GnaEDDakkkkzkkkkkkkopokk", + "nkaaCaakkkkkkkkAkkkktnkk", + "nkkktttttttttttttttttnkk", + "GkkktkkkiicjaraaaajktGkk", + "nkkktkkkjkkkwwyakkjktnkk", + "nttttttkjkkkww a krktnkk", + "Gttttttkakk a jktGkk", + "nttttttkaaagaaaaagaagaak", + "nttttttka lj akkkak", + "Gttttttka ljvv gkk sk", + "nttttttbbd i akk ak", + "nttttttbedk iia a sk", + "Gttttttbbdkk a ak", + "nttttttkakkkk iijjak", + "nttttttFjkkkkkk jkkkkk", + "GBBBBBBGiijrcjgjjijkkkkk", + "kttttttFkf kkkkgkkkAkkk", + "kttttttkkj kkkjkkkkkkk", + "kttttttkkjjrrcrjjkkkkkkk" + ], + "terrain": { + "a": "t_wall_wood", + "b": "t_rock", + "c": "t_window_empty", + "d": "t_rock_floor", + "e": "t_rock_floor", + "f": "t_door_b", + "g": "t_door_frame", + "h": "t_door_c", + "i": "t_wall_wood_broken", + "j": "t_wall_wood_chipped", + "k": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "m": "t_dirt", + "n": "t_chainfence_h", + "o": "t_concrete_wall", + "p": "t_door_metal_c", + "q": "t_stairs_down", + "r": "t_window_frame", + "s": "t_window_boarded", + "t": "t_dirt", + "l": "t_floor", + "u": "t_floor", + "v": "t_floor", + "w": "t_floor", + "x": "t_wall_wood_chipped", + "y": "t_floor", + "z": "t_tree_plum", + "A": "t_tree_apple", + "B": "t_door_metal_locked", + "C": "t_door_c", + "D": "t_dirtfloor", + "E": "t_dirtfloor", + "F": "t_gates_mech_control", + "G": "t_wall" + }, + "furniture": { + "e": "f_brazier", + "m": "f_rubble", + "l": "f_crate_o", + "u": "f_woodstove", + "v": "f_table", + "w": "f_bed", + "y": "f_dresser", + "E": "f_locker" + }, + "place_loot": [ + { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 9, 12 ], "y": [ 13, 19 ] }, + { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 13, 17 ], "y": [ 19, 17 ] }, + { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 14, 17 ], "y": [ 13, 15 ] }, + { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 14, 9 ], "y": [ 11, 9 ] }, + { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 19, 21 ], "y": [ 13, 17 ] }, + { "group": "floor_trash", "chance": 90, "repeat": [ 5 ], "x": [ 15, 10 ], "y": [ 22, 21 ] }, + { "group": "floor_trash", "chance": 90, "repeat": [ 3 ], "x": [ 16, 17 ], "y": [ 9, 11 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b11.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b11.json new file mode 100644 index 0000000000000..e6a369bc29e1d --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b11.json @@ -0,0 +1,72 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gas_b11" ], + "object": { + "fill_ter": "t_rock", + "rows": [ + " ", + " eeeee ", + " ehghe ", + " ehhhe ", + " eeeeeeeeaee ", + " eadaapeebee ", + " eacajjeaaae ", + " eaeeeeeaaae ", + " eeeeeadarpecfcee ", + " epapeacajjeaaaqe ", + " epapeaeeeeeahaee ", + " eefeeadaapeahaee ", + " eaaaeacajjeaaaqe ", + " eaaicaeeeeeebeee ", + " ealicadaapeeaee ", + " eeeeaaaeacajjeebee ", + " eaaeebeebeeeeeaaae ", + " eoabaaaaaaaaafaake ", + " eaaeeeeeaeeceeaake ", + " eeeeenaeaeaaicaake ", + " emababalicaaae ", + " eeeeeeeeeeeeee ", + " ", + " " + ], + "terrain": { + "a": "t_concrete_floor", + "b": "t_door_metal_c", + "c": "t_reinforced_glass", + "d": "t_reinforced_door_glass_c", + "e": "t_strconc_wall", + "f": "t_door_metal_locked", + "g": "t_ladder_up", + "h": "t_metal_floor", + "i": "t_concrete_floor", + "j": "t_concrete_floor", + "k": "t_concrete_floor", + "l": "t_concrete_floor", + "m": "t_concrete_floor", + "n": "t_concrete_floor", + "o": "t_stairs_down", + "p": "t_concrete_floor", + "q": "t_concrete_floor", + "r": "t_concrete_floor" + }, + "furniture": { "i": "f_table", "j": "f_bed", "k": "f_bench", "l": "f_chair", "m": "f_toilet", "n": "f_sink", "p": "f_locker" }, + "place_loot": [ + { "group": "snacks", "chance": 60, "repeat": [ 2 ], "x": [ 16, 18 ], "y": [ 16, 20 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 12, 14 ], "y": [ 19, 20 ] }, + { "group": "office", "chance": 60, "repeat": [ 3 ], "x": [ 8, 6 ], "y": [ 15, 12 ] }, + { "group": "guns_pistol_milspec", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 9, 10 ] }, + { "group": "ammo_pistol_milspec", "chance": 60, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 10, 10 ] }, + { "group": "prison_armor", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 9, 9 ] }, + { "group": "clothing_male", "chance": 60, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 14, 14 ] }, + { "group": "clothing_male", "chance": 60, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 11, 11 ] }, + { "group": "clothing_male", "chance": 60, "repeat": [ 4 ], "x": [ 12, 14 ], "y": [ 8, 9 ] }, + { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 6, 6 ] }, + { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 12, 12 ] }, + { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 15, 15 ] } + ], + "monster": { "q": { "monster": "mon_turret" }, "r": { "monster": "mon_zombie_soldier" } } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b20.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b20.json new file mode 100644 index 0000000000000..010394dbefbbe --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b20.json @@ -0,0 +1,134 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gas_b20" ], + "object": { + "fill_ter": "t_rock", + "rows": [ + "bqqaaabaiadFFFFFFFHFFFHb", + "braaaadaiabGHGFGHGbFFFFb", + "baaaaqdaiabGHGFGHGbIIIIb", + "bararqdaiabbbbbbbbbbbbbb", + "bqqaaabaianbEaEb ", + "bbbgbbbaianbEaEbbbbbbbbb", + "bBaaaBbaiabbbebbaxyHvaab", + "bBaCaBbaiabqqaadaaaaaawb", + "bBaCaBbaiaKaaaaKaawAaaub", + "bBaCaBbaiabqaaqdaaaaaavb", + "bBaaaBbaiadqarqbazHzaaab", + "bbbbbbbaiadqaasbbbbbbbbb", + "bEaqDDdaiabsaatb bbbbbbb", + "barqaaKaiadqaaqbbbEaaabb", + "baaaaadaiadqraaeaeaarabb", + "bbbdKdbaiabqaaabbbqqJqbb", + "booaaabahabbbebbcccffccc", + "bqaaaEbaiab baCbcllLLLLc", + "bbbaaEbahab baaacLllLLkc", + "booaaabaihb baaagLljjLnc", + "bqaaaabhiab bEEmcLLjjlnc", + "bbbboabhhhb bbbbcLLlllkc", + " bopb hhb cLLLllLc", + " bbbb cccccccc" + ], + "terrain": { + "a": "t_concrete_floor", + "b": "t_strconc_wall", + "c": "t_wall_metal", + "d": "t_wall_glass", + "e": "t_door_metal_c", + "f": "t_reinforced_glass", + "g": "t_door_metal_locked", + "h": "t_rock_floor", + "i": "t_metal_floor", + "j": "t_generator_broken", + "k": "t_plut_generator", + "l": "t_lava", + "m": "t_gates_mech_control", + "n": "t_sewage_pipe", + "o": "t_concrete_floor", + "p": "t_console", + "q": "t_concrete_floor", + "r": "t_concrete_floor", + "s": "t_ind_mixer", + "t": "t_ind_furnace", + "u": "t_ind_lathe", + "v": "t_machinery_light", + "w": "t_machinery_electronic", + "x": "t_ind_press", + "y": "t_machinery_heavy", + "z": "t_ind_furnace", + "A": "t_ind_drill", + "B": "t_concrete_floor", + "C": "t_concrete_floor", + "D": "t_concrete_floor", + "E": "t_concrete_floor", + "F": "t_linoleum_gray", + "G": "t_linoleum_gray", + "H": "t_linoleum_gray", + "I": "t_linoleum_gray", + "J": "t_console_broken", + "K": "t_door_glass_c", + "L": "t_metal_floor" + }, + "furniture": { + "h": "f_rubble_rock", + "o": "f_bed", + "q": "f_table", + "r": "f_chair", + "B": "f_rack", + "C": "f_bench", + "D": "f_bookcase", + "E": "f_locker", + "G": "f_chair", + "H": "f_table", + "I": "f_fridge" + }, + "place_loot": [ + { "group": "bar_table", "chance": 50, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 1, 2 ] }, + { "group": "bar_table", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 1, 2 ] }, + { "group": "mil_food_nodrugs", "chance": 80, "repeat": [ 10 ], "x": [ 19, 22 ], "y": [ 2, 2 ] }, + { "group": "vehicle_scrapped", "chance": 50, "repeat": [ 5 ], "x": [ 16, 22 ], "y": [ 6, 10 ] }, + { "group": "office_mess", "chance": 80, "repeat": [ 10 ], "x": [ 18, 21 ], "y": [ 13, 15 ] }, + { "group": "vehicle_scrapped", "chance": 50, "repeat": [ 5 ], "x": [ 17, 22 ], "y": [ 17, 22 ] }, + { "group": "hazmat_full", "chance": 50, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 20, 20 ] }, + { "group": "cleaning_bulk", "chance": 50, "repeat": [ 4 ], "x": [ 12, 12 ], "y": [ 4, 5 ] }, + { "group": "chem_lab", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 4, 5 ] }, + { "group": "office", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 12, 13 ] }, + { "group": "office", "chance": 50, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 12, 12 ] }, + { "group": "hospital_medical_items", "chance": 50, "repeat": [ 8 ], "x": [ 5, 5 ], "y": [ 17, 18 ] }, + { "group": "hospital_bed", "chance": 50, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 19, 19 ] }, + { "group": "hospital_bed", "chance": 50, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 16, 16 ] }, + { "group": "hospital_bed", "chance": 50, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 21, 22 ] }, + { "group": "guns_rifle_milspec", "chance": 80, "repeat": [ 4 ], "x": [ 5, 5 ], "y": [ 6, 8 ] }, + { "group": "guns_smg_milspec", "chance": 80, "repeat": [ 4 ], "x": [ 1, 1 ], "y": [ 6, 8 ] }, + { "group": "ammo_rifle_milspec", "chance": 80, "repeat": [ 4 ], "x": [ 5, 5 ], "y": [ 9, 10 ] }, + { "group": "ammo_smg_milspec", "chance": 80, "repeat": [ 4 ], "x": [ 1, 1 ], "y": [ 9, 10 ] }, + { "group": "textbooks", "chance": 80, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 12, 12 ] }, + { "group": "textbooks", "chance": 80, "repeat": [ 4 ], "x": [ 11, 12 ], "y": [ 7, 7 ] }, + { "group": "office", "chance": 50, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 2, 3 ] }, + { "group": "office", "chance": 50, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 4, 4 ] }, + { "group": "office", "chance": 50, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 0, 0 ] }, + { "group": "office_mess", "chance": 80, "repeat": [ 10 ], "x": [ 5, 1 ], "y": [ 4, 0 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 5 ], "x": [ 7, 9 ], "y": [ 0, 21 ] }, + { "group": "mut_lab", "chance": 80, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 9, 10 ] }, + { "group": "chem_lab", "chance": 50, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 9, 11 ] }, + { "group": "mut_lab", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 13, 15 ] }, + { "group": "chem_lab", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 11, 11 ] }, + { "group": "office_mess", "chance": 80, "repeat": [ 10 ], "x": [ 1, 5 ], "y": [ 14, 12 ] } + ], + "place_monsters": [ + { "monster": "GROUP_BUNKER", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.8 }, + { "monster": "GROUP_SCI", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.5 } + ], + "fields": { "l": { "field": "fd_nuke_gas", "density": 1, "age": 0 }, "L": { "field": "fd_nuke_gas", "density": 1, "age": 0 } }, + "computers": { + "p": { + "name": "Mr. Stem Cell", + "options": [ { "name": "Stem Cell Treatment", "action": "stemcell_treatment" } ], + "failures": [ { "action": "alarm" } ] + } + } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_b21.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b21.json new file mode 100644 index 0000000000000..c9df7fa8f268a --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_b21.json @@ -0,0 +1,128 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gas_b21" ], + "object": { + "fill_ter": "t_rock", + "rows": [ + "bbbbbbbbbbbbbbbbb ", + "bggbhhcaaachhbggb bbbb", + "bfffffdazadffaffbbbbbAAb", + "bggbiicazaciibggbaaaaaab", + "bbbbbbbazabbbbbbballllab", + "bggbhhcazachhbggbaaaaaab", + "bfffffdazadfffffballllab", + "bggbiicazaciibggbaaaaaab", + "bbbbbbbazabbbbbbbbbbcdcb", + "bggbhhcazabpppppbmmbaaab", + "bfffffdazaeaaaaaaaabkajb", + "bggbiicazabobobobmmbkajb", + "bbbbbbbazabnbnbnbbbbkajb", + " baaeazabbbbbbbkkbkajb", + " bkabaaabqqqqqbaabaaab", + " bbbbbcdcbaaaaabebbcdcb", + " baabaaaaaaaaaaaaaaaaab", + " bBaeazzzzzzzzzzzzzzzab", + " baabaaaaaaaaaaaaaaaaab", + "bbbbbbbcdcbbcbbbcbbbbebb", + "bayxaacaaabtutstutbwwsub", + "baaxaadazabtutstutbsssub", + "bkaaaacazacsssssssususvb", + "bcccdcbazadsssssssususvb" + ], + "terrain": { + "a": "t_concrete_floor", + "b": "t_strconc_wall", + "c": "t_wall_glass", + "d": "t_door_glass_c", + "e": "t_door_metal_c", + "f": "t_carpet_red", + "g": "t_carpet_red", + "h": "t_carpet_red", + "i": "t_carpet_red", + "j": "t_concrete_floor", + "k": "t_concrete_floor", + "l": "t_concrete_floor", + "m": "t_concrete_floor", + "n": "t_concrete_floor", + "o": "t_door_c", + "p": "t_concrete_floor", + "q": "t_sewage_pipe", + "r": "t_machinery_heavy", + "s": "t_linoleum_gray", + "t": "t_linoleum_gray", + "u": "t_linoleum_gray", + "v": "t_linoleum_gray", + "w": "t_linoleum_gray", + "x": "t_concrete_floor", + "y": "t_concrete_floor", + "A": "t_concrete_floor", + "z": "t_metal_floor", + "B": "t_stairs_up" + }, + "furniture": { + "g": "f_bed", + "h": "f_sofa", + "i": "f_locker", + "j": "f_bench", + "k": "f_locker", + "l": "f_treadmill", + "m": "f_shower", + "n": "f_toilet", + "p": "f_sink", + "t": "f_chair", + "u": "f_table", + "v": "f_oven", + "w": "f_sink", + "x": "f_table", + "y": "f_chair", + "A": "f_vending_c" + }, + "place_loot": [ + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 11, 11 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 9, 9 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 7, 7 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 5, 5 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 3, 3 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 1, 1 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 14, 15 ], "y": [ 1, 1 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 14, 15 ], "y": [ 3, 3 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 14, 15 ], "y": [ 7, 7 ] }, + { "group": "army_bed", "chance": 80, "repeat": [ 2 ], "x": [ 14, 15 ], "y": [ 5, 5 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 3, 3 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 3, 3 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 7, 7 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 7, 7 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 7, 7 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 7, 7 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 3, 3 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 3, 3 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 11, 11 ] }, + { "group": "army_personal_locker", "chance": 80, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 11, 11 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 2 ], "x": [ 4, 5 ], "y": [ 1, 2 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 2 ], "x": [ 11, 12 ], "y": [ 1, 2 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 2 ], "x": [ 11, 12 ], "y": [ 5, 6 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 2 ], "x": [ 4, 5 ], "y": [ 5, 6 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 2 ], "x": [ 4, 5 ], "y": [ 9, 10 ] }, + { "group": "cleaning_bulk", "chance": 50, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 14, 14 ] }, + { "group": "cleaning_bulk", "chance": 50, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 13, 13 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 13, 13 ] }, + { "group": "locker_gym", "chance": 50, "repeat": [ 8 ], "x": [ 20, 20 ], "y": [ 10, 13 ] }, + { "group": "vending_food", "chance": 80, "repeat": [ 1 ], "x": [ 21, 21 ], "y": [ 2, 2 ] }, + { "group": "vending_drink", "chance": 80, "repeat": [ 1 ], "x": [ 22, 22 ], "y": [ 2, 2 ] }, + { "group": "office", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 20, 21 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 5 ], "x": [ 5, 1 ], "y": [ 20, 22 ] }, + { "group": "bar_table", "chance": 50, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 20, 21 ] }, + { "group": "bar_table", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 20, 21 ] }, + { "group": "kitchen_nonfood", "chance": 50, "repeat": [ 4 ], "x": [ 19, 20 ], "y": [ 20, 20 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 4 ], "x": [ 22, 22 ], "y": [ 20, 21 ] }, + { "group": "oven", "chance": 50, "repeat": [ 4 ], "x": [ 22, 22 ], "y": [ 22, 23 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 5 ], "x": [ 6, 22 ], "y": [ 16, 18 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 5 ], "x": [ 9, 7 ], "y": [ 14, 1 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 7, 9 ], "y": [ 20, 23 ] } + ], + "place_monsters": [ { "monster": "GROUP_BUNKER", "x": [ 1, 22 ], "y": [ 1, 22 ], "density": 0.5 } ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_g0.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_g0.json new file mode 100644 index 0000000000000..7514de1e75b93 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_g0.json @@ -0,0 +1,47 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gas_g0" ], + "object": { + "fill_ter": "t_pavement", + "rows": [ + "ffaaaaaaaaaaaaaaaaaaffff", + "ffaa b b aaffff", + "ffaa b b aaffff", + "ffaa b b aaffff", + "ffaa b b aaffff", + "ffaa b b aaffff", + "aaaa b b aaaaaa", + "a a", + "a a", + "a a", + "a a", + "a a", + "a gggggggggggg a", + "a ggcdggggdcgg a", + "a ggcdggggdcgg a", + "a gggggggggggg a", + "a a", + "a a", + "a a", + "a a", + "a a", + "a aaaaaaaaaaaa a", + "a aeeeeeeeeeea a", + "a aaaaaaaaaaaa a" + ], + "terrain": { + "a": "t_sidewalk", + "b": "t_pavement_y", + "c": "t_gas_pump", + "d": "t_wall", + "e": "t_shrub", + "f": [ "t_dirt", "t_dirt", "t_dirt", "t_dirt", "t_shrub", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass" ], + "g": "t_concrete_floor" + }, + "furniture": { }, + "place_loot": [ { "group": "road", "chance": 60, "repeat": [ 10 ], "x": [ 1, 22 ], "y": [ 1, 20 ] } ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/gas/s_gas_g1.json b/data/mods/Fuji_Structures/worldgen/gas/s_gas_g1.json new file mode 100644 index 0000000000000..8bd929a465a87 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/gas/s_gas_g1.json @@ -0,0 +1,99 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gas_g1" ], + "object": { + "fill_ter": "t_linoleum_gray", + "rows": [ + "pppppppppppppppppppppppp", + "pppppCCCCCCCCCCiiiiiCCCp", + "pppppCpppppppppikBkippCp", + "pppppCpooooooooikkkippCp", + "pppppCppppoppppiijiippCp", + "pppppCpooooppppiAAAippCp", + "pppppCpppppppppelllqppCp", + "pppppCpppppppppilllippCp", + "pppppCpppppppppiiiiippCp", + "pppppCppppppppppppppppCp", + "pppppaaaaaaeaaaaapppppCp", + "pppppaxxsasmmmuuapnpppCp", + "pppppay asmmmuuapppppCp", + "pppaaaadaammmmmuaaaaCCCp", + "ppparrr dmmmmmmavwapppp", + "pppf acccccca apppp", + "pppa attttttadaapppp", + "pppaffffeacccccca apppp", + "pppa apppp", + "pppb rr rr rr rapppp", + "pppa z rr rr rr rapppp", + "pppaccar rr rr rr rapppp", + "ppDDDDbr apppp", + "ppDDDDaaaaabbbabbbaapppp" + ], + "terrain": { + "a": "t_brick_wall", + "b": "t_wall_glass", + "c": "t_door_glass_c", + "d": "t_door_c", + "e": "t_door_locked", + "g": "t_gates_mech_control", + "h": "t_window", + "i": "t_wall_wood", + "j": "t_door_metal_pickable", + "k": "t_metal_floor", + "l": "t_dirtfloor", + "m": "t_concrete_floor", + "f": "t_reinforced_glass", + "n": "t_water_pump", + "o": "t_sewage_pipe", + "p": [ "t_dirt", "t_dirt", "t_dirt", "t_dirt", "t_shrub", "t_grass", "t_grass", "t_grass", "t_grass", "t_grass" ], + "q": "t_window_boarded", + "r": "t_linoleum_gray", + "s": "t_linoleum_gray", + "t": "t_linoleum_gray", + "u": "t_concrete_floor", + "v": "t_linoleum_gray", + "w": "t_linoleum_gray", + "x": "t_linoleum_gray", + "y": "t_linoleum_gray", + "z": "t_linoleum_gray", + "A": "t_dirt", + "B": "t_ladder_down", + "C": "t_chainfence_h", + "D": "t_sidewalk" + }, + "furniture": { + "r": "f_rack", + "s": "f_locker", + "t": "f_glass_fridge", + "u": "f_crate_c", + "v": "f_toilet", + "w": "f_sink", + "x": "f_table", + "y": "f_chair", + "z": "f_trashcan", + "A": "f_locker" + }, + "place_loot": [ + { "group": "trash", "chance": 80, "repeat": [ 5 ], "x": [ 6, 6 ], "y": [ 20, 20 ] }, + { "group": "behindcounter", "chance": 80, "repeat": [ 5 ], "x": [ 4, 6 ], "y": [ 14, 14 ] }, + { "group": "snacks", "chance": 80, "repeat": [ 5 ], "x": [ 9, 10 ], "y": [ 19, 21 ] }, + { "group": "snacks", "chance": 80, "repeat": [ 5 ], "x": [ 12, 13 ], "y": [ 19, 21 ] }, + { "group": "snacks_fancy", "chance": 80, "repeat": [ 5 ], "x": [ 15, 16 ], "y": [ 19, 21 ] }, + { "group": "tools_common", "chance": 80, "repeat": [ 3 ], "x": [ 18, 18 ], "y": [ 19, 21 ] }, + { "group": "fridgesnacks", "chance": 80, "repeat": [ 8 ], "x": [ 10, 15 ], "y": [ 16, 16 ] }, + { "group": "tools_common", "chance": 60, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 11, 11 ] }, + { "group": "cleaning_bulk", "chance": 60, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 12, 12 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 6, 7 ], "y": [ 11, 11 ] }, + { "group": "office", "chance": 80, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 11, 11 ] }, + { "group": "pizza_display", "chance": 60, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 21, 22 ] }, + { "group": "vending_food", "chance": 60, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 11, 11 ] }, + { "group": "vending_food", "chance": 60, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 11, 11 ] }, + { "group": "vending_food", "chance": 60, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 12, 12 ] }, + { "group": "vending_drink", "chance": 60, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 12, 12 ] }, + { "group": "vending_drink", "chance": 60, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 13, 13 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/_house_template.json b/data/mods/Fuji_Structures/worldgen/houses/_house_template.json new file mode 100644 index 0000000000000..3d259f80b688c --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/_house_template.json @@ -0,0 +1,105 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "_house_template" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window", + "d": "t_grass", + "e": "t_sidewalk", + "f": "t_tree_apple", + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": "t_shrub_strawberry", + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "k": "f_toilet", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "place_loot": [ ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_1.json b/data/mods/Fuji_Structures/worldgen/houses/house_1.json new file mode 100644 index 0000000000000..627c9d017d689 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_1.json @@ -0,0 +1,158 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "ddQDDDDDdddddDDDdddddddd", + "daaPPPPaazzzaDDDazzzaddd", + "daQDDDDDaDDDDDDDDDDDaddd", + "daDDDDDDaDDDDDDDDDDDDddd", + "daDDDDDDaaccaabaaccaaddd", + "daDDDDDDa a aH Haddd", + "daDDDDDDa qq aH Haddd", + "davDDDDDa pp aaabaaddd", + "davDDDDDa pp akhhladdd", + "daaaaabaa qq aaahladdd", + "ddappp sa a b ahjcddd", + "ddc aa aa aRahjaddd", + "ddaIJ uu aaabaaddd", + "ddaaaaaaa auu Haddd", + "ddaR akhb b cddd", + "ddaR ajha a addd", + "ddaabaaaar pp pa paddd", + "ddamhhnNN ta GGaddd", + "ddcjhhhhh taH GGaddd", + "ddammihhh a paddd", + "ddaacabaaAttttpaaccaaddd", + "ddddeeeeaaccccaadddddddd", + "ddddeeeedddddddddddddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_chainfence_h", + "F": "t_chaingate_l", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_concrete_floor", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_locker" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 19, 19 ], "y": [ 13, 13 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 16, 16 ], "y": [ 18, 18 ] }, + { "group": "novels", "chance": 80, "repeat": [ 1 ], "x": [ 19, 19 ], "y": [ 16, 16 ] }, + { "group": "homebooks", "chance": 70, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 13, 13 ] }, + { "group": "homebooks", "chance": 70, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 13, 13 ] }, + { "group": "homebooks", "chance": 70, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 12, 12 ] }, + { "group": "homebooks", "chance": 70, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 12, 12 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 16, 16 ], "y": [ 11, 11 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 16, 16 ], "y": [ 5, 6 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 19, 19 ], "y": [ 5, 6 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 11, 11 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 15, 15 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 8, 8 ] }, + { "group": "tools_home", "chance": 60, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 7, 7 ] }, + { "group": "cleaning", "chance": 70, "repeat": [ 3 ], "x": [ 3, 5 ], "y": [ 10, 10 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 12, 12 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 12, 12 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 10, 10 ] }, + { "group": "pantry", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 14, 14 ] }, + { "group": "pantry", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 15, 15 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 2 ], "x": [ 7, 8 ], "y": [ 17, 17 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 2 ], "x": [ 3, 4 ], "y": [ 19, 19 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 1 ], "x": [ 3, 3 ], "y": [ 17, 17 ] }, + { "group": "kitchen_nonfood", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 18, 18 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 5, 5 ], "y": [ 19, 19 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 9, 9 ], "y": [ 16, 16 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 16, 16 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 16, 16 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 20, 20 ] }, + { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 11, 11 ], "y": [ 16, 16 ] }, + { "group": "dining", "chance": 80, "repeat": [ 4 ], "x": [ 10, 11 ], "y": [ 7, 8 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 18, 19 ], "y": [ 17, 18 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 17, 18 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 4 ], "x": [ 13, 10 ], "y": [ 20, 20 ] }, + { "group": "fridge", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 17, 17 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 19 ], "y": [ 19, 14 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 14 ], "y": [ 12, 20 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 12 ], "y": [ 10, 5 ] }, + { "group": "mechanics", "chance": 60, "repeat": [ 2 ], "x": [ 7, 3 ], "y": [ 2, 8 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_10.json b/data/mods/Fuji_Structures/worldgen/houses/house_10.json new file mode 100644 index 0000000000000..fdb2aaa48f72f --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_10.json @@ -0,0 +1,152 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "ddddddddddddeedddddddddd", + "ddddddddddddeeddddfddddd", + "ddaaccaacaadeedddddddddd", + "ddau b Hadeedddddddddd", + "ddc b Hadeedaaccccaad", + "dda aaaaacbaaA NN ad", + "dda GG as pp Aa tcd", + "ddapGG b tad", + "ddaaaaaa tttpad", + "ddclkja tt cd", + "ddalhhb a uuuad", + "ddaaaaahhhaaFFaa aaaaad", + "ddamhNNhvvaeeeea b HHad", + "ddcjhhhhNNaeeeeaaba cd", + "ddamhhhhvvaeeeeajha pad", + "ddamminhhraeeeeckha GGcd", + "ddaacaaahaaeeeealla ad", + "ddddddaIhNaeeeeaaaaacaad", + "ddddddaJhNaddddddddddddd", + "ddddddaabaaddddddddddddd", + "dddfdddddddddddddddfdddd", + "dddddddddddddddddddddddd", + "dddddddddddddfdddddfdddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_brick_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 19, 19 ], "y": [ 5, 5 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 6, 7 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 20, 18 ], "y": [ 8, 8 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 8, 8 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 5, 5 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 10, 11 ], "y": [ 6, 6 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 12, 13 ], "y": [ 9, 9 ] }, + { "group": "cleaning_bulk", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 6, 6 ] }, + { "group": "cleaning", "chance": 60, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 17, 18 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 7, 7 ], "y": [ 17, 18 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 3, 4 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 20, 21 ], "y": [ 12, 12 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 10, 10 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 10, 10 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 10, 10 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 3, 3 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 2 ], "x": [ 5, 6 ], "y": [ 12, 12 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 12, 12 ] }, + { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 4 ], "x": [ 3, 3 ], "y": [ 14, 15 ] }, + { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 15, 15 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 15, 15 ] }, + { "group": "cleaning", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 13, 13 ] }, + { "group": "softdrugs", "chance": 60, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 9, 9 ] }, + { "group": "softdrugs", "chance": 60, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 14, 14 ] }, + { "group": "bed", "chance": 60, "repeat": [ 1 ], "x": [ 20, 21 ], "y": [ 15, 15 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 6, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 7, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 14, 14 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 14, 8 ], "y": [ 10, 7 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 21 ], "y": [ 6, 9 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 1 ], "x": [ 16, 17 ], "y": [ 10, 12 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 19, 21 ], "y": [ 12, 16 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 6, 3 ], "y": [ 3, 7 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_2.json b/data/mods/Fuji_Structures/worldgen/houses/house_2.json new file mode 100644 index 0000000000000..3e0e7d0b52de0 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_2.json @@ -0,0 +1,150 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "ddddddddddeeeddddddddddd", + "dddddfddddeeeddddddddddd", + "dddddddddacbcaaccaaaaddd", + "ddaacaacaaA Aa pp addd", + "ddap HHa t addd", + "ddaGG a t addd", + "ddcGG a a tttp addd", + "ddap uu a addd", + "ddaabaaaba paddd", + "ddaH aOh auu paddd", + "ddaaaaJh aaaa aaddd", + "ddaH aIh aabavNvhhhmaddd", + "ddaabaaabajhavNvhhhmaddd", + "dda akhahhhhhhmcddd", + "ddc GG Hallanhhijmmaddd", + "ddapGGp Haacaabaacaaaddd", + "ddaaaacaaaDDDDDDDDDDzddd", + "dddddddddzDDDDDDDDDDzddd", + "dddddddddazzazDzzazzaddd", + "dddddddddddddddddddddddd", + "ddddfddddddddddddddddddd", + "dddddddfdddddddddddddddd", + "dddddddddddddddddfdddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 9, 9 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 9, 9 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 7, 7 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 7, 7 ], "y": [ 7, 7 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 8, 8 ], "y": [ 14, 15 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 7, 8 ], "y": [ 4, 4 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 3, 3 ], "y": [ 9, 9 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 3, 3 ], "y": [ 11, 11 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 4, 4 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 7, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 15, 15 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 15, 15 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 14, 15 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 3, 4 ], "y": [ 5, 6 ] }, + { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 16, 16 ], "y": [ 3, 3 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 6, 6 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 19, 19 ], "y": [ 8, 9 ] }, + { "group": "dining", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 11, 12 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 4 ], "x": [ 19, 19 ], "y": [ 11, 14 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 14, 14 ] }, + { "group": "cleaning", "chance": 80, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 14, 14 ] }, + { "group": "fridge", "chance": 80, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 14, 14 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 12, 12 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 3 ], "x": [ 6, 6 ], "y": [ 10, 11 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 9, 9 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 15, 17 ], "y": [ 6, 6 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 5, 4 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 8, 3 ], "y": [ 7, 4 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 8 ], "y": [ 13, 15 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 19, 14 ], "y": [ 3, 9 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 12, 10 ], "y": [ 9, 3 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_3.json b/data/mods/Fuji_Structures/worldgen/houses/house_3.json new file mode 100644 index 0000000000000..e24d9dbc518cf --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_3.json @@ -0,0 +1,160 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "dddddddddedddddddddddddd", + "dddddddddedddddddddddddd", + "dddaaccaaeaacaaeeeeeeeed", + "daaau pabappuaeeeeeeeed", + "daHb GGa b q beeeeeeeed", + "daaa a a aaccaaeeed", + "daHaaabaa aaaaaimjmaeeed", + "daba b pparhhhmaeeed", + "da u aaba hhhhnabaad", + "dc ajhat hhhhha ad", + "daGG akhat qpq aO cd", + "dap allat qpq aO ad", + "daaaaaaaaptt b cd", + "dakjaHasauuu a aIJad", + "dchhb aba aaa aaaaad", + "dalla a b padddd", + "daaaaba aaccaaa tcdddd", + "dauHH a b tcdddd", + "da c apttpadddd", + "dc GG b aaccaadddd", + "da pGGp a Edddddddd", + "daacaacaaEEEFEEEdddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_linoleum_gray", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "fridge", "chance": 80, "repeat": [ 4 ], "x": [ 18, 18 ], "y": [ 8, 8 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 6, 7 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 6, 6 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 14, 14 ], "y": [ 7, 7 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 6, 6 ] }, + { "group": "cleaning", "chance": 80, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 6, 6 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 4 ], "x": [ 20, 20 ], "y": [ 10, 11 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 13, 13 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 9, 9 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 8, 8 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 3, 3 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 17, 17 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 13, 13 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 13, 13 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 13, 13 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 12, 12 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 10, 11 ], "y": [ 12, 12 ] }, + { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 2, 3 ], "y": [ 10, 10 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 19, 20 ] }, + { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 3, 3 ], "y": [ 20, 20 ] }, + { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 11, 11 ] }, + { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 6, 6 ], "y": [ 20, 20 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 11, 12 ], "y": [ 7, 7 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 11, 12 ], "y": [ 3, 3 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 3, 3 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 20, 21 ], "y": [ 13, 13 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 5, 5 ], "y": [ 13, 13 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 4, 4 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 6, 6 ] }, + { "group": "bedroom", "chance": 80, "repeat": [ 1 ], "x": [ 7, 7 ], "y": [ 3, 3 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 18, 18 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 18, 18 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 15, 15 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 16, 17 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 17, 16 ], "y": [ 18, 18 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 3, 4 ], "y": [ 17, 17 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 15, 18 ], "y": [ 15, 18 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 7, 2 ], "y": [ 17, 20 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 4 ], "x": [ 4, 7 ], "y": [ 5, 3 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 4, 2 ], "y": [ 8, 11 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 11, 9 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_4.json b/data/mods/Fuji_Structures/worldgen/houses/house_4.json new file mode 100644 index 0000000000000..dbaa09a287d54 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_4.json @@ -0,0 +1,147 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "ddeeeeeeddddddddeeeddddd", + "ddeeeeeeddddddddeeeddddd", + "ddeeeeeeaaccccaaeeeddddd", + "ddeeeeeeau Aaabaccaad", + "ddeeeeeec Hap App ad", + "ddeeeeeea Hap ad", + "ddeeeeeea GG ap tad", + "ddeeeeeeapGGp a ttpad", + "ddeeeeeeaaaaaa a ad", + "ddQeeeeeb a au uad", + "daaPPPPaaaaa abau uad", + "daQDDDDDalla s aa aad", + "dcDDDDDDahha ad", + "daDDDDDOahhb aaaaa ad", + "daDDDDDOakja ammja qq ad", + "daDDDDDaaaaa anhh pp ad", + "daDDDDDbhhb hhh pp ad", + "dcDDDDDahhabaahhh qq ad", + "daDDDDDaIJahjahriaA ad", + "daaaaaaaacahkabacaaccaad", + "ddddddddddaacadddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_linoleum_gray", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 7, 7 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 7, 7 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 19, 20 ], "y": [ 7, 7 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 1 ], "x": [ 21, 21 ], "y": [ 6, 6 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 4, 4 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 4, 6 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 7, 7 ] }, + { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 19, 19 ], "y": [ 4, 4 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 9, 10 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 9, 10 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 14, 14 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 18, 18 ] }, + { "group": "tools_home", "chance": 80, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 13, 13 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 14, 14 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 8, 9 ], "y": [ 18, 18 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 4, 4 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 5, 5 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 3, 3 ] }, + { "group": "fridge", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 15, 15 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 18, 18 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 15, 15 ], "y": [ 18, 18 ] }, + { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 5 ], "x": [ 14, 16 ], "y": [ 14, 14 ] }, + { "group": "dining", "chance": 80, "repeat": [ 4 ], "x": [ 19, 20 ], "y": [ 15, 16 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 20, 20 ], "y": [ 8, 8 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 10, 11 ], "y": [ 6, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 14, 9 ], "y": [ 7, 3 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 16 ], "y": [ 4, 10 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 18 ], "y": [ 12, 18 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_5.json b/data/mods/Fuji_Structures/worldgen/houses/house_5.json new file mode 100644 index 0000000000000..024dc563911f5 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_5.json @@ -0,0 +1,157 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "ddQeeeeeddddddeedddddddd", + "daaPPPPaadddddeedddddddd", + "daQDDDDDaazzzaDDaacaaddd", + "daDDDDDDaDDDDDDDa addd", + "daDDDDDDaacccaabaHH addd", + "daDDDDDDau pa aaabaadd", + "daDDDDDDau GGa akahladd", + "daDDDDDDa GGa ahhhlcdd", + "daIDDDDDaH pa ahhhjadd", + "daJDaaaaaabaaaa aaabaadd", + "daabalhhb sadd", + "dda alkjaa aa aaabaadd", + "ddc aaaaa a aHb Hadd", + "dda r aHb cdd", + "dda qpq pttt aaa add", + "ddc qpq t uauu add", + "dda t ua add", + "ddaa aa ua GG cdd", + "ddamhhhNa ppp uapGGpadd", + "ddamhhhNaaccaccaaaccaadd", + "ddaihhhhbeeeeddddddddddd", + "ddammjmnaeeeeddddddddddd", + "ddaacacaaeeeeddddddddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "dining", "chance": 80, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 14, 15 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 11, 13 ], "y": [ 14, 14 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 15, 16 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 14, 14 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 18, 18 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 18, 18 ] }, + { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 12, 12 ], "y": [ 18, 18 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 15, 17 ] }, + { "group": "textbooks", "chance": 80, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 18, 18 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 17, 18 ], "y": [ 15, 15 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 6, 5 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 8, 8 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 17, 17 ], "y": [ 12, 12 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 17, 17 ], "y": [ 13, 13 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 20, 20 ], "y": [ 12, 12 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 17, 18 ], "y": [ 4, 4 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 11, 11 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 8, 8 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 10, 10 ] }, + { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 18, 19 ] }, + { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 2 ], "x": [ 3, 4 ], "y": [ 21, 21 ] }, + { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 18, 19 ] }, + { "group": "fridge", "chance": 60, "repeat": [ 4 ], "x": [ 7, 7 ], "y": [ 21, 21 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 21, 21 ] }, + { "group": "cleaning", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 20, 20 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 8, 8 ], "y": [ 13, 13 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 18, 19 ], "y": [ 17, 18 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 18, 18 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 18, 18 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 15 ], "y": [ 18, 13 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 8, 3 ], "y": [ 16, 13 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 12, 13 ], "y": [ 6, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 5, 5 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 8, 8 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 12, 10 ], "y": [ 8, 5 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 20, 17 ], "y": [ 15, 18 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 1 ], "x": [ 20, 19 ], "y": [ 14, 12 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 8, 9 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_6.json b/data/mods/Fuji_Structures/worldgen/houses/house_6.json new file mode 100644 index 0000000000000..3602887fd39cc --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_6.json @@ -0,0 +1,145 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "ddddddddeeddddddQeeeeddd", + "ddddddddeedddddaaPPPPaad", + "dddaacaaeedddddaQDDDDDad", + "dddaH HaDDDaDDDaDDDDDDad", + "dddaH HaDDDDDDDaDDDDDDad", + "ddaaabaabcaaccaaDDDDDDad", + "ddallhja Aa tt aDDDDDDaa", + "ddcllhka aDDDDDDOa", + "ddallhma aDDDDDDDc", + "ddaaabaa aDDDDDDJc", + "ddaHa ua a uu aDDDDDDIa", + "ddaba b aaaaaaaabaaaaa", + "dda a qppq arhhhmad", + "ddc a qppq hhhhiad", + "dda a hhhhmad", + "ddc GG at anhmjmad", + "ddapGGpat p qaabacaad", + "ddaaccaat p paeeeeeEd", + "ddddBBdat qaeeeeeEd", + "dddddddaaccaaccaaEFEEEEd", + "dddddddddBBddBBddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_linoleum_gray", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 15, 16 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 16, 16 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 16, 16 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 3, 3 ], "y": [ 10, 10 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 4, 4 ], "y": [ 3, 4 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 3, 4 ] }, + { "group": "textbooks", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 10, 10 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 12, 13 ], "y": [ 10, 10 ] }, + { "group": "dining", "chance": 60, "repeat": [ 4 ], "x": [ 12, 13 ], "y": [ 12, 13 ] }, + { "group": "cleaning_bulk", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 7, 7 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 22, 22 ], "y": [ 9, 10 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 4 ], "x": [ 21, 21 ], "y": [ 14, 15 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 12, 12 ] }, + { "group": "kitchen", "chance": 60, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 15, 15 ] }, + { "group": "fridge", "chance": 60, "repeat": [ 6 ], "x": [ 17, 17 ], "y": [ 15, 15 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 15, 18 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 12, 13 ], "y": [ 6, 6 ] }, + { "group": "cleaning", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 8, 8 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 6, 6 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 16, 17 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 17, 17 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 17, 17 ], "y": [ 12, 12 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 4 ], "x": [ 6, 3 ], "y": [ 12, 16 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 15, 8 ], "y": [ 12, 18 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 9, 8 ], "y": [ 11, 6 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 11, 14 ], "y": [ 10, 6 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_7.json b/data/mods/Fuji_Structures/worldgen/houses/house_7.json new file mode 100644 index 0000000000000..f91e0d1e4529f --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_7.json @@ -0,0 +1,157 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "dddeeeedddddddDDDdBBBBdd", + "ddQeeeedazzzaaDDDaaccaad", + "daaPPPPaaDDDDDDDDaH ad", + "daQDDDDDaDDDDDDDDaH pad", + "daDDDDDDaaaaaacbca GGad", + "daDDDDDDa aA a GGad", + "daDDDDDDaqq pa pad", + "daDDDDDDapp pabaaaad", + "daDDDDDDaqq allad", + "daDDDDDDa au bhhcd", + "daDDDDDDaaa au ajkad", + "dawwDDDDamhhau abaaaad", + "daaaaaabaihhatt a uuad", + "dalhkaIhamhh pa ad", + "dalhjaJhajhh ta ad", + "dahhmaa ahhh ta GG ad", + "daabaaO hhha papGGHad", + "da aabavNvaaFFaaaccaad", + "daN aH acccaeeeeezddddd", + "daGG aeeeeeeeeezddddd", + "daGG beeeeeeeeezddddd", + "daN u azzzzzeezzzddddd", + "daacaacaaddddddddddddddd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "w": "t_concrete_floor", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair", + "w": "f_locker" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "tools_home", "chance": 60, "repeat": [ 5 ], "x": [ 2, 2 ], "y": [ 11, 11 ] }, + { "group": "camping", "chance": 80, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 11, 11 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 14, 14 ] }, + { "group": "cleaning", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 15, 15 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 16, 16 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 13, 13 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 14, 14 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 18, 18 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 21, 21 ], "y": [ 16, 16 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 18, 18 ], "y": [ 3, 3 ] }, + { "group": "dresser", "chance": 80, "repeat": [ 4 ], "x": [ 18, 18 ], "y": [ 2, 2 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 20, 21 ], "y": [ 4, 5 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 19, 20 ], "y": [ 15, 16 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 2, 3 ], "y": [ 19, 20 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 6, 6 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 3, 3 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 18 ], "y": [ 16, 16 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 21, 21 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 18, 18 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 21, 21 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 2 ], "x": [ 20, 21 ], "y": [ 12, 12 ] }, + { "group": "homebooks", "chance": 60, "repeat": [ 4 ], "x": [ 13, 13 ], "y": [ 11, 10 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 9, 9 ] }, + { "group": "livingroom", "chance": 30, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 14, 15 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 6, 7 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 13, 13 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 16, 16 ] }, + { "group": "dining", "chance": 80, "repeat": [ 2 ], "x": [ 9, 10 ], "y": [ 7, 7 ] }, + { "group": "dining", "chance": 80, "repeat": [ 1 ], "x": [ 10, 10 ], "y": [ 17, 17 ] }, + { "group": "softdrugs", "chance": 80, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 10, 10 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 12, 12 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 13, 16 ], "y": [ 16, 5 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 11, 9 ], "y": [ 5, 9 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 7, 2 ], "y": [ 21, 19 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 21 ], "y": [ 6, 2 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 1 ], "x": [ 4, 2 ], "y": [ 18, 17 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_8.json b/data/mods/Fuji_Structures/worldgen/houses/house_8.json new file mode 100644 index 0000000000000..b45b2e564cd3d --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_8.json @@ -0,0 +1,165 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor_waxed", + "rows": [ + "dddddddddddeeedddddddddd", + "dddddddddddeeedaaEaEaEaa", + "daaaaaaaaaaaxaaallaA pa", + "dadddddddddeeedahka GGa", + "daddyddddddeeedahja GGa", + "dadddddddddeeedabaa pa", + "aaaaaaBBBddeeeda E", + "akhhwaaEaaaEbEaabaaaaHHa", + "EhhhaaOhhJaA pa aHHaaaa", + "allhjaOhhIa pa b pa", + "aaabaaabaaaE Ea a GGE", + "au b a GGE", + "E aababaaaaaaa a a", + "a ajha Rammnna aaaaaaa", + "E akha Raihhhm uusa", + "aH aaaaaaamhhhm qq E", + "aH GGpaHHajhhhh pp p E", + "E GG ajhhhh pp pq E", + "E amhhhr qq p Aa", + "E aaEEaa aEEa", + "aAtttAaHHaeeeeE Eddd", + "aaEEEaaaaaeeeeF ttt Eddd", + "ddddddddddeeeeE Eddd", + "ddddddddddeeeeaEEEEEaddd" + ], + "terrain": { + "a": "t_brick_wall", + "b": "t_door_locked", + "c": "t_window", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor_waxed", + "q": "t_floor_waxed", + "r": "t_linoleum_gray", + "s": "t_floor_waxed", + "t": "t_floor_waxed", + "u": "t_floor_waxed", + "A": "t_floor_waxed", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor_waxed", + "H": "t_floor_waxed_y", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "w": "t_linoleum_gray", + "x": "t_chaingate_l", + "y": "t_tree_cherry", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair", + "w": "f_shower" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "tools_home", "chance": 60, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 8, 8 ] }, + { "group": "cleaning_bulk", "chance": 60, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 9, 9 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 8, 9 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 7, 7 ], "y": [ 16, 16 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 16, 16 ] }, + { "group": "dresser_fancy", "chance": 60, "repeat": [ 4 ], "x": [ 7, 7 ], "y": [ 20, 20 ] }, + { "group": "dresser_fancy", "chance": 60, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 20, 20 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 3, 4 ], "y": [ 16, 17 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 1, 1 ], "y": [ 16, 16 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 1, 1 ], "y": [ 15, 15 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 18, 19 ], "y": [ 8, 8 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 21, 22 ], "y": [ 7, 7 ] }, + { "group": "mansion_bookcase", "chance": 60, "repeat": [ 4 ], "x": [ 1, 1 ], "y": [ 11, 11 ] }, + { "group": "mansion_bookcase", "chance": 60, "repeat": [ 4 ], "x": [ 20, 21 ], "y": [ 14, 14 ] }, + { "group": "softdrugs", "chance": 60, "repeat": [ 3 ], "x": [ 4, 4 ], "y": [ 9, 9 ] }, + { "group": "softdrugs", "chance": 60, "repeat": [ 3 ], "x": [ 4, 4 ], "y": [ 13, 13 ] }, + { "group": "pantry", "chance": 60, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 13, 14 ] }, + { "group": "fridge", "chance": 60, "repeat": [ 8 ], "x": [ 12, 13 ], "y": [ 13, 13 ] }, + { "group": "kitchen_nonfood", "chance": 80, "repeat": [ 2 ], "x": [ 11, 10 ], "y": [ 13, 13 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 1 ], "x": [ 10, 10 ], "y": [ 15, 15 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 1 ], "x": [ 10, 10 ], "y": [ 18, 18 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 14, 14 ] }, + { "group": "kitchen_nonfood", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 16, 17 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 14, 15 ] }, + { "group": "trash", "chance": 80, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 18, 18 ] }, + { "group": "dining", "chance": 80, "repeat": [ 4 ], "x": [ 16, 17 ], "y": [ 16, 17 ] }, + { "group": "office", "chance": 60, "repeat": [ 3 ], "x": [ 20, 20 ], "y": [ 16, 18 ] }, + { "group": "office", "chance": 60, "repeat": [ 4 ], "x": [ 22, 22 ], "y": [ 14, 14 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 16, 16 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 5, 5 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 2, 2 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 18 ], "y": [ 21, 21 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 2, 4 ], "y": [ 20, 20 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 13, 13 ], "y": [ 8, 9 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 21, 22 ], "y": [ 3, 4 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 21, 22 ], "y": [ 10, 11 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 9, 9 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 4 ], "x": [ 1, 8 ], "y": [ 20, 16 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 2, 1 ], "y": [ 11, 15 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 19, 22 ], "y": [ 2, 6 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 19, 15 ], "y": [ 14, 22 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 18, 22 ], "y": [ 9, 12 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/houses/house_9.json b/data/mods/Fuji_Structures/worldgen/houses/house_9.json new file mode 100644 index 0000000000000..ab76ee7f8df67 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/houses/house_9.json @@ -0,0 +1,155 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "house" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "dddddddeeeeedeeeeedddedd", + "dddddddeeeeedeeeeedddddd", + "dddddddeeeeedeeeeedddddd", + "dddddddeeeeedeeeeeddfddd", + "dddddddeeeeedeeeeedddddd", + "dddddddeeeeedeeeeedddddd", + "daacaadeeeeedeeeeeeedddd", + "dapGpadeeeeedeeeeeBedddd", + "da G aabacaadaacaaBedddd", + "dc aA p ada uaabcaad", + "daHH b cdcp aA Aad", + "daaaaa tttadaGG a pcd", + "dclhhb cdaGG a tad", + "dalkja puuadc b tad", + "daaaaa aaaadaHH a tad", + "damhh qaddddaaaaa cd", + "daihh pcddeeeaIJh uad", + "dcjhh qaddeeebhhhaabaad", + "damnhahhaddeeeamhnajhlad", + "daaabaIJaddeeecihhakhlad", + "dddddaaaaddeeeammjaacaad", + "ddddddddddddddaacaaddddd", + "ddddddddddfddddddddddddd", + "ddfddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_locked", + "c": "t_window_domestic", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": [ + "t_tree", + "t_tree_pine", + "t_tree_pear", + "t_tree_plum", + "t_tree_cherry", + "t_tree_maple", + "t_tree_birch", + "t_tree_apple", + "t_tree_willow", + "t_tree_hickory", + "t_tree_young" + ], + "g": "t_sidewalk", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "A": "t_floor", + "B": [ "t_shrub", "t_shrub", "t_shrub_strawberry", "t_shrub_blueberry" ], + "C": "t_fence_v", + "D": "t_concrete_floor", + "E": "t_wall_glass", + "F": "t_door_glass_c", + "G": "t_floor", + "H": "t_floor", + "I": "t_linoleum_gray", + "J": "t_linoleum_gray", + "K": "t_rock_floor", + "L": "t_rock_floor", + "M": "t_rock", + "N": "t_linoleum_gray", + "O": "t_linoleum_gray", + "P": "t_door_metal_locked", + "Q": "t_gates_mech_control", + "R": "t_linoleum_gray", + "v": "t_linoleum_gray", + "z": "t_railing_h" + }, + "furniture": { + "g": "f_dumpster", + "i": "f_oven", + "j": "f_sink", + "l": "f_bathtub", + "m": "f_counter", + "n": "f_fridge", + "o": "f_cupboard", + "p": "f_table", + "q": "f_chair", + "r": "f_trashcan", + "s": "f_locker", + "t": "f_sofa", + "u": "f_bookcase", + "A": "f_indoor_plant", + "G": "f_bed", + "H": "f_dresser", + "I": "f_washer", + "J": "f_dryer", + "K": "f_fireplace", + "N": "f_table", + "O": "f_locker", + "R": "f_rack", + "v": "f_chair" + }, + "toilets": { "k": { } }, + "place_loot": [ + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 7, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 7, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 10, 10 ] }, + { "group": "bed", "chance": 60, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 7, 8 ] }, + { "group": "bed", "chance": 60, "repeat": [ 4 ], "x": [ 14, 15 ], "y": [ 11, 12 ] }, + { "group": "softdrugs", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 13, 13 ] }, + { "group": "softdrugs", "chance": 60, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 18, 18 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 14, 15 ], "y": [ 14, 14 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 2, 3 ], "y": [ 10, 10 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 15, 16 ], "y": [ 16, 16 ] }, + { "group": "dresser", "chance": 60, "repeat": [ 4 ], "x": [ 6, 7 ], "y": [ 19, 19 ] }, + { "group": "dining", "chance": 80, "repeat": [ 1 ], "x": [ 7, 7 ], "y": [ 16, 16 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 15, 15 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 18, 18 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 18, 18 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 20, 20 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 1 ], "x": [ 16, 16 ], "y": [ 20, 20 ] }, + { "group": "kitchen_nonfood", "chance": 80, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 20, 20 ] }, + { "group": "kitchen_nonfood", "chance": 80, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 17, 17 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 16, 16 ] }, + { "group": "oven", "chance": 80, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 19, 19 ] }, + { "group": "fridge", "chance": 80, "repeat": [ 4 ], "x": [ 3, 3 ], "y": [ 18, 18 ] }, + { "group": "fridge", "chance": 80, "repeat": [ 4 ], "x": [ 17, 17 ], "y": [ 18, 18 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 4 ], "x": [ 9, 10 ], "y": [ 13, 13 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 9, 9 ] }, + { "group": "homebooks", "chance": 80, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 16, 16 ] }, + { "group": "livingroom", "chance": 80, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 12, 14 ] }, + { "group": "livingroom", "chance": 80, "repeat": [ 2 ], "x": [ 8, 10 ], "y": [ 11, 11 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 11, 11 ] }, + { "group": "table_livingroom", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 13, 13 ] }, + { "group": "a_television", "chance": 100, "repeat": [ 1 ], "x": [ 9, 9 ], "y": [ 9, 9 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 18, 21 ], "y": [ 16, 10 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 4 ], "x": [ 6, 10 ], "y": [ 9, 13 ] }, + { "group": "livingroom", "chance": 60, "repeat": [ 1 ], "x": [ 6, 7 ], "y": [ 14, 17 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 4, 2 ], "y": [ 10, 7 ] }, + { "group": "bedroom", "chance": 60, "repeat": [ 2 ], "x": [ 16, 14 ], "y": [ 14, 9 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_00.json b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_00.json new file mode 100644 index 0000000000000..78a65671bc674 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_00.json @@ -0,0 +1,132 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_lightindustry_00" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "fcccceccccecccceccccffff", + "fcccceccccecccceccccfhhf", + "fcccceccccecccceccccfhhf", + "fcccceccccecccceccccfhhf", + "fcccceccccecccceccccfhhf", + "fcccceccccecccceccccffff", + "ffffffffffffffffffffffff", + "daabaaabaaabaadddfffdddf", + "darruatsrar tadddfffdddf", + "da s a rars adddfffdddf", + "aa ahhabgbahhf", + "ar aaaavvyaaaa", + "brs a s a ua uavvvwwxa", + "ar arrua uasrbvvvvvwa", + "aaa aaaaa ua ravvvvvwa", + "arr atsra uagaavvvvvvg", + "ats a ra a zzvvvvvva", + "br g aaaaa", + "ars g aoija", + "aaagaat aaaaaaa giika", + "arr at amnlkna aaaaa", + "b s ua giiiiig giika", + "a uao aqpqioa aoija", + "aaabaaagaaaabaaaaaaaabaa" + ], + "terrain": { + "a": "t_wall", + "b": "t_window", + "c": "t_pavement", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_pavement_y", + "f": "t_sidewalk", + "g": "t_door_c", + "h": "t_shrub", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_linoleum_gray", + "p": "t_linoleum_gray", + "q": "t_linoleum_gray", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "v": "t_carpet_green", + "w": "t_carpet_green", + "x": "t_carpet_green", + "y": "t_carpet_green", + "z": "t_floor" + }, + "furniture": { + "k": "f_sink", + "l": "f_oven", + "m": "f_fridge", + "n": "f_counter", + "o": "f_trashcan", + "p": "f_table", + "q": "f_chair", + "r": "f_table", + "s": "f_chair", + "t": "f_locker", + "u": "f_bookcase", + "w": "f_sofa", + "x": "f_table", + "y": "f_trashcan", + "z": "f_vending_c" + }, + "toilets": { "j": { } }, + "place_loot": [ + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 2, 3 ], "y": [ 8, 8 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 8, 9 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 8, 9 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 6, 7 ], "y": [ 13, 13 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 15, 16 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 18, 17 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 15, 15 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 13, 11 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 1, 2 ], "y": [ 20, 20 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 14, 13 ] }, + { "group": "magazines", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 12, 12 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 19, 19 ], "y": [ 11, 11 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 6, 6 ], "y": [ 22, 22 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 14, 14 ], "y": [ 22, 22 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 20, 20 ], "y": [ 18, 18 ] }, + { "group": "trash", "chance": 60, "repeat": [ 5 ], "x": [ 20, 20 ], "y": [ 22, 22 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 12, 12 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 15, 15 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 14, 14 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 13, 13 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 12, 12 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 13, 13 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 8, 8 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 21, 21 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 22, 22 ] }, + { "group": "cleaning_bulk", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 19, 19 ] }, + { "group": "cleaning_bulk", "chance": 60, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 20, 20 ] }, + { "group": "oven", "chance": 60, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 20, 20 ] }, + { "group": "kitchen_nonfood", "chance": 60, "repeat": [ 4 ], "x": [ 13, 13 ], "y": [ 20, 20 ] }, + { "group": "fridge", "chance": 60, "repeat": [ 5 ], "x": [ 10, 10 ], "y": [ 20, 20 ] }, + { "group": "office", "chance": 60, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 15, 15 ] }, + { "group": "office", "chance": 60, "repeat": [ 4 ], "x": [ 12, 12 ], "y": [ 8, 8 ] }, + { "group": "office", "chance": 60, "repeat": [ 4 ], "x": [ 6, 6 ], "y": [ 8, 8 ] }, + { "group": "office", "chance": 60, "repeat": [ 4 ], "x": [ 1, 1 ], "y": [ 16, 16 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 6, 8 ], "y": [ 12, 12 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 6, 7 ], "y": [ 9, 9 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 12, 11 ], "y": [ 9, 8 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 4, 2 ], "y": [ 9, 9 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 11, 13 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 3, 12 ], "y": [ 10, 11 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 10, 11 ], "y": [ 12, 16 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 12, 3 ], "y": [ 17, 18 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 3, 4 ], "y": [ 16, 12 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 1, 3 ], "y": [ 22, 21 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 14, 12 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 22, 22 ] }, + { "group": "vending_food", "chance": 80, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 16, 16 ] }, + { "group": "vending_drink", "chance": 80, "repeat": [ 1 ], "x": [ 16, 16 ], "y": [ 16, 16 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_01.json b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_01.json new file mode 100644 index 0000000000000..e375deb951eda --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_01.json @@ -0,0 +1,103 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_lightindustry_01" ], + "object": { + "fill_ter": "t_concrete_floor", + "rows": [ + " khhhhhhhhhhklllllllll", + "lllkhhhhhhhhhhklllllllll", + "lllkhhhhhhhhhhklllllllll", + "lllkhhhhhhhhhhklllllllll", + "lllkhhhhhhhhhhklllllllll", + "lllkhhhhhhhhhhkmmmlmmmll", + "lllkhhhhhhhhhhaafaaafaal", + "lll hhhhhhhhhhazzzaDAzal", + "kkkkhchhhhhhhhaiAiaiizal", + "lllaaabbbbbagaaiiiiiiiaa", + "mmma cu u aiiiiiiiEa", + "afaa u u fiAAAAiiAf", + "CCC u u aizzzzizza", + "CC u u fiAAAAiaaa", + " u u aiiiiiiiza", + " uuuuu giiiiiiAzf", + " wy aiiiiiiiEa", + "deda rs aBiDiaagaa", + "o oa waagaiaiiza", + "o oa wq qajjaiaiAza", + "o oa tx apnaiaiiza", + "o oa wq vaaaagaafaa", + "o oa valkkkkklll", + "afaaaafaaaafaaalkkkkklll" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_metal_locked", + "c": "t_gates_mech_control", + "d": "t_chainfence_h", + "e": "t_chaingate_l", + "f": "t_window", + "g": "t_door_c", + "h": "t_pavement", + "i": "t_floor", + "j": "t_linoleum_gray", + "k": "t_sidewalk", + "l": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "m": "t_shrub", + "o": "t_concrete_floor", + "q": "t_ind_press", + "r": "t_ind_mixer", + "s": "t_ind_furnace", + "t": "t_ind_drill", + "u": "t_metal_floor", + "v": "t_machinery_old", + "w": "t_machinery_electronic", + "x": "t_machinery_light", + "y": "t_machinery_heavy", + "n": "t_linoleum_gray", + "p": "t_linoleum_gray", + "z": "t_floor", + "A": "t_floor", + "B": "t_floor", + "C": "t_concrete_floor", + "D": "t_floor", + "E": "t_floor" + }, + "furniture": { + "o": "f_rack", + "p": "f_sink", + "z": "f_table", + "A": "f_chair", + "B": "f_trashcan", + "C": "f_crate_c", + "D": "f_locker", + "E": "f_bookcase" + }, + "toilets": { "n": { } }, + "place_loot": [ + { "group": "vehicle_scrapped", "chance": 60, "repeat": [ 10 ], "x": [ 5, 12 ], "y": [ 11, 21 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 7, 8 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 15, 17 ], "y": [ 7, 7 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 21, 22 ], "y": [ 12, 12 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 14, 15 ] }, + { "group": "office", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 18, 20 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 16, 16 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 10, 10 ] }, + { "group": "cleaning_bulk", "chance": 60, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 17, 17 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 5 ], "x": [ 15, 20 ], "y": [ 16, 9 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 2 ], "x": [ 20, 21 ], "y": [ 18, 20 ] }, + { "group": "tools_blacksmith", "chance": 60, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 22, 20 ] }, + { "group": "tools_mechanic", "chance": 60, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 18, 19 ] }, + { "group": "tools_home", "chance": 60, "repeat": [ 4 ], "x": [ 0, 0 ], "y": [ 18, 20 ] }, + { "group": "power_tools", "chance": 60, "repeat": [ 3 ], "x": [ 0, 0 ], "y": [ 21, 22 ] }, + { "group": "vehicle_scrapped", "chance": 60, "repeat": [ 3 ], "x": [ 0, 0 ], "y": [ 12, 12 ] }, + { "group": "vehicle_scrapped", "chance": 60, "repeat": [ 3 ], "x": [ 1, 1 ], "y": [ 12, 12 ] }, + { "group": "vehicle_scrapped", "chance": 60, "repeat": [ 3 ], "x": [ 2, 2 ], "y": [ 12, 12 ] }, + { "group": "tools_construction", "chance": 60, "repeat": [ 3 ], "x": [ 0, 0 ], "y": [ 13, 13 ] }, + { "group": "tools_construction", "chance": 60, "repeat": [ 3 ], "x": [ 1, 1 ], "y": [ 13, 13 ] } + ], + "place_vehicles": [ { "vehicle": "cube_van", "x": [ 7, 7 ], "y": [ 2, 2 ], "chance": 80, "rotation": 270 } ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_10.json b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_10.json new file mode 100644 index 0000000000000..c8f548aabf656 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_10.json @@ -0,0 +1,118 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_lightindustry_10" ], + "object": { + "fill_ter": "t_linoleum_gray", + "rows": [ + "hhhhhhhhhhhhhhhhhhhhhhhh", + "hhhhhhhhhhhhhhhhhhhhhhhh", + "aggggaggggaggggaggagggga", + "aabbaaabbaaabbaabbaaaaaa", + "aotovajjjmamjjjaqqqparsa", + "aoppob l l boooqa a", + "aoooob bppoqam a", + "auooobj ljl c aaia", + "auoombjl j pb ww a", + "aaacaax mam lpb i", + "i ua x a", + "abbcbabbcbabbcbaccabbcba", + "a am nan a aj a", + "ajj naj ljam lja bjl na", + "a l majl jam jja aj ma", + "aabbaaabbaaabbaaccaabbaa", + "aggggaggggaggggaeeagggga", + "eeeeeeeeeeeeeeeeeeeeeeee", + "eddddfddddfddddfddddfege", + "eddddfddddfddddfddddfege", + "eddddfddddfddddfddddfege", + "eddddfddddfddddfddddfege", + "eddddfddddfddddfddddfege", + "eddddfddddfddddfddddfeee" + ], + "terrain": { + "a": "t_brick_wall", + "b": "t_wall_glass", + "c": "t_door_glass_c", + "d": "t_pavement", + "e": "t_sidewalk", + "f": "t_pavement_y", + "g": "t_shrub", + "h": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "i": "t_door_c", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_linoleum_gray", + "m": "t_linoleum_gray", + "n": "t_linoleum_gray", + "o": "t_carpet_red", + "p": "t_carpet_red", + "q": "t_carpet_red", + "r": "t_linoleum_gray", + "s": "t_carpet_red", + "t": "t_carpet_red", + "u": "t_carpet_red", + "v": "t_carpet_red", + "w": "t_linoleum_gray", + "x": "t_linoleum_gray" + }, + "furniture": { + "j": "f_table", + "k": "f_sofa", + "l": "f_chair", + "m": "f_locker", + "n": "f_bookcase", + "p": "f_table", + "q": "f_sofa", + "s": "f_sink", + "t": "f_chair", + "u": "f_bookcase", + "v": "f_safe_l", + "w": "f_vending_c", + "x": "f_trashcan" + }, + "toilets": { "r": { } }, + "place_loot": [ + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 8, 9 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 7, 8 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 7, 8 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 6, 8 ], "y": [ 4, 4 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 12, 14 ], "y": [ 4, 4 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 4, 4 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 4, 4 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 9, 9 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 9, 9 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 8, 8 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 14, 14 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 12, 12 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 13, 14 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 13, 14 ], "y": [ 14, 14 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 13, 13 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 14, 12 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 14, 14 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 2, 1 ], "y": [ 13, 13 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 7, 7 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 8, 8 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 13, 13 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 12, 12 ] }, + { "group": "textbooks", "chance": 60, "repeat": [ 2 ], "x": [ 11, 11 ], "y": [ 12, 12 ] }, + { "group": "textbooks", "chance": 80, "repeat": [ 10 ], "x": [ 14, 14 ], "y": [ 10, 10 ] }, + { "group": "office_mess", "chance": 80, "repeat": [ 10 ], "x": [ 22, 22 ], "y": [ 13, 13 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 10 ], "x": [ 1, 4 ], "y": [ 12, 14 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 10 ], "x": [ 9, 6 ], "y": [ 14, 12 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 10 ], "x": [ 14, 11 ], "y": [ 12, 14 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 10 ], "x": [ 22, 19 ], "y": [ 12, 14 ] }, + { "group": "vending_food", "chance": 80, "repeat": [ 1 ], "x": [ 20, 20 ], "y": [ 8, 8 ] }, + { "group": "vending_drink", "chance": 80, "repeat": [ 1 ], "x": [ 21, 21 ], "y": [ 8, 8 ] }, + { "group": "magazines", "chance": 80, "repeat": [ 2 ], "x": [ 19, 16 ], "y": [ 4, 6 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 6, 6 ] }, + { "group": "vault", "chance": 60, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 4, 4 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 4 ], "x": [ 1, 4 ], "y": [ 4, 8 ] }, + { "group": "floor_trash", "chance": 60, "repeat": [ 5 ], "x": [ 18, 18 ], "y": [ 10, 10 ] }, + { "group": "floor_trash", "chance": 60, "repeat": [ 5 ], "x": [ 6, 6 ], "y": [ 9, 9 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 10 ], "x": [ 6, 14 ], "y": [ 10, 4 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_11.json b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_11.json new file mode 100644 index 0000000000000..f1220ad71361b --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_11.json @@ -0,0 +1,81 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_lightindustry_11" ], + "object": { + "fill_ter": "t_thconc_floor", + "rows": [ + "oooooooooooooooooooooooo", + "oooooooooooooooooooooooo", + "nnnnannnnannnnannnnaoooo", + "affaaaffaaaffaaaffaannna", + "t ttt ta rr g pp aafaa", + "t ta g awwwa", + "t tagghgg bdxdf", + "aggggghgaa s bddda", + " a C bddya", + " zzzzz Ar r eddwa", + " z z bdxwf", + " z z rB addwa", + " z z aacaacaa", + " z z Eaddaokoa", + " jz z ar DE rauvaokoo", + "aaiiiiiaaaafaafaaaaaokoo", + "kjlllllkkannnnnnoooaokoo", + "kklllllkkkkkkkkkkkkkkkkk", + "lllllllllllkmllllmllllmk", + "lllllllllllkmllllmllllmk", + "lllllllllllkmllllmllllmk", + "lllllllllllkmllllmllllmk", + "lllllllllllkmllllmllllmk", + "lllllllllllkmllllmllllmk" + ], + "terrain": { + "a": "t_brick_wall", + "b": "t_wall_glass", + "c": "t_door_c", + "d": "t_linoleum_gray", + "e": "t_door_glass_c", + "f": "t_window", + "g": "t_chainfence_h", + "h": "t_chaingate_l", + "i": "t_door_metal_locked", + "j": "t_gates_mech_control", + "k": "t_sidewalk", + "l": "t_pavement", + "m": "t_pavement_y", + "n": "t_shrub", + "o": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "p": "t_machinery_old", + "q": "t_machinery_heavy", + "r": "t_machinery_electronic", + "s": "t_machinery_light", + "t": "t_thconc_floor", + "u": "t_linoleum_gray", + "v": "t_linoleum_gray", + "w": "t_linoleum_gray", + "x": "t_linoleum_gray", + "y": "t_linoleum_gray", + "z": "t_metal_floor", + "A": "t_ind_drill", + "B": "t_ind_press", + "C": "t_ind_lathe", + "D": "t_ind_mixer", + "E": "t_ind_furnace" + }, + "furniture": { "t": "f_locker", "u": "f_sink", "w": "f_table", "x": "f_chair", "y": "f_locker" }, + "toilets": { "v": { } }, + "place_loot": [ + { "group": "hand_tools", "chance": 75, "repeat": [ 4 ], "x": [ 0, 0 ], "y": [ 4, 6 ] }, + { "group": "power_tools", "chance": 75, "repeat": [ 4 ], "x": [ 3, 5 ], "y": [ 4, 4 ] }, + { "group": "tools_mechanic", "chance": 75, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 4, 6 ] }, + { "group": "elecsto_diy", "chance": 60, "repeat": [ 4 ], "x": [ 10, 15 ], "y": [ 14, 12 ] }, + { "group": "elecsto_diy", "chance": 60, "repeat": [ 4 ], "x": [ 10, 13 ], "y": [ 4, 5 ] }, + { "group": "vehicle_scrapped", "chance": 60, "repeat": [ 4 ], "x": [ 10, 18 ], "y": [ 11, 7 ] }, + { "group": "vehicle_scrapped", "chance": 60, "repeat": [ 4 ], "x": [ 8, 0 ], "y": [ 8, 13 ] }, + { "group": "office_mess", "chance": 60, "repeat": [ 6 ], "x": [ 20, 22 ], "y": [ 5, 11 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_road_0.json b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_road_0.json new file mode 100644 index 0000000000000..173aad3855dc2 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_road_0.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_lightindustry_road_0" ], + "object": { + "fill_ter": "t_pavement", + "rows": [ + "b ", + "b ", + "b ", + "b ", + "b ", + "b bbbbbbbbbbbbbbbbb", + "b bdddddddddddddddd", + "b bbbbbbbbbbbbbbbbb", + "b ", + "b ", + "b ", + "b ", + "b ", + "b ", + "b ", + "b ", + "b ", + "b ", + "b bbbb", + "b bddb", + "b bddb", + "b bddb", + "b bddb", + "b bbbb" + ], + "terrain": { "a": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], "b": "t_sidewalk", "c": "t_pavement_y", "d": "t_shrub" }, + "furniture": { } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_road_1.json b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_road_1.json new file mode 100644 index 0000000000000..afdd405436477 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/lightindustry/s_lightindustry_road_1.json @@ -0,0 +1,38 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_lightindustry_road_1" ], + "object": { + "fill_ter": "t_pavement", + "rows": [ + " b", + " b", + " b", + " b", + " b", + "bbbbbbbbbbbbbbbbb b", + "ddddddddddddddddb ", + "bbbbbbbbbbbbbbbbb ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "bbbb bbbbbbbbbb", + "aaab baaaaaaaaa", + "aaab baaaaaaaaa", + "aaab baaaaaaaaa", + "aaab baaaaaaaaa", + "bbbb baaaaaaaaa" + ], + "terrain": { "a": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], "b": "t_sidewalk", "c": "t_pavement_y", "d": "t_shrub" }, + "furniture": { } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/overmap_specials.json b/data/mods/Fuji_Structures/worldgen/overmap_specials.json new file mode 100644 index 0000000000000..ab4694e91c070 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/overmap_specials.json @@ -0,0 +1,86 @@ +[ + { + "type": "overmap_special", + "id": "o_airport", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_air_term_south" }, + { "point": [ 1, 0, 0 ], "overmap": "s_air_parking_south" }, + { "point": [ -2, 0, 0 ], "overmap": "s_air_hangars_south" }, + { "point": [ -1, 0, 0 ], "overmap": "s_air_atc_south" }, + { "point": [ -1, 0, 1 ], "overmap": "s_air_atc_2_south" }, + { "point": [ -1, 0, 2 ], "overmap": "s_air_atc_3_south" }, + { "point": [ -3, 1, 0 ], "overmap": "s_air_runway_r_south" }, + { "point": [ -2, 1, 0 ], "overmap": "s_air_runway_hangars_south" }, + { "point": [ -1, 1, 0 ], "overmap": "s_air_runway_south" }, + { "point": [ 0, 1, 0 ], "overmap": "s_air_runway_term_south" }, + { "point": [ 1, 1, 0 ], "overmap": "s_air_runway_south" }, + { "point": [ 2, 1, 0 ], "overmap": "s_air_runway_l_south" } + ], + "connections": [ + { "point": [ -1, -1, 0 ], "terrain": "road", "existing": false }, + { "point": [ 0, -1, 0 ], "terrain": "road", "existing": false }, + { "point": [ 1, -1, 0 ], "terrain": "road", "existing": false } + ], + "locations": [ "land", "swamp" ], + "city_distance": [ 5, -1 ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 1, 1 ], + "required": false, + "flags": [ "CLASSIC", "UNIQUE" ] + }, + { + "type": "overmap_special", + "id": "o_lightindustry", + "overmaps": [ + { "point": [ 1, 0, 0 ], "overmap": "s_lightindustry_road_0_south" }, + { "point": [ 0, 0, 0 ], "overmap": "s_lightindustry_road_1_south" }, + { "point": [ 1, -1, 0 ], "overmap": "s_lightindustry_00_south" }, + { "point": [ 0, -1, 0 ], "overmap": "s_lightindustry_01_south" }, + { "point": [ 1, 1, 0 ], "overmap": "s_lightindustry_10_south" }, + { "point": [ 0, 1, 0 ], "overmap": "s_lightindustry_11_south" } + ], + "connections": [ + { "point": [ -1, 0, 0 ], "terrain": "road", "existing": false }, + { "point": [ -2, 0, 0 ], "terrain": "road", "existing": true } + ], + "locations": [ "land", "swamp" ], + "city_distance": [ 0, -1 ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 1, 3 ], + "required": false, + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "o_gas_spc", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_gas_g0_south" }, + { "point": [ 0, 1, 0 ], "overmap": "s_gas_g1_south" }, + { "point": [ 0, 1, -1 ], "overmap": "s_gas_b11_south" }, + { "point": [ 0, 0, -2 ], "overmap": "s_gas_b20_south" }, + { "point": [ 0, 1, -2 ], "overmap": "s_gas_b21_south" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true } ], + "locations": [ "land", "swamp" ], + "city_distance": [ 0, -1 ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 1, 1 ], + "required": true, + "flags": [ "CLASSIC" ] + }, + { + "type": "overmap_special", + "id": "o_bunker_shop", + "overmaps": [ + { "point": [ 0, 0, 0 ], "overmap": "s_bunker_shop_g_south" }, + { "point": [ 0, 0, -1 ], "overmap": "s_bunker_shop_b_south" } + ], + "connections": [ { "point": [ 0, -1, 0 ], "terrain": "road", "existing": true } ], + "locations": [ "land", "swamp" ], + "city_distance": [ 10, -1 ], + "city_sizes": [ 1, 12 ], + "occurrences": [ 1, 1 ], + "required": true, + "flags": [ "CLASSIC" ] + } +] diff --git a/data/mods/Fuji_Structures/worldgen/overmap_terrain.json b/data/mods/Fuji_Structures/worldgen/overmap_terrain.json new file mode 100644 index 0000000000000..330daeaff2890 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/overmap_terrain.json @@ -0,0 +1,334 @@ +[ + { + "type": "overmap_terrain", + "id": "s_gunstore", + "name": "gun store", + "sym": 103, + "color": "red", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_diner", + "name": "diner", + "sym": 100, + "color": "green", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_apt", + "name": "apartment", + "sym": 65, + "color": "light_green", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_apt_2", + "name": "apartment", + "sym": 65, + "color": "light_green", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_cardealer", + "name": "dealership", + "sym": 48, + "color": "blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_camping", + "name": "outdoorsman's store", + "sym": 111, + "color": "brown", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_games", + "name": "gaming store", + "sym": 103, + "color": "cyan", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_term", + "name": "airport", + "sym": 65, + "color": "i_cyan", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_parking", + "name": "airport", + "sym": 65, + "color": "i_cyan", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_atc", + "name": "airport", + "sym": 65, + "color": "i_cyan", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_atc_2", + "name": "airport", + "sym": 65, + "color": "i_cyan", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_atc_3", + "name": "airport", + "sym": 65, + "color": "i_cyan", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_hangars", + "name": "airport", + "sym": 65, + "color": "i_cyan", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_runway", + "name": "runway", + "sym": 48, + "color": "blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_runway_hangars", + "name": "runway", + "sym": 48, + "color": "blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_runway_l", + "name": "runway", + "sym": 48, + "color": "blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_runway_r", + "name": "runway", + "sym": 48, + "color": "blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_air_runway_term", + "name": "runway", + "sym": 48, + "color": "blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_lightindustry_road_0", + "name": "light industry", + "sym": 4194417, + "color": "dark_gray", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_lightindustry_road_1", + "name": "light industry", + "sym": 4194417, + "color": "dark_gray", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_lightindustry_00", + "name": "light industry", + "sym": 73, + "color": "light_blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_lightindustry_01", + "name": "light industry", + "sym": 73, + "color": "light_blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_lightindustry_10", + "name": "light industry", + "sym": 73, + "color": "light_blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_lightindustry_11", + "name": "light industry", + "sym": 73, + "color": "light_blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_gas_g1", + "name": "gas station", + "sym": 103, + "color": "light_blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_gas_g0", + "name": "gas station", + "sym": 103, + "color": "light_blue", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_gas_b11", + "name": "reception", + "sym": 82, + "color": "red", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_gas_b20", + "name": "bunker", + "sym": 66, + "color": "red", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_gas_b21", + "name": "bunker", + "sym": 66, + "color": "red", + "see_cost": 5, + "extras": "build", + "mondensity": 2, + "flags": [ "SIDEWALK" ] + }, + { + "type": "overmap_terrain", + "id": "s_bunker_shop_g", + "name": "derelict property", + "sym": 94, + "color": "white", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + }, + { + "type": "overmap_terrain", + "id": "s_bunker_shop_b", + "name": "scavenger bunker", + "sym": 66, + "color": "light_green", + "see_cost": 5, + "extras": "build", + "mondensity": 2 + } +] diff --git a/data/mods/Fuji_Structures/worldgen/regional_overlay.json b/data/mods/Fuji_Structures/worldgen/regional_overlay.json new file mode 100644 index 0000000000000..c1768d7baec0b --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/regional_overlay.json @@ -0,0 +1,11 @@ +[ + { + "type": "region_overlay", + "id": "fuji_buildings_overlay", + "regions": [ "all" ], + "city": { + "houses": { "s_apt": 4, "s_apt_2": 4 }, + "shops": { "s_gunstore": 5, "s_diner": 4, "s_apt": 4, "s_apt_2": 4, "s_cardealer": 2, "s_camping": 1, "s_games": 1 } + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_apt.json b/data/mods/Fuji_Structures/worldgen/s_apt.json new file mode 100644 index 0000000000000..d4b2d8dbaef7b --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_apt.json @@ -0,0 +1,138 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_apt" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "aabaaaabaabcbaabaaaabaar", + "aqppqakkla al aq ar", + "b pp c ia ai c ppbr", + "a a ha ah ma ar", + "aaaaaa ja aj laaaaaar", + "rbo c c c c obrr", + "raoniamlma a ainoarr", + "aaaaaaaaaa aaaaaaaaaar", + "a qa la amlma p ar", + "b p c ia ai c p br", + "a p ak ha ah aq ar", + "aaaaaak ja aj aaaaaar", + "rbo c c c c obrr", + "raoniamlma alkkainoarr", + "aaaaaaaaaa aaaaaaaaaar", + "a a a a al a qar", + "adeadeadea ai c ppbr", + "a a ah la qar", + "a a aj maaaaaar", + "adeadea c c c obrr", + "a a agfa akkmainoarr", + "aaaaaaaaaa aabaaaaaarr", + "rrrrrrrrraacaarrrrrrrrrr", + "rrrrrrrrrrrrrrrrrrrrrrrr" + ], + "terrain": { + "a": "t_wall", + "b": "t_window_domestic", + "c": "t_door_c", + "d": "t_chainfence_v", + "e": "t_chaingate_c", + "f": "t_floor", + "g": "t_floor", + "h": "t_floor", + "i": "t_floor", + "j": "t_floor", + "k": "t_floor", + "l": "t_floor", + "m": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "q": "t_floor", + "r": [ "t_grass", "t_grass", "t_grass", "t_dirt" ] + }, + "furniture": { + "f": "f_washer", + "g": "f_dryer", + "h": "f_oven", + "i": "f_sink", + "j": "f_fridge", + "k": "f_sofa", + "l": "f_table", + "m": "f_chair", + "o": "f_bathtub", + "p": "f_bed", + "q": "f_dresser" + }, + "toilets": { "n": { } }, + "place_loot": [ + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 9, 10 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 1, 2 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 1, 2 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 20, 21 ], "y": [ 2, 2 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 8, 9 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 20, 21 ], "y": [ 16, 16 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 17, 17 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 10, 10 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 3, 3 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 3, 3 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 10, 10 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 9, 9 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 9, 9 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 2, 2 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 2, 2 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 16, 16 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 11, 11 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 4, 4 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 4, 4 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 11, 11 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 4 ], "x": [ 14, 14 ], "y": [ 18, 18 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 18, 18 ], "y": [ 20, 20 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 18, 18 ], "y": [ 13, 13 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 18, 18 ], "y": [ 6, 6 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 4, 4 ], "y": [ 6, 6 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 4, 4 ], "y": [ 13, 13 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 20, 20 ], "y": [ 19, 20 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 20, 20 ], "y": [ 12, 13 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 20, 20 ], "y": [ 5, 6 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 2, 2 ], "y": [ 5, 6 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 3 ], "x": [ 2, 2 ], "y": [ 12, 13 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 18, 18 ], "y": [ 1, 1 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 18, 18 ], "y": [ 10, 10 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 21, 21 ], "y": [ 15, 15 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 21, 21 ], "y": [ 17, 17 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 8, 8 ] }, + { "group": "clothing_female", "chance": 50, "repeat": [ 5 ], "x": [ 1, 1 ], "y": [ 1, 1 ] }, + { "group": "clothing_male", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 1, 1 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 6, 6 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 13, 13 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 8, 8 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 1, 1 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 1, 1 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 4, 4 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 15, 15 ], "y": [ 8, 8 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 13, 13 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 15, 15 ] }, + { "group": "homebooks", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 17, 17 ] }, + { "group": "clothing_male", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 1, 1 ] }, + { "group": "clothing_male", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 1, 1 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 1, 4 ], "y": [ 3, 1 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 21, 18 ], "y": [ 3, 1 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 18, 21 ], "y": [ 8, 10 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 18, 21 ], "y": [ 15, 17 ] }, + { "group": "bedroom", "chance": 50, "repeat": [ 5 ], "x": [ 1, 4 ], "y": [ 8, 10 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 6, 8 ], "y": [ 1, 6 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 6, 8 ], "y": [ 8, 13 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 14 ], "y": [ 8, 13 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 14 ], "y": [ 15, 20 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 14 ], "y": [ 6, 1 ] }, + { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 7, 8 ], "y": [ 15, 15 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 7, 8 ], "y": [ 20, 20 ] }, + { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 5, 4 ], "y": [ 15, 15 ] }, + { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 2, 1 ], "y": [ 15, 15 ] }, + { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 2, 1 ], "y": [ 20, 20 ] }, + { "group": "tools_home", "chance": 50, "repeat": [ 1 ], "x": [ 4, 5 ], "y": [ 20, 20 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_apt_2.json b/data/mods/Fuji_Structures/worldgen/s_apt_2.json new file mode 100644 index 0000000000000..1800ee81e8cf0 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_apt_2.json @@ -0,0 +1,138 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_apt_2" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "aabbaaabaacddcaaaaaabbaa", + "amffma fmacddcanknam a", + "b ff a f bcddcb aff b", + "b a bcddcb aff b", + "amm a acddcan ma ma", + "aaaeaaaeaacddcaaeaaaeaaa", + "attsss lacddca sssssa", + "bsssss jacddcak sssssb", + "athgis labeebak sighta", + "aaaaaa arssra aaaaaa", + "cbqsse esssse essqbc", + "caqpgakkkassssaljlagpqac", + "caaaaaaaaassssaaaaaaaaac", + "caqpgajlarssssra agpqac", + "cbqsse esssssse essqbc", + "aaaaaa assssssal aaaaaa", + "bthgis kassssssaj sightb", + "bsssss karssssral sssssb", + "aaaeaaeaaaassaaaaeaaeaaa", + "cam a mmassakkn am ac", + "cb an abea a bc", + "cb f an addan lja f bc", + "ca f a ffaddanjoja f ac", + "caabaaabbaaddaabbaaabaac" + ], + "terrain": { + "a": "t_wall", + "b": "t_window_domestic", + "c": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "d": "t_sidewalk", + "e": "t_door_c", + "f": "t_floor", + "g": "t_linoleum_gray", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_floor", + "k": "t_floor", + "l": "t_floor", + "m": "t_floor", + "n": "t_floor", + "o": "t_console_broken", + "p": "t_linoleum_gray", + "q": "t_linoleum_gray", + "r": "t_linoleum_gray", + "s": "t_linoleum_gray", + "t": "t_linoleum_gray" + }, + "furniture": { + "f": "f_bed", + "g": "f_sink", + "h": "f_oven", + "i": "f_fridge", + "j": "f_table", + "k": "f_sofa", + "l": "f_chair", + "m": "f_dresser", + "n": "f_bookcase", + "q": "f_bathtub", + "r": "f_indoor_plant", + "t": "f_table" + }, + "toilets": { "p": { } }, + "place_loot": [ + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 1, 1 ] }, + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 17, 17 ], "y": [ 1, 1 ] }, + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 4, 4 ] }, + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 21, 21 ] }, + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 22, 22 ] }, + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 16, 16 ], "y": [ 19, 19 ] }, + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 6, 6 ], "y": [ 20, 20 ] }, + { "group": "mansion_books", "chance": 50, "repeat": [ 1 ], "x": [ 6, 6 ], "y": [ 21, 21 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 5 ], "x": [ 19, 19 ], "y": [ 16, 16 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 5 ], "x": [ 19, 19 ], "y": [ 8, 8 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 8, 8 ] }, + { "group": "fridge", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 16, 16 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 8, 8 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 16, 16 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 16, 16 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 8, 8 ] }, + { "group": "kitchen_nonfood", "chance": 50, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 8, 8 ] }, + { "group": "kitchen_nonfood", "chance": 50, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 16, 16 ] }, + { "group": "kitchen_nonfood", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 16, 16 ] }, + { "group": "kitchen_nonfood", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 8, 8 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 16, 16 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 8, 8 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 1, 1 ], "y": [ 6, 6 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 6, 6 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 8, 8 ] }, + { "group": "kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 22, 22 ], "y": [ 16, 16 ] }, + { "group": "table_livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 16, 16 ] }, + { "group": "table_livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 11, 11 ] }, + { "group": "table_livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 6, 6 ], "y": [ 13, 13 ] }, + { "group": "table_livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 7, 7 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 6, 8 ], "y": [ 11, 6 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 15, 17 ], "y": [ 11, 6 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 16, 17 ], "y": [ 17, 13 ] }, + { "group": "livingroom", "chance": 50, "repeat": [ 2 ], "x": [ 7, 6 ], "y": [ 17, 13 ] }, + { "group": "clutter_bathroom", "chance": 50, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 11, 11 ] }, + { "group": "clutter_bathroom", "chance": 50, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 13, 13 ] }, + { "group": "clutter_bathroom", "chance": 50, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 13, 13 ] }, + { "group": "clutter_bathroom", "chance": 50, "repeat": [ 2 ], "x": [ 19, 19 ], "y": [ 11, 11 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 19, 20 ], "y": [ 2, 2 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 19, 20 ], "y": [ 3, 3 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 1, 2 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 2, 2 ], "y": [ 1, 2 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 1, 2 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 8, 9 ], "y": [ 22, 22 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 3, 3 ], "y": [ 22, 21 ] }, + { "group": "bed", "chance": 50, "repeat": [ 2 ], "x": [ 20, 20 ], "y": [ 22, 21 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 1, 1 ], "y": [ 1, 1 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 1, 1 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 2, 1 ], "y": [ 4, 4 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 22, 22 ], "y": [ 4, 4 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 19, 19 ], "y": [ 1, 1 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 19, 19 ], "y": [ 19, 19 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 8, 9 ], "y": [ 19, 19 ] }, + { "group": "allclothes", "chance": 50, "repeat": [ 5 ], "x": [ 2, 2 ], "y": [ 19, 19 ] }, + { "group": "jewelry_front", "chance": 50, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 4, 4 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 22, 19 ], "y": [ 1, 4 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 17, 15 ], "y": [ 3, 1 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 8, 6 ], "y": [ 4, 1 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 4, 1 ], "y": [ 4, 1 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 4, 2 ], "y": [ 19, 22 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 6, 9 ], "y": [ 19, 22 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 17, 14 ], "y": [ 19, 22 ] }, + { "group": "clutter_bedroom", "chance": 50, "repeat": [ 1 ], "x": [ 21, 19 ], "y": [ 19, 22 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_camping.json b/data/mods/Fuji_Structures/worldgen/s_camping.json new file mode 100644 index 0000000000000..ccaea8d715ed1 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_camping.json @@ -0,0 +1,105 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_camping" ], + "object": { + "fill_ter": "t_linoleum_gray", + "rows": [ + "ddddddddddddddeeeeeddddd", + "daacccaacccaadeeeeeddddd", + "da zadeeeeeddddd", + "da beeeeeeddddd", + "da ss ss beeeeeeddddd", + "dc ss ss t aaghhgggaadd", + "da ss ss u affffffffadd", + "da ss ss s cjffffjffgdd", + "da ss ss s cjfffjijfgdd", + "dc ss ss u ckkfffjffgdd", + "da ss ss t akkffffffgdd", + "da aa aa bffffffffadd", + "da ss ss yaffffwwwfgdd", + "dc cffffxvwfgdd", + "da cffffwwwfgdd", + "da ssssss affffffffgdd", + "da aaaaaabaaffffffffadd", + "da aooonnnqaaahhaaaaadd", + "daabaoopnnnqammffilllgdd", + "da annnnnnnbffffflllgdd", + "da arrnnnnnbffffffffhdd", + "daABarrrnnrraiiifffffgdd", + "daaaaaaaaaaaagggggggggdd", + "dddddddddddddddddddddddd" + ], + "terrain": { + "a": "t_wall", + "b": "t_door_c", + "c": "t_wall_glass", + "d": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "e": "t_sidewalk", + "f": "t_pavement", + "g": "t_chainfence_v", + "h": "t_chaingate_c", + "i": "t_pavement", + "j": "t_pavement", + "k": "t_pavement", + "l": "t_pavement", + "m": "t_pavement", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_linoleum_gray", + "t": "t_linoleum_gray", + "u": "t_console_broken", + "v": "t_pavement", + "w": "t_pavement", + "x": "t_pavement", + "y": "t_linoleum_gray", + "z": "t_linoleum_gray", + "A": "t_linoleum_gray", + "B": "t_linoleum_gray" + }, + "furniture": { + "i": "f_brazier", + "j": "f_bench", + "k": "f_chair", + "l": "f_dumpster", + "m": "f_crate_c", + "o": "f_crate_c", + "p": "f_crate_o", + "q": "f_bench", + "r": "f_chair", + "s": "f_rack", + "t": "f_counter", + "v": "f_groundsheet", + "w": "f_canvas_wall", + "x": "f_canvas_door", + "y": "f_vending_c", + "z": "f_trashcan", + "A": "f_sink" + }, + "toilets": { "B": { } }, + "place_loot": [ + { "group": "cannedfood", "chance": 50, "repeat": [ 10 ], "x": [ 3, 3 ], "y": [ 4, 10 ] }, + { "group": "swimmer_shoes", "chance": 50, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 4, 5 ] }, + { "group": "NC_COWBOY_shoes", "chance": 50, "repeat": [ 5 ], "x": [ 4, 4 ], "y": [ 6, 10 ] }, + { "group": "camping", "chance": 50, "repeat": [ 10 ], "x": [ 6, 6 ], "y": [ 4, 10 ] }, + { "group": "hand_tools", "chance": 50, "repeat": [ 5 ], "x": [ 7, 7 ], "y": [ 4, 10 ] }, + { "group": "softdrugs", "chance": 50, "repeat": [ 2 ], "x": [ 3, 4 ], "y": [ 12, 12 ] }, + { "group": "archery", "chance": 50, "repeat": [ 2 ], "x": [ 4, 7 ], "y": [ 15, 15 ] }, + { "group": "archery_ammo", "chance": 50, "repeat": [ 2 ], "x": [ 8, 9 ], "y": [ 15, 15 ] }, + { "group": "kitchen_nonfood", "chance": 50, "repeat": [ 4 ], "x": [ 6, 7 ], "y": [ 12, 12 ] }, + { "group": "book_survival", "chance": 50, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 7, 7 ] }, + { "group": "vending_food_items", "chance": 50, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 8, 8 ] }, + { "group": "vending_drink", "chance": 80, "repeat": [ 1 ], "x": [ 11, 11 ], "y": [ 12, 12 ] }, + { "group": "trash", "chance": 50, "repeat": [ 5 ], "x": [ 11, 11 ], "y": [ 2, 2 ] }, + { "group": "trash", "chance": 50, "repeat": [ 5 ], "x": [ 18, 20 ], "y": [ 18, 19 ] }, + { "group": "camping", "chance": 50, "repeat": [ 4 ], "x": [ 5, 6 ], "y": [ 17, 17 ] }, + { "group": "hand_tools", "chance": 50, "repeat": [ 2 ], "x": [ 7, 7 ], "y": [ 17, 17 ] }, + { "group": "cannedfood", "chance": 50, "repeat": [ 5 ], "x": [ 5, 6 ], "y": [ 18, 18 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_cardealer.json b/data/mods/Fuji_Structures/worldgen/s_cardealer.json new file mode 100644 index 0000000000000..254e179dbeec8 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_cardealer.json @@ -0,0 +1,70 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_cardealer" ], + "object": { + "fill_ter": "t_pavement", + "rows": [ + "be bbbbbbbbbbbbbbbbb", + "be a a a ab", + "be a a a ab", + "be a a a ab", + "be a a a ab", + "be a a a ab", + "be a a a ab", + "be b", + "be b", + "be b", + "be b", + "be b", + "be b", + "be aaaaaab", + "be b", + "be b", + "beeeeeeeee b", + "bcfgfffffc b", + "bcndddddkc aaaaaab", + "bcdddddlkc b", + "bckkkkddkcccc b", + "bcmldkdddcjic b", + "bcmddddmdghhc b", + "bcccccccccccc aaaaaab" + ], + "terrain": { + "a": "t_pavement_y", + "b": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "c": "t_wall", + "d": "t_floor", + "e": "t_sidewalk", + "f": "t_window", + "g": "t_door_c", + "h": "t_linoleum_gray", + "i": "t_linoleum_gray", + "j": "t_linoleum_gray", + "k": "t_floor", + "l": "t_floor", + "m": "t_floor", + "n": "t_floor" + }, + "furniture": { "j": "f_sink", "k": "f_table", "l": "f_chair", "m": "f_locker", "n": "f_vending_c" }, + "toilets": { "i": { } }, + "place_loot": [ + { "group": "office", "chance": 50, "repeat": [ 5 ], "x": [ 7, 7 ], "y": [ 22, 22 ] }, + { "group": "office", "chance": 50, "repeat": [ 5 ], "x": [ 2, 2 ], "y": [ 22, 21 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 10 ], "x": [ 8, 3 ], "y": [ 18, 22 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 21, 21 ] }, + { "group": "vending_drink", "chance": 50, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 18, 18 ] }, + { "group": "road", "chance": 50, "repeat": [ 2 ], "x": [ 21, 14 ], "y": [ 22, 16 ] }, + { "group": "road", "chance": 50, "repeat": [ 5 ], "x": [ 21, 2 ], "y": [ 15, 2 ] } + ], + "place_vehicles": [ + { "vehicle": "dealership", "x": [ 9, 9 ], "y": [ 3, 3 ], "chance": 50, "rotation": 270 }, + { "vehicle": "dealership", "x": [ 14, 14 ], "y": [ 3, 3 ], "chance": 50, "rotation": 270 }, + { "vehicle": "dealership", "x": [ 19, 19 ], "y": [ 3, 3 ], "chance": 50, "rotation": 270 }, + { "vehicle": "dealership", "x": [ 20, 20 ], "y": [ 15, 15 ], "chance": 50, "rotation": 0 }, + { "vehicle": "dealership", "x": [ 20, 20 ], "y": [ 20, 20 ], "chance": 50, "rotation": 0 } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_diner.json b/data/mods/Fuji_Structures/worldgen/s_diner.json new file mode 100644 index 0000000000000..a2be039298ead --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_diner.json @@ -0,0 +1,117 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_diner" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "hhhhiiihhhhhhhiiiihhhhhh", + "hiiiiiiiiihhhhiiiihhhhhh", + "hiiiiiiiiiiiiiiiiihhhhhh", + "hiiviiiviihhhhiiiihhhhhh", + "hivuvivuvaabbaaccaabbaah", + "hiiviiivia ah", + "hiiiiiiiiag gg gg gah", + "haabacabaaf ff ff fah", + "hagfg gfgag gg gg gah", + "ha a ah", + "ha laa aa aa aah", + "haaaaa ah", + "hagfga g g g g ah", + "ha ggaddeeeeeeeeeah", + "ha ffadddddddddddah", + "hagfga ggattdddddnddmah", + "haaaaa aaaaaaaeeeaadaah", + "hajdma as gfapdddddddah", + "hakddc a fapdddddddah", + "haaaaa aacaaaddeedaaaah", + "hakddc cdddddddddddddah", + "hajdma ammdrdeeoodaqqah", + "haaaaaacaaaaaaaaaaaaaaah", + "hhhhhhhhhhhhhhhhhhhhhhhh" + ], + "terrain": { + "a": "t_wall", + "b": "t_window", + "c": "t_door_c", + "d": "t_linoleum_gray", + "e": "t_linoleum_gray", + "f": "t_floor", + "g": "t_floor", + "h": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "i": "t_sidewalk", + "j": "t_linoleum_gray", + "k": "t_linoleum_gray", + "l": "t_floor", + "m": "t_linoleum_gray", + "n": "t_console_broken", + "o": "t_linoleum_gray", + "p": "t_linoleum_gray", + "q": "t_linoleum_gray", + "r": "t_linoleum_gray", + "s": "t_floor", + "t": "t_linoleum_gray", + "u": "t_sidewalk", + "v": "t_sidewalk" + }, + "furniture": { + "e": "f_counter", + "f": "f_table", + "g": "f_chair", + "k": "f_sink", + "l": "f_trashcan", + "m": "f_trashcan", + "o": "f_sink", + "p": "f_oven", + "q": "f_fridge", + "r": "f_locker", + "s": "f_locker", + "t": "f_rack", + "u": "f_table", + "v": "f_chair" + }, + "toilets": { "j": { } }, + "place_loot": [ + { "group": "bar_trash", "chance": 50, "repeat": [ 4 ], "x": [ 4, 4 ], "y": [ 21, 21 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 4 ], "x": [ 4, 4 ], "y": [ 17, 17 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 21, 21 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 4 ], "x": [ 10, 10 ], "y": [ 21, 21 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 4 ], "x": [ 21, 21 ], "y": [ 15, 15 ] }, + { "group": "bar_trash", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 10, 10 ] }, + { "group": "coffee_prep", "chance": 50, "repeat": [ 4 ], "x": [ 11, 12 ], "y": [ 15, 15 ] }, + { "group": "bar_food", "chance": 50, "repeat": [ 4 ], "x": [ 20, 20 ], "y": [ 21, 21 ] }, + { "group": "diner_food", "chance": 50, "repeat": [ 4 ], "x": [ 21, 21 ], "y": [ 21, 21 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 17, 17 ] }, + { "group": "oven", "chance": 50, "repeat": [ 2 ], "x": [ 14, 14 ], "y": [ 18, 18 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 2 ], "x": [ 16, 16 ], "y": [ 21, 21 ] }, + { "group": "kitchen", "chance": 80, "repeat": [ 2 ], "x": [ 17, 17 ], "y": [ 21, 21 ] }, + { "group": "cleaning_bulk", "chance": 50, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 21, 21 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 18, 18 ] }, + { "group": "cleaning", "chance": 50, "repeat": [ 1 ], "x": [ 2, 2 ], "y": [ 20, 20 ] }, + { "group": "restaur_kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 14, 15 ], "y": [ 21, 21 ] }, + { "group": "fast_kitchen", "chance": 50, "repeat": [ 2 ], "x": [ 16, 17 ], "y": [ 19, 19 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 12, 12 ], "y": [ 17, 18 ] }, + { "group": "office", "chance": 80, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 17, 17 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 3, 3 ], "y": [ 4, 4 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 7, 7 ], "y": [ 4, 4 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 3, 3 ], "y": [ 8, 8 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 7, 7 ], "y": [ 8, 8 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 3, 3 ], "y": [ 12, 12 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 3, 3 ], "y": [ 15, 15 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 8, 8 ], "y": [ 14, 14 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 9, 9 ], "y": [ 14, 14 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 10, 10 ], "y": [ 7, 7 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 13, 13 ], "y": [ 7, 7 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 14, 14 ], "y": [ 7, 7 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 17, 17 ], "y": [ 7, 7 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 18, 18 ], "y": [ 7, 7 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 21, 21 ], "y": [ 7, 7 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 13, 15 ], "y": [ 13, 13 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 17, 15 ], "y": [ 13, 13 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 19, 17 ], "y": [ 13, 13 ] }, + { "group": "coffee_table", "chance": 50, "repeat": [ 1 ], "x": [ 21, 19 ], "y": [ 13, 13 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_games.json b/data/mods/Fuji_Structures/worldgen/s_games.json new file mode 100644 index 0000000000000..21e114c3e66f7 --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_games.json @@ -0,0 +1,87 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_games" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "eeeeeefgddddgddddgddddgf", + "eeeeeefgddddgddddgddddgf", + "eeeeeefgddddgddddgddddgf", + "eeeeeefgddddgddddgddddgf", + "eeeeeefgddddgddddgddddgf", + "eeeeeefgddddgddddgddddgf", + "eeeeeeffffffffffffffffff", + "eeeeeeeaabbbbaccabbbbaae", + "eaababaa iiii oiiii ae", + "eahhhhha ae", + "ea ii ae", + "ea l hh hh i ae", + "ea hhh a lkl hh hh i ae", + "ea hhh a l j ae", + "ea i ae", + "ea hh hhh i ae", + "eahhhhha oaacaaa aaaae", + "eaababaaaacaa a aprae", + "eddddddda a ll a cpqae", + "edddddddc alkkla aaaae", + "ennddddda malkkla cpqae", + "enndddddammma ll asaprae", + "enndddddaaaaaabbaaaaaaae", + "eeeeeeeeeeeeeeeeeeeeeeee" + ], + "terrain": { + "a": "t_wall", + "b": "t_window", + "c": "t_door_c", + "d": "t_pavement", + "e": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "f": "t_sidewalk", + "g": "t_pavement_y", + "h": "t_floor", + "i": "t_floor", + "j": "t_console_broken", + "k": "t_floor", + "l": "t_floor", + "m": "t_floor", + "n": "t_pavement", + "o": "t_floor", + "p": "t_linoleum_gray", + "q": "t_linoleum_gray", + "r": "t_linoleum_gray", + "s": "t_floor" + }, + "furniture": { + "h": "f_rack", + "i": "f_counter", + "k": "f_table", + "l": "f_chair", + "m": "f_crate_c", + "n": "f_dumpster", + "o": "f_trashcan", + "r": "f_sink", + "s": "f_locker" + }, + "toilets": { "q": { } }, + "place_loot": [ + { "group": "magazines", "chance": 50, "repeat": [ 5 ], "x": [ 2, 6 ], "y": [ 9, 9 ] }, + { "group": "bookstore_misc", "chance": 50, "repeat": [ 5 ], "x": [ 3, 5 ], "y": [ 12, 12 ] }, + { "group": "games", "chance": 50, "repeat": [ 3 ], "x": [ 3, 5 ], "y": [ 13, 13 ] }, + { "group": "games", "chance": 50, "repeat": [ 5 ], "x": [ 2, 6 ], "y": [ 16, 16 ] }, + { "group": "games", "chance": 50, "repeat": [ 4 ], "x": [ 13, 14 ], "y": [ 12, 11 ] }, + { "group": "games", "chance": 50, "repeat": [ 5 ], "x": [ 16, 17 ], "y": [ 11, 12 ] }, + { "group": "games", "chance": 50, "repeat": [ 5 ], "x": [ 12, 13 ], "y": [ 15, 15 ] }, + { "group": "games", "chance": 50, "repeat": [ 5 ], "x": [ 15, 17 ], "y": [ 15, 15 ] }, + { "group": "trash", "chance": 50, "repeat": [ 5 ], "x": [ 11, 11 ], "y": [ 16, 16 ] }, + { "group": "trash", "chance": 50, "repeat": [ 5 ], "x": [ 16, 16 ], "y": [ 8, 8 ] }, + { "group": "games", "chance": 50, "repeat": [ 3 ], "x": [ 9, 11 ], "y": [ 21, 21 ] }, + { "group": "games", "chance": 50, "repeat": [ 1 ], "x": [ 11, 11 ], "y": [ 20, 20 ] }, + { "group": "games", "chance": 50, "repeat": [ 1 ], "x": [ 14, 15 ], "y": [ 19, 20 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 1 ], "x": [ 18, 18 ], "y": [ 21, 21 ] }, + { "group": "vending_food_items", "chance": 80, "repeat": [ 4 ], "x": [ 19, 19 ], "y": [ 14, 15 ] }, + { "group": "trash", "chance": 50, "repeat": [ 5 ], "x": [ 1, 2 ], "y": [ 20, 22 ] } + ] + } + } +] diff --git a/data/mods/Fuji_Structures/worldgen/s_gunstore.json b/data/mods/Fuji_Structures/worldgen/s_gunstore.json new file mode 100644 index 0000000000000..977470110a7bd --- /dev/null +++ b/data/mods/Fuji_Structures/worldgen/s_gunstore.json @@ -0,0 +1,217 @@ +[ + { + "type": "mapgen", + "method": "json", + "om_terrain": [ "s_gunstore" ], + "object": { + "fill_ter": "t_floor", + "rows": [ + "eeeeeeeeeeeeeeeeeefffeee", + "eaaabbaabbaabbaaafffffee", + "ea rafffffee", + "ea cfffffee", + "ea aa aa jjj afffffee", + "ea jj jj jjj aaaaaaae", + "ea jj jj ar oae", + "ea jj jj d ae", + "ea jj jj kk ka a a ae", + "ea jj jj l jhkakakae", + "ea jj jj m jhiiiiiae", + "ea aa aa m jhiiiiiae", + "ea m jhiiiiiae", + "ea m oaiiiiiae", + "eaadaaddaaaaaadaaiiiiiae", + "ear a avvou oaiiiiiae", + "ea ao avt hiiiiiae", + "eaqpao av raxxxxxae", + "eaaaa aaaaadaaaaaaaae", + "easss aggggggge", + "ea ss ss cgggggwwe", + "eass ss ss cgggggwwe", + "eassss agggggwwe", + "eaaaaaaaaaaaaaaaggggggge" + ], + "terrain": { + "a": "t_wall", + "b": "t_window_bars_alarm", + "c": "t_door_metal_pickable", + "d": "t_door_c", + "e": [ "t_grass", "t_grass", "t_grass", "t_dirt" ], + "f": "t_sidewalk", + "g": "t_pavement", + "h": "t_reinforced_glass", + "i": "t_thconc_floor", + "j": "t_floor", + "k": "t_floor", + "l": "t_console_broken", + "m": "t_floor", + "n": "t_floor", + "o": "t_floor", + "p": "t_floor", + "q": "t_floor", + "r": "t_floor", + "s": "t_floor", + "t": "t_floor", + "u": "t_floor", + "v": "t_floor", + "w": "t_pavement", + "x": "t_thconc_floor" + }, + "furniture": { + "j": "f_rack", + "k": "f_counter", + "m": "f_displaycase", + "n": "f_table", + "o": "f_locker", + "q": "f_sink", + "r": "f_trashcan", + "s": "f_crate_c", + "t": "f_chair", + "u": "f_gunsafe_ml", + "v": "f_desk", + "w": "f_dumpster", + "x": "f_sandbag_wall" + }, + "toilets": { "p": { } }, + "place_loot": [ + { "group": "guns_rifle_common", "chance": 50, "repeat": [ 1 ], "x": [ 15, 15 ], "y": [ 9, 9 ], "magazine": 100 }, + { + "group": "guns_rifle_common", + "chance": 50, + "repeat": [ 1 ], + "x": [ 15, 15 ], + "y": [ 10, 10 ], + "magazine": 100 + }, + { + "group": "guns_smg_common", + "chance": 50, + "repeat": [ 1 ], + "x": [ 15, 15 ], + "y": [ 11, 11 ], + "magazine": 100 + }, + { + "group": "guns_shotgun_common", + "chance": 50, + "repeat": [ 1 ], + "x": [ 15, 15 ], + "y": [ 12, 12 ], + "magazine": 100 + }, + { + "group": "guns_shotgun_common", + "chance": 50, + "repeat": [ 1 ], + "x": [ 15, 15 ], + "y": [ 13, 13 ], + "magazine": 100 + }, + { + "group": "guns_pistol_rare", + "chance": 40, + "repeat": [ 1 ], + "x": [ 12, 12 ], + "y": [ 12, 12 ], + "magazine": 100 + }, + { + "group": "guns_pistol_obscure", + "chance": 30, + "repeat": [ 1 ], + "x": [ 12, 12 ], + "y": [ 13, 13 ], + "magazine": 100 + }, + { + "group": "guns_rifle_milspec", + "chance": 80, + "repeat": [ 3 ], + "x": [ 13, 13 ], + "y": [ 15, 15 ], + "magazine": 100 + }, + { + "group": "guns_pistol_common", + "chance": 100, + "repeat": [ 1 ], + "x": [ 11, 11 ], + "y": [ 15, 15 ], + "magazine": 100 + }, + { + "group": "guns_pistol_rare", + "chance": 80, + "repeat": [ 1 ], + "x": [ 17, 17 ], + "y": [ 9, 9 ], + "magazine": 100 + }, + { + "group": "guns_pistol_rare", + "chance": 40, + "repeat": [ 1 ], + "x": [ 19, 19 ], + "y": [ 9, 9 ], + "magazine": 100 + }, + { + "group": "guns_pistol_rare", + "chance": 40, + "repeat": [ 1 ], + "x": [ 21, 21 ], + "y": [ 9, 9 ], + "magazine": 100 + }, + { "group": "mags_rifle_common", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 5, 5 ] }, + { "group": "mags_smg_common", "chance": 50, "repeat": [ 2 ], "x": [ 8, 8 ], "y": [ 6, 6 ] }, + { "group": "ammo_pistol_rare", "chance": 50, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 10, 10 ] }, + { "group": "clothing_tactical_torso", "chance": 50, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 5, 6 ] }, + { "group": "ammo_pistol_common", "chance": 50, "repeat": [ 6 ], "x": [ 9, 9 ], "y": [ 7, 9 ] }, + { "group": "ammo_shotgun_common", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 9, 10 ] }, + { "group": "ammo_rifle_common", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 7, 8 ] }, + { "group": "mags_pistol_common", "chance": 50, "repeat": [ 4 ], "x": [ 9, 9 ], "y": [ 5, 5 ] }, + { "group": "mags_pistol_rare", "chance": 50, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 6, 6 ] }, + { "group": "clothing_tactical_leg", "chance": 50, "repeat": [ 2 ], "x": [ 5, 5 ], "y": [ 7, 8 ] }, + { "group": "mil_food_nodrugs", "chance": 50, "repeat": [ 4 ], "x": [ 5, 5 ], "y": [ 9, 10 ] }, + { "group": "gunmod_common", "chance": 50, "repeat": [ 4 ], "x": [ 4, 4 ], "y": [ 10, 7 ] }, + { "group": "gunmod_rare", "chance": 50, "repeat": [ 2 ], "x": [ 4, 4 ], "y": [ 6, 5 ] }, + { "group": "gunmod_milspec", "chance": 50, "repeat": [ 5 ], "x": [ 2, 4 ], "y": [ 19, 19 ] }, + { "group": "ammo_rifle_common", "chance": 50, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 21, 22 ] }, + { "group": "tools_gunsmith", "chance": 75, "repeat": [ 4 ], "x": [ 3, 3 ], "y": [ 21, 22 ] }, + { "group": "ammo_pistol_common", "chance": 50, "repeat": [ 4 ], "x": [ 8, 8 ], "y": [ 20, 21 ] }, + { "group": "ammo_shotgun_common", "chance": 50, "repeat": [ 4 ], "x": [ 11, 12 ], "y": [ 20, 21 ] }, + { "group": "ammo_rifle_obscure", "chance": 50, "repeat": [ 4 ], "x": [ 4, 5 ], "y": [ 22, 22 ] }, + { "group": "ammo_pistol_rare", "chance": 50, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 20, 20 ] }, + { "group": "ammo_pistol_obscure", "chance": 50, "repeat": [ 2 ], "x": [ 9, 9 ], "y": [ 21, 21 ] }, + { "group": "office_mess", "chance": 80, "repeat": [ 2 ], "x": [ 10, 10 ], "y": [ 17, 15 ] }, + { "group": "cleaning_bulk", "chance": 80, "repeat": [ 4 ], "x": [ 5, 5 ], "y": [ 16, 17 ] }, + { "group": "floor_trash", "chance": 50, "repeat": [ 4 ], "x": [ 15, 15 ], "y": [ 2, 2 ] }, + { "group": "floor_trash", "chance": 50, "repeat": [ 4 ], "x": [ 15, 15 ], "y": [ 17, 17 ] }, + { "group": "floor_trash", "chance": 50, "repeat": [ 4 ], "x": [ 2, 2 ], "y": [ 15, 15 ] }, + { "group": "office_mess", "chance": 50, "repeat": [ 4 ], "x": [ 15, 15 ], "y": [ 15, 15 ] }, + { "group": "trash", "chance": 50, "repeat": [ 4 ], "x": [ 21, 22 ], "y": [ 20, 22 ] }, + { "group": "book_gunref", "chance": 50, "repeat": [ 4 ], "x": [ 12, 14 ], "y": [ 4, 4 ] }, + { "group": "book_gunmags", "chance": 50, "repeat": [ 4 ], "x": [ 12, 14 ], "y": [ 5, 5 ] }, + { "group": "floor_trash", "chance": 50, "repeat": [ 4 ], "x": [ 17, 17 ], "y": [ 6, 6 ] }, + { "group": "gunshop_accessories", "chance": 50, "repeat": [ 2 ], "x": [ 21, 21 ], "y": [ 6, 6 ] }, + { + "group": "guns_pistol_common", + "chance": 50, + "repeat": [ 1 ], + "x": [ 12, 12 ], + "y": [ 10, 10 ], + "magazine": 100 + }, + { + "group": "guns_pistol_common", + "chance": 50, + "repeat": [ 1 ], + "x": [ 12, 12 ], + "y": [ 11, 11 ], + "magazine": 100 + } + ] + } + } +] diff --git a/data/mods/More_Survival_Tools/items.json b/data/mods/More_Survival_Tools/items.json index 2ca1d6636798b..d82822329f5fa 100644 --- a/data/mods/More_Survival_Tools/items.json +++ b/data/mods/More_Survival_Tools/items.json @@ -16,7 +16,7 @@ "sub": "hotplate", "max_charges": 50, "charges_per_use": 1, - "use_action": "HOTPLATE" + "use_action": [ "HOTPLATE", "HEAT_FOOD" ] }, { "id": "hobo_stove_on", @@ -437,7 +437,7 @@ "initial_charges": 50, "max_charges": 50, "charges_per_use": 1, - "use_action": "HOTPLATE" + "use_action": [ "HOTPLATE", "HEAT_FOOD" ] }, { "id": "bottle_folding", @@ -492,7 +492,8 @@ "contains": 4, "watertight": true }, - "qualities": [ [ "COOK", 2 ], [ "BOIL", 1 ], [ "CONTAIN", 1 ] ] + "qualities": [ [ "COOK", 2 ], [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": "HEAT_FOOD" }, { "id": "pot_makeshift_copper", @@ -512,7 +513,8 @@ "contains": 4, "watertight": true }, - "qualities": [ [ "COOK", 2 ], [ "BOIL", 1 ], [ "CONTAIN", 1 ] ] + "qualities": [ [ "COOK", 2 ], [ "BOIL", 1 ], [ "CONTAIN", 1 ] ], + "use_action": "HEAT_FOOD" }, { "id": "canteen_wood", diff --git a/data/mods/No_Medieval_Items/modinfo.json b/data/mods/No_Medieval_Items/modinfo.json index 9beac59003a71..02d54adfcc2dd 100644 --- a/data/mods/No_Medieval_Items/modinfo.json +++ b/data/mods/No_Medieval_Items/modinfo.json @@ -15,6 +15,7 @@ "katana_fake", "broadsword", "broadsword_fake", + "broadsword_inferior", "arming_sword", "arming_sword_fake", "longsword", @@ -24,6 +25,8 @@ "scimitar", "scimitar_fake", "katana", + "katana_fake", + "katana_inferior", "rapier_fake", "rapier", "estoc", @@ -34,6 +37,7 @@ "zweihander_fake", "nodachi", "nodachi_fake", + "nodachi_inferior", "bullwhip", "wakizashi", "wakizashi_fake", @@ -41,13 +45,18 @@ "i_staff", "battleaxe", "battleaxe_fake", + "battleaxe_inferior", "mace", + "mace_fake", + "mace_inferior", "morningstar", + "morningstar_fake", + "morningstar_inferior", "warhammer", - "nodachi", - "nodachi_fake", "scythe_war", "pike", + "pike_fake", + "pike_inferior", "spear_steel", "glaive", "naginata", diff --git a/data/mods/alt_map_key/overmap_terrain.json b/data/mods/alt_map_key/overmap_terrain.json index fb6529a1451ab..eaa8aecc09796 100644 --- a/data/mods/alt_map_key/overmap_terrain.json +++ b/data/mods/alt_map_key/overmap_terrain.json @@ -1614,7 +1614,7 @@ "name" : "science lab", "sym" : 108, "color" : "i_pink", - "spawns" : { "group": "GROUP_ICE_LAB", "population": [0, 5], "chance": 20 }, + "spawns" : { "group": "GROUP_LAB", "population": [0, 5], "chance": 20 }, "see_cost" : 5, "flags" : [ "NO_ROTATE" ] },{ @@ -1624,7 +1624,7 @@ "sym" : 76, "color" : "i_pink", "see_cost" : 5, - "spawns" : { "group": "GROUP_ICE_LAB", "population": [0, 5], "chance": 20 }, + "spawns" : { "group": "GROUP_LAB", "population": [0, 5], "chance": 20 }, "flags" : [ "KNOWN_DOWN", "NO_ROTATE" ] },{ "type" : "overmap_terrain", @@ -1632,7 +1632,7 @@ "name" : "science lab", "sym" : 108, "color" : "i_pink", - "spawns" : { "group": "GROUP_ICE_LAB", "population": [0, 8], "chance": 30 }, + "spawns" : { "group": "GROUP_LAB", "population": [0, 8], "chance": 30 }, "see_cost" : 5, "flags" : [ "NO_ROTATE" ] },{ @@ -1641,7 +1641,7 @@ "name" : "science lab", "sym" : 76, "color" : "i_pink", - "spawns" : { "group": "GROUP_ICE_LAB", "population": [4, 12], "chance": 90 }, + "spawns" : { "group": "GROUP_LAB", "population": [4, 12], "chance": 90 }, "see_cost" : 5, "flags" : [ "NO_ROTATE" ] },{ diff --git a/data/mods/blazemod/blaze_blob.json b/data/mods/blazemod/blaze_blob.json index 1fcd6f54f5613..fb0b0d06308ef 100644 --- a/data/mods/blazemod/blaze_blob.json +++ b/data/mods/blazemod/blaze_blob.json @@ -57,7 +57,7 @@ "name": "liquified blob feed", "name_plural": "bfeedfuel", "description": "Liquified blob feed, useful for fueling certain blob based vehicle parts", - "weight": 50, + "weight": 1, "volume": 1, "price": 40, "price_postapoc": 800, diff --git a/data/mods/more_classes_scenarios/cs_classes.json b/data/mods/more_classes_scenarios/cs_classes.json index 429b2f4a523ef..ad5a9b0164e48 100644 --- a/data/mods/more_classes_scenarios/cs_classes.json +++ b/data/mods/more_classes_scenarios/cs_classes.json @@ -224,7 +224,7 @@ "type" : "profession", "ident": "trans_human", "name": "Post-Human Cyborg", - "description": "As a wealthy trans-humanist you decided to put yourself on the frontline of augmentative technology to bring forth the future. You are now a walking example of what humanity could had become.", + "description": "As a wealthy trans-humanist you decided to put yourself on the frontline of augmentative technology to bring forth the future. You are now a walking example of what humanity could have become.", "points": 8, "CBMs":[ "bio_str_enhancer", diff --git a/data/mods/necromancy/necronimicron.json b/data/mods/necromancy/necronimicron.json index 3df3c366650c6..2ad684b1789c5 100644 --- a/data/mods/necromancy/necronimicron.json +++ b/data/mods/necromancy/necronimicron.json @@ -71,7 +71,7 @@ "healthy" : -30, "addiction_type" : "none", "addiction_potential" : 0, - "nutrition" : -100, + "calories" : -868, "fun": -10, "color": "green", "description": "A potent drug, necessary when performing a revival operation on larger animals (including humans). It induces a violent allergic reactions in living organisms, so using it on yourself is a REALLY bad idea.", diff --git a/data/motd/en.motd b/data/motd/en.motd index a05fba56c8a76..0343656f03192 100644 --- a/data/motd/en.motd +++ b/data/motd/en.motd @@ -1,19 +1,20 @@ # This message may be 21 lines long at maximum, but ideally will be less. # Max length of a line is 72 characters; the following line is for reference ######################################################################## -Major features in v0.C Cooper: -* Monster infighting. -* Aiming system overhaul. -* Enhanced turret controls. -* Clothing modifications. -* Lots of craftable pottery, explosives, metal goods, clothes and food. -* New action menu for triggering items. -* Improved layering and encumbrance system. -* Huge performance improvements when dealing with many nearby items. -* Backward compatability with 0.A and 0.B saves. + Visit us: -For latest discussions and news on Cataclysm DDA, please visit: -Homepage: https://cataclysmdda.org -Wiki: http://tools.cataclysmdda.com/wiki +* Homepage: https://cataclysmdda.org +* Wiki: http://tools.cataclysmdda.com/wiki -Ingame you can access the options via the main menu (Esc). +* Report bugs, suggestion and follow the development at: + https://github.com/CleverRaven/Cataclysm-DDA/issues + or e-mail: kevin.granade@gmail.com + +Join the discussion on forums and chats: +* Discourse: https://discourse.cataclysmdda.org/ +* Reddit (unofficial): https://www.reddit.com/r/cataclysmdda/ +* Discord (unofficial): https://discord.gg/VDKWmwd + +Other useful links are also available at our Homepage. + +In game you can access the options via the main menu (Esc). diff --git a/doc/CODE_STYLE.md b/doc/CODE_STYLE.md index 6c25f1d4e67d1..c5ffff752d318 100644 --- a/doc/CODE_STYLE.md +++ b/doc/CODE_STYLE.md @@ -36,8 +36,8 @@ int foo( int arg1, int *arg2 ) } else if( arg1 > 17 ) { int i = 0; while( i < arg1 ) { - printf( _("Really long message that's pointless except for the number %d and for its " - "length as it's illustrative of how to break strings properly.\n"), i ); + printf( _( "Really long message that's pointless except for the number %d and for its " + "length as it's illustrative of how to break strings properly.\n" ), i ); } } return 0; diff --git a/doc/JSON_FLAGS.md b/doc/JSON_FLAGS.md index 0fe52a8e8d476..d25ba1ff6269d 100644 --- a/doc/JSON_FLAGS.md +++ b/doc/JSON_FLAGS.md @@ -260,6 +260,7 @@ Flags used to describe monsters and define their properties and abilities. - ```KEENNOSE``` Keen sense of smell. - ```LARVA``` Creature is a larva. Currently used for gib and blood handling. - ```LEATHER``` May produce leather when butchered. +- ```LOUDMOVES``` Mkes move noises as if ~2 sizes louder, even if flying. - ```MILKABLE``` Produces milk when milked. - ```NIGHT_INVISIBILITY``` Monster becomes invisible if it's more than one tile away and the lighting on its tile is LL_LOW or less. Visibility is not affected by night vision. - ```NOHEAD``` Headshots not allowed! @@ -489,6 +490,7 @@ These branches are also the valid entries for the categories of `dreams` in `dre - ```DOME_LIGHT``` - ```DOOR_MOTOR``` - ```ENGINE``` Is an engine and contributes towards vehicle mechanical power. +- ```E_HEATER``` Is an engine and has a heater to warm internal vehicle items when on. - ```E_ALTERNATOR``` Is an engine that can power an alternator. - ```E_COLD_START``` Is an engine that starts much slower in cold weather. - ```E_COMBUSTION``` Is an engine that burns its fuel and can backfire or explode when damaged. @@ -815,7 +817,7 @@ Some armor flags, such as `WATCH` and `ALARMCLOCK` are compatible with other ite - ```EATEN_HOT``` Morale bonus for eating hot. - ```EATEN_COLD``` Morale bonus for eating cold. - ```EDIBLE_FROZEN``` Being frozen doesn't prevent eating it. No morale bonus. -- ```NO_FREEZE``` It spoils instantly when frozen. +- ```FREEZERBURN``` First thaw is MUSHY, second is rotten - ```MELTS``` Provides half fun unless frozen. Edible when frozen. - ```FERTILIZER``` Works as fertilizer for farming, of if this consumed with the PLANTBLECH function penalties will be reversed for plants. - ```HIDDEN_POISON``` ... Food is poisonous, visible only with a certain survival skill level. @@ -929,7 +931,7 @@ Those flags are added by the game code to specific items (that specific welder, - ```COLD``` Item is cold (see EATEN_COLD). - ```FROZEN``` Item is frozen solid (used by freezer). -- ```MUSHY``` NO_FREEZE item was frozen and is now mushy and tasteless and will go bad after freezing again. +- ```MUSHY``` FREEZERBURN item was frozen and is now mushy and tasteless and will go bad after freezing again. - ```NO_PARASITES``` Invalidates parasites count set in food->type->comestible->parasites - ```FIT``` Reduces encumbrance by one. - ```HOT``` Item is hot (see EATEN_HOT). @@ -1153,3 +1155,9 @@ Those flags are added by the game code to specific items (that specific welder, - ```mx_roadblock``` ... Roadblock furniture with turrets and some cars. - ```mx_science``` ... Corpses and some scientist items. - ```mx_supplydrop``` ... Crates with some military items in it. +- ```mx_shia``` ... A *chance* of Shia, if Crazy Catalcysm is enabled. +- ```mx_spider``` ... A big spider web, complete with spiders and eggs. +- ```mx_jabberwock``` ... A *chance* of a jabberwock. +- ```mx_grove``` ... All trees and shrubs become a single species of tree. +- ```mx_shrubbery``` ... All trees and shrubs become a single species of shrub. +- ```mx_clearcut``` ... All trees become stumps. diff --git a/doc/JSON_INFO.md b/doc/JSON_INFO.md index 012918183416d..18badb3c0157f 100644 --- a/doc/JSON_INFO.md +++ b/doc/JSON_INFO.md @@ -55,6 +55,7 @@ Here's a quick summary of what each of the JSON files contain, broken down by fo | techniques.json | generic for items and martial arts | terrain.json | terrain types and definitions | test_regions.json | test regions +| tips.json | tips of the day | tool_qualities.json | standard tool qualities and their actions | traps.json | standard traps | tutorial.json | messages for the tutorial (that is out of date) @@ -749,6 +750,7 @@ See also VEHICLE_JSON.md "volume" : 1, // Volume, measured in 1/4 liters "integral_volume" : 0, // Volume added to base item when item is integrated into another (eg. a gunmod integrated to a gun) "rigid": false, // For non-rigid items volume (and for worn items encumbrance) increases proportional to contents +"insulation": 1, // (Optional, default = 1) If container or vehicle part, how much insulation should it provide to the contents "price" : 100, // Used when bartering with NPCs "material" : ["COTTON"], // Material types, can be as many as you want. See materials.json for possible options "cutting" : 0, // (Optional, default = 0) Cutting damage caused by using it as a melee weapon @@ -902,11 +904,13 @@ Never use `yellow` and `red`, those colors are reserved for sounds and infrared "quench" : 0, // Thirst quenched "heal" : -2, // Health effects (used for sickness chances) "addiction_potential" : 80, // Ability to cause addictions -"nutrition" : 0, // Hunger satisfied +"calories" : 0, // Hunger satisfied (in kcal) +"nutrition" : 0, // Hunger satisfied (OBSOLETE) "tool" : "apparatus", // Tool required to be eaten/drank "charges" : 4, // Number of uses when spawned "stack_size" : 8, // (Optional) How many uses are in the above-defined volume. If omitted, is the same as 'charges' "fun" : 50 // Morale effects when used +"freezing_point": 32, // (Optional) Temperature in F at which item freezes, default is water (32F/0C) ``` ### Containers @@ -2050,3 +2054,43 @@ The internal ID of the mutation. Can be provided as a single string, or an array (integer) The ordering value of the mutation overlay. Values range from 0 - 9999, 9999 being the topmost drawn layer. Mutations that are not in any list will default to 9999. + +# MOD tileset + +MOD tileset defines additional sprite sheets. It is specified as JSON object with `type` member set to `mod_tileset`. + +Example: +```JSON +[ + { + "type": "mod_tileset", + "compatibility": [ "MshockXottoplus" ], + "tiles-new": [ + { + "file": "test_tile.png", + "tiles": [ + { + "id": "player_female", + "fg": 1, + "bg": 0 + }, + { + "id": "player_male", + "fg": 2, + "bg": 0 + } + ] + } + ] + } +] +``` + +## `compatibility` +(string) + +The internal ID of the compatible tilesets. MOD tileset is only applied when base tileset's ID exists in this field. + +## `tiles-new` + +Setting of sprite sheets. Same as `tiles-new` field in `tile_config`. Sprite files are loaded from the same folder json file exists. diff --git a/doc/REGION_SETTINGS.md b/doc/REGION_SETTINGS.md index 87b818de5037a..7e52216327e61 100644 --- a/doc/REGION_SETTINGS.md +++ b/doc/REGION_SETTINGS.md @@ -87,6 +87,128 @@ cover the `field` overmap terrain. } ``` +## Forest Map Generation Settings + +The **forest_mapgen_settings** section defines the attributes used in generating forest (`forest`, +`forest_thick`, `forest_water`) terrains, including their items, groundcover, terrain and +furniture. + +### General Structure + +At the top level, the `forest_mapgen_settings` is a collection of named configurations where each +entry has the name of the overmap terrain that it applies to, e.g. `forest`, `forest_thick`, +`forest_water`. It is possible to define settings for overmap terrrains that are not rendered by +the forest mapgen, but will be used when blending forest terrains with other terrain types. + +```json +{ + "forest_mapgen_settings": { + "forest": {}, + "forest_thick": {}, + "forest_water": {} + } +} +``` + +Each terrain then has an independent set of configuration values that control the mapgen. + +### Fields + +| Identifier | Description | +| ----------------------------- | ---------------------------------------------------------------------------- | +| `sparseness_adjacency_factor` | Value relative to neighbors controls how sparse the overmap terrain will be. | +| `item_group` | Item group used to place items randomly within the overmap terrain. | +| `item_group_chance` | % chance, between 1 and 100, that an item will be placed. | +| `item_spawn_iterations` | Number of times that the item spawning will be called. | +| `clear_groundcover` | Clear all previously defined `groundcover` for this overmap terrain. | +| `groundcover` | Weighted list of terrains used for base groundcover. | +| `clear_components` | Clear all previously defined `components` for this overmap terrain. | +| `components` | Collection of components that make up the terrains and furniture placed. | + +### Example + +```json +{ + "forest": { + "sparseness_adjacency_factor": 3, + "item_group": "forest", + "item_group_chance": 60, + "item_spawn_iterations": 1, + "clear_groundcover": false, + "groundcover": { + "t_grass": 3, + "t_dirt": 1 + }, + "clear_components": false, + "components": {} + } +} +``` + +### Components + +The components are a collection of named objects with a sequence, chance, and set of types that, +during mapgen, are rolled in sequence to pick a feature to be placed at a given location. The names +for the components are only relevant for the purposes of overriding them in region overlays. + +### Fields + +| Identifier | Description | +| ------------- | -------------------------------------------------------------------- | +| `sequence` | Sequence in which components are processed. | +| `chance` | One in X chance that something from this component will be placed. | +| `clear_types` | Clear all previously defined `types` for this component. | +| `types` | Weighted list of terrains and furniture that make up this component. | + +### Example + +```json +{ + "trees": { + "sequence": 0, + "chance": 12, + "clear_types": false, + "types": { + "t_tree_young": 128, + "t_tree": 32, + "t_tree_birch": 32, + "t_tree_pine": 32, + "t_tree_maple": 32, + "t_tree_willow": 32, + "t_tree_hickory": 32, + "t_tree_blackjack": 8, + "t_tree_coffee": 8, + "t_tree_apple": 2, + "t_tree_apricot": 2, + "t_tree_cherry": 2, + "t_tree_peach": 2, + "t_tree_pear": 2, + "t_tree_plum": 2, + "t_tree_deadpine": 1, + "t_tree_hickory_dead": 1, + "t_tree_dead": 1 + } + }, + "shrubs_and_flowers": { + "sequence": 1, + "chance": 10, + "clear_types": false, + "types": { + "t_underbrush": 8, + "t_shrub_blueberry": 1, + "t_shrub_strawberry": 1, + "t_shrub": 1, + "f_chamomile": 1, + "f_dandelion": 1, + "f_datura": 1, + "f_dahlia": 1, + "f_bluebell": 1, + "f_mutpoppy": 1 + } + } +} +``` + ## City The **city** section defines the possible overmap terrains and specials that may be used as diff --git a/doc/sample_mods/lua_test_activity/main.lua b/doc/sample_mods/lua_test_activity/main.lua new file mode 100644 index 0000000000000..e0308cd80cd03 --- /dev/null +++ b/doc/sample_mods/lua_test_activity/main.lua @@ -0,0 +1,16 @@ +local MOD = {} +mods["lua_test_activity"] = MOD + +function message(...) + local s = string.format(...) + game.add_msg(s) +end + +function MOD.on_minute_passed() + local act = player.activity + if not act:is_null() then + -- Show your current activity + message("activity_id: %s", act:id():str()) + message("moves_left: %d", act.moves_left) + end +end diff --git a/doc/sample_mods/lua_test_activity/modinfo.json b/doc/sample_mods/lua_test_activity/modinfo.json new file mode 100644 index 0000000000000..e18e85f4db4fa --- /dev/null +++ b/doc/sample_mods/lua_test_activity/modinfo.json @@ -0,0 +1,10 @@ +[ + { + "type": "MOD_INFO", + "ident": "lua_test_activity", + "name": "Lua sample code: Player activity", + "description": "Sample code of player activity.", + "category": "content", + "dependencies": ["dda"] + } +] diff --git a/doc/sample_mods/lua_test_bionics/actions.json b/doc/sample_mods/lua_test_bionics/actions.json new file mode 100644 index 0000000000000..6ebbf5c40d91d --- /dev/null +++ b/doc/sample_mods/lua_test_bionics/actions.json @@ -0,0 +1,7 @@ +[ + { + "type": "item_action", + "id": "TEST_BIONICS_LIST", + "name": "Show your bionics" + } +] diff --git a/doc/sample_mods/lua_test_bionics/items.json b/doc/sample_mods/lua_test_bionics/items.json new file mode 100644 index 0000000000000..099d51f07418d --- /dev/null +++ b/doc/sample_mods/lua_test_bionics/items.json @@ -0,0 +1,12 @@ +[ + { + "id": "test_bionics_list", + "type": "TOOL", + "symbol": "?", + "color": "white", + "name": "Bionics List(LUA)", + "description": "Show your bionics list.", + "material": ["plastic"], + "use_action": ["TEST_BIONICS_LIST"] + } +] diff --git a/doc/sample_mods/lua_test_bionics/modinfo.json b/doc/sample_mods/lua_test_bionics/modinfo.json new file mode 100644 index 0000000000000..a35aba55eabd4 --- /dev/null +++ b/doc/sample_mods/lua_test_bionics/modinfo.json @@ -0,0 +1,10 @@ +[ + { + "type": "MOD_INFO", + "ident": "lua_test_bionics", + "name": "Lua sample code: Bionics", + "description": "Sample code of bionics related functions.", + "category": "content", + "dependencies": ["dda"] + } +] diff --git a/doc/sample_mods/lua_test_bionics/preload.lua b/doc/sample_mods/lua_test_bionics/preload.lua new file mode 100644 index 0000000000000..89dc85ac95367 --- /dev/null +++ b/doc/sample_mods/lua_test_bionics/preload.lua @@ -0,0 +1,27 @@ +function message(...) + local s = string.format(...) + game.add_msg(s) +end + +function iuse_test_bionics_list() + local num = player:num_bionics() + if num == 0 then + message("You installed no bionics.") + else + local i = 0 + while i < num do + -- Get bionic reference + local bio = player:bionic_at_index(i) + -- Get bionic_data reference (use obj() function of bionic_id class) + local bio_data = bio.id:obj() + local color = "white" + if bio_data.activated then + color = "green" + end + message("bionics[%d]: %s", i, color, bio_data.name) + i = i + 1 + end + end +end + +game.register_iuse("TEST_BIONICS_LIST", iuse_test_bionics_list) diff --git a/doc/sample_mods/lua_test_morale/actions.json b/doc/sample_mods/lua_test_morale/actions.json new file mode 100644 index 0000000000000..924aea388f142 --- /dev/null +++ b/doc/sample_mods/lua_test_morale/actions.json @@ -0,0 +1,7 @@ +[ + { + "type": "item_action", + "id": "TEST_GAIN_MORALE", + "name": "Gain morale! (+100)" + } +] diff --git a/doc/sample_mods/lua_test_morale/items.json b/doc/sample_mods/lua_test_morale/items.json new file mode 100644 index 0000000000000..bdbd62bf7e7c7 --- /dev/null +++ b/doc/sample_mods/lua_test_morale/items.json @@ -0,0 +1,12 @@ +[ + { + "id": "test_gain_morale", + "type": "TOOL", + "symbol": "?", + "color": "white", + "name": "Gain morale(LUA)", + "description": "You gain big morale boost.", + "material": ["plastic"], + "use_action": ["TEST_GAIN_MORALE"] + } +] diff --git a/doc/sample_mods/lua_test_morale/modinfo.json b/doc/sample_mods/lua_test_morale/modinfo.json new file mode 100644 index 0000000000000..430c98c61b899 --- /dev/null +++ b/doc/sample_mods/lua_test_morale/modinfo.json @@ -0,0 +1,10 @@ +[ + { + "type": "MOD_INFO", + "ident": "lua_test_morale", + "name": "Lua sample code: Morale", + "description": "Sample code of morale related functions.", + "category": "content", + "dependencies": ["dda"] + } +] diff --git a/doc/sample_mods/lua_test_morale/morales.json b/doc/sample_mods/lua_test_morale/morales.json new file mode 100644 index 0000000000000..1cd382997f13b --- /dev/null +++ b/doc/sample_mods/lua_test_morale/morales.json @@ -0,0 +1,7 @@ +[ + { + "id": "morale_test", + "type": "morale_type", + "text": "Gain big morale boost!" + } +] diff --git a/doc/sample_mods/lua_test_morale/preload.lua b/doc/sample_mods/lua_test_morale/preload.lua new file mode 100644 index 0000000000000..aeeeaf09c7f30 --- /dev/null +++ b/doc/sample_mods/lua_test_morale/preload.lua @@ -0,0 +1,34 @@ +function message(...) + local s = string.format(...) + game.add_msg(s) +end + +function iuse_test_gain_morale() + -- Create select menu + local um = game.create_uimenu() + um.title = "Gain morale menu" + um:addentry("Gain morale") + um:addentry("Remove morale") + um:addentry("Cancel") + -- Wait for player selection + um:query(true) + + if um.selected == 0 then + -- "Gain morale" is selected + if player:has_morale(morale_type("morale_test")) == 0 then + -- Add morale boost (+100/10 min.) + player:add_morale(morale_type("morale_test"), 100, 100, MINUTES(10)) + message("You gained big morale boost!") + else + message("You already gained morale boost.") + end + elseif um.selected == 1 then + -- "Remove morale" is selected + player:rem_morale(morale_type("morale_test")) + message("Your morale boost is finished.") + end + + return 0 +end + +game.register_iuse("TEST_GAIN_MORALE", iuse_test_gain_morale) diff --git a/doc/sample_mods/lua_test_npc/actions.json b/doc/sample_mods/lua_test_npc/actions.json new file mode 100644 index 0000000000000..1cf1a9ee8b603 --- /dev/null +++ b/doc/sample_mods/lua_test_npc/actions.json @@ -0,0 +1,7 @@ +[ + { + "type": "item_action", + "id": "TEST_NPC", + "name": "Test NPC function" + } +] diff --git a/doc/sample_mods/lua_test_npc/items.json b/doc/sample_mods/lua_test_npc/items.json new file mode 100644 index 0000000000000..d7493cf8eff8b --- /dev/null +++ b/doc/sample_mods/lua_test_npc/items.json @@ -0,0 +1,12 @@ +[ + { + "id": "test_npc", + "type": "TOOL", + "symbol": "?", + "color": "white", + "name": "NPC test(LUA)", + "description": "You check NPC's opinion.", + "material": ["plastic"], + "use_action": ["TEST_NPC"] + } +] diff --git a/doc/sample_mods/lua_test_npc/modinfo.json b/doc/sample_mods/lua_test_npc/modinfo.json new file mode 100644 index 0000000000000..183659185377c --- /dev/null +++ b/doc/sample_mods/lua_test_npc/modinfo.json @@ -0,0 +1,12 @@ +[ + { + "type": "MOD_INFO", + "ident": "lua_test_npc", + "name": "Lua sample code: NPC", + "authors": [ "LISP" ], + "maintainers": [ "LISP" ], + "description": "Sample code of NPC related functions.", + "category": "misc_additions", + "dependencies": [ "dda" ] + } +] diff --git a/doc/sample_mods/lua_test_npc/preload.lua b/doc/sample_mods/lua_test_npc/preload.lua new file mode 100644 index 0000000000000..733ad622884a7 --- /dev/null +++ b/doc/sample_mods/lua_test_npc/preload.lua @@ -0,0 +1,76 @@ +function message(...) + local s = string.format(...) + game.add_msg(s) +end + +function iuse_test_npc(item, active) + local um + local feature + + -- Create select menu + um = game.create_uimenu() + um.title = "What do you do?" + um:addentry("Check NPC's opinion") + um:addentry("Make NPC angry") + um:addentry("Make NPC your follower") + um:addentry("Cancel") + -- Wait for player selection + um:query(true) + + if um.selected == 3 then + -- Canceled + return 0 + end + feature = um.selected + + local p = player:pos() + local delta_x + local delta_y + local npc_num = 0 + local npcs = {} + local npc + + -- Create select menu + um = game.create_uimenu() + um.title = "Select NPC" + -- Search NPCs around you + for delta_x = -1, 1 do + for delta_y = -1, 1 do + local tp = tripoint(p.x + delta_x, p.y + delta_y, p.z) + npc = game.get_npc_at(tp) + if npc then + um:addentry(npc:get_name()) + table.insert(npcs, npc) + npc_num = npc_num + 1 + end + end + end + um:addentry("Cancel") + -- Wait for player selection + um:query(true) + + if um.selected == npc_num then + -- Canceled + return 0 + end + + local target = npcs[um.selected + 1] + if feature == 0 then + local opinion = target.op_of_u + message("Trust: %d", opinion.trust) + message("Fear: %d", opinion.fear) + message("Value: %d", opinion.value) + message("Anger: %d", opinion.anger) + message("Owed: %d", opinion.owed) + elseif feature == 1 then + target:make_angry() + message("%s gets angry!", target:disp_name()) + elseif feature == 2 then + target:set_attitude("NPCATT_FOLLOW") + message("%s is your follower now.", target:disp_name()) + end + + return 0 +end + +game.register_iuse("TEST_NPC", iuse_test_npc) diff --git a/json_blacklist b/json_blacklist index 6e34427d40d87..5284c82d809dd 100644 --- a/json_blacklist +++ b/json_blacklist @@ -109,11 +109,14 @@ data/json/mapgen/house/house11.json data/json/mapgen/house/house14.json data/json/mapgen/lab/lab_central.json data/json/mapgen/lab/lab_common.json +data/json/mapgen/lab/lab_escape.json data/json/mapgen/lab/lab_floorplan_cross.json data/json/mapgen/lab/lab_floorplans_1side.json +data/json/mapgen/lab/lab_floorplans_escape.json data/json/mapgen/lab/lab_floorplans_finale1level.json data/json/mapgen/lab/lab_floorplans.json data/json/mapgen/lab/lab_rooms.json +data/json/mapgen/lab/lab_rooms_wall.json data/json/mapgen/lab/lab_trains.json data/json/mapgen/laundromat.json data/json/mapgen/mall.json diff --git a/lang/extract_json_strings.py b/lang/extract_json_strings.py index d0f36105cce0a..496845b2b8f5f 100755 --- a/lang/extract_json_strings.py +++ b/lang/extract_json_strings.py @@ -79,6 +79,7 @@ def warning_supressed(filename): "MONSTER_FACTION", "monstergroup", "MONSTER_WHITELIST", + "mutation_type", "overlay_order", "overmap_connection", "overmap_location", diff --git a/lang/po/cataclysm-dda.pot b/lang/po/cataclysm-dda.pot index 610ef96edb2f9..10ee81d28a7e4 100644 --- a/lang/po/cataclysm-dda.pot +++ b/lang/po/cataclysm-dda.pot @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-07 09:39+0800\n" +"POT-Creation-Date: 2018-09-15 00:02+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -93,7 +93,7 @@ msgstr "" msgid "World Defaults" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Android" msgstr "" @@ -561,10 +561,12 @@ msgstr "" #. ~ sidebar position #: lang/extra/android/options.cpp src/options.cpp +#: src/options.cpp msgid "Left" msgstr "" #: lang/extra/android/options.cpp src/options.cpp +#: src/options.cpp msgid "Right" msgstr "" @@ -1210,7 +1212,7 @@ msgstr "" msgid "Season length" msgstr "" -#: lang/extra/android/options.cpp src/options.cpp +#: lang/extra/android/options.cpp msgid "Season length, in days." msgstr "" @@ -1363,42 +1365,42 @@ msgstr "" msgid "If true, skips the Android welcome screen on app load." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Quicksave on app lose focus" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, quicksave whenever the app loses focus (screen locked, app moved " "into background etc.) WARNING: Experimental. This may result in corrupt save " "games." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Auto-manage virtual keyboard" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, automatically show/hide the virtual keyboard when necessary based " "on context. If false, virtual keyboard must be toggled manually." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual keyboard screen scale" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "When the virtual keyboard is visible, scale the screen to prevent " "overlapping. Useful for text entry so you can see what you're typing." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Vibration duration" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If non-zero, vibrate the device for this long on input, in millisconds. " "Ignored if hardware keyboard connected." @@ -1430,358 +1432,358 @@ msgid "" "specific orientation." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Show virtual joystick" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, show the virtual joystick when touching and holding the screen. " "Gives a visual indicator of deadzone and stick deflection." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick opacity" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The opacity of the on-screen virtual joystick, as a percentage." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick deadzone size" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "While using the virtual joystick, deflecting the stick beyond this distance " "will trigger directional input. Specified as a percentage of longest screen " "edge." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick size" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "While using the virtual joystick, deflecting the stick by this much will " "repeat input at the deflected rate (see below). Specified as a percentage of " "longest screen edge." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick follows finger" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, the virtual joystick will follow when sliding beyond its range." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick repeat rate (centered)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "When the virtual joystick is centered, how fast should input events repeat, " "in milliseconds." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick repeat rate (deflected)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "When the virtual joystick is fully deflected, how fast should input events " "repeat, in milliseconds." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick repeat rate sensitivity" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "As the virtual joystick moves from centered to fully deflected, this value " "is an exponent that controls the blend between the two repeat rates defined " "above. 1.0 = linear." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Input repeat delay" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "While touching the screen, wait this long before showing the virtual " "joystick and repeating input, in milliseconds. Also used to determine tap/" "double-tap detection, flick detection and toggling quick shortcuts." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Virtual joystick hides shortcuts" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, hides on-screen keyboard shortcuts while using the virtual " "joystick. Helps keep the view uncluttered while travelling long distances " "and navigating menus." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Default gameplay shortcuts" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "The default set of gameplay shortcuts to show. Used on starting a new game " "and whenever all gameplay shortcuts are removed." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Add shortcuts for action menu selections" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, automatically add a shortcut for actions selected via the in-game " "action menu." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Add shortcuts for inventory selections" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, automatically add a shortcut for items selected via the inventory." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Tap key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when tapping during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Two-finger tap key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when tapping with two fingers during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Two-finger swipe up key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when swiping up with two fingers during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Two-finger swipe down key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when swiping down with two fingers during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Two-finger swipe left key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when swiping left with two fingers during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Two-finger swipe right key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when swiping right with two fingers during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Pinch in key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when pinching in during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Pinch out key (in-game)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The key to press when pinching out during gameplay." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Auto-manage contextual gameplay shortcuts" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, contextual in-game shortcuts are added and removed automatically as " "needed: examine, close, butcher, move up/down, control vehicle, pickup, " "toggle enemy + safe mode, sleep." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Move contextual gameplay shortcuts to front" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If the above option is enabled, specifies whether contextual in-game " "shortcuts will be added to the front or back of the shortcuts list. True " "makes them easier to reach, False reduces shuffling of shortcut positions." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Move used shortcuts to front" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, using an existing shortcut will always move it to the front of the " "shortcuts list. If false, only shortcuts typed via keyboard will move to the " "front." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Separate shortcuts for No Auto Pickup zones" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, separate gameplay shortcuts will be used within No Auto Pickup " "zones. Useful for keeping home base actions separate from exploring actions." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Turns to remove unused gameplay shortcuts" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If non-zero, unused gameplay shortcuts will be removed after this many turns " "(as in discrete player actions, not world calendar turns)." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcuts persistence" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, shortcuts are saved/restored with each save game. If false, " "shortcuts reset between sessions." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcuts position" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "Switch between shortcuts on the left or on the right side of the screen." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcuts screen percentage" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "How much of the screen can shortcuts occupy, as a percentage of total screen " "width." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcuts overlap screen" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "If true, shortcuts will be drawn transparently overlapping the game screen. " "If false, the game screen size will be reduced to fit the shortcuts below." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut opacity (background)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "The background opacity of on-screen keyboard shortcuts, as a percentage." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut opacity (shadow)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The shadow opacity of on-screen keyboard shortcuts, as a percentage." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut opacity (text)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "The foreground opacity of on-screen keyboard shortcuts, as a percentage." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut color" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The color of on-screen keyboard shortcuts." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut border" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The border of each on-screen keyboard shortcut in pixels. ." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut width (min)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "" "The minimum width of each on-screen keyboard shortcut in pixels. Only " "relevant when lots of shortcuts are visible at once." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut width (max)" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The maximum width of each on-screen keyboard shortcut in pixels." msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "Shortcut height" msgstr "" -#: lang/extra/android/options.cpp +#: lang/extra/android/options.cpp src/options.cpp msgid "The height of each on-screen keyboard shortcut in pixels." msgstr "" @@ -6798,7 +6800,7 @@ msgstr[1] "" msgid "A barrette with lots of ornaments." msgstr "" -#: lang/json/ARMOR_from_json.py lang/json/CONTAINER_from_json.py +#: lang/json/ARMOR_from_json.py msgid "laundry basket" msgid_plural "laundry baskets" msgstr[0] "" @@ -12580,6 +12582,7 @@ msgstr[1] "" #. ~ Use action holster_msg for MBR vest (Kevlar plates). #. ~ Use action holster_msg for MBR vest (steel plating). #. ~ Use action holster_msg for MBR vest (superalloy). +#. ~ Use action holster_msg for large grenade pouch. #: lang/json/ARMOR_from_json.py #, no-python-format msgid "You stash your %s." @@ -12862,6 +12865,22 @@ msgid "" "your belt or other webbing." msgstr "" +#: lang/json/ARMOR_from_json.py +msgid "large grenade pouch" +msgid_plural "large grenade pouches" +msgstr[0] "" +msgstr[1] "" + +#. ~ Use action holster_prompt for large grenade pouch. +#: lang/json/ARMOR_from_json.py +msgid "Stash grenades" +msgstr "" + +#. ~ Description for large grenade pouch +#: lang/json/ARMOR_from_json.py +msgid "A pouch for holding up to four full-sized grenades of various types." +msgstr "" + #: lang/json/ARMOR_from_json.py msgid "pair of cord sandals" msgid_plural "pairs of cord sandals" @@ -14399,8 +14418,7 @@ msgstr[0] "" msgstr[1] "" #. ~ Description for Oxygenator CBM -#. ~ Description for Oxygenator -#: lang/json/BIONIC_ITEM_from_json.py lang/json/bionic_from_json.py +#: lang/json/BIONIC_ITEM_from_json.py msgid "" "A complex oxygen delivery system. Improves the ability to extract oxygen " "from air and allows extracting it from water. Will automatically turn on " @@ -15151,6 +15169,35 @@ msgid "" "water. You must, however, have a container to store the water in." msgstr "" +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Intravenous Needletip CBM" +msgid_plural "Intravenous Needletip CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Intravenous Needletip CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A small tube with a retractable needle, that terminates in a net of tiny " +"hoses instead of a plunger. Installed, it allows you to draw substances " +"directly into your bloodstream through the needle without needing to carry a " +"syringe." +msgstr "" + +#: lang/json/BIONIC_ITEM_from_json.py +msgid "Titanium Skeletal Bracing CBM" +msgid_plural "Titanium Skeletal Bracing CBMs" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for Titanium Skeletal Bracing CBM +#: lang/json/BIONIC_ITEM_from_json.py +msgid "" +"A set of hinges, springs, and other synthetic augments for the skeletal " +"structure. These artificial enhancers strengthen the knees and elbows, " +"allowing you to carry more weight." +msgstr "" + #: lang/json/BIONIC_ITEM_from_json.py msgid "Kinetic Shock Absorbers CBM" msgid_plural "Kinetic Shock Absorbers CBMs" @@ -17564,9 +17611,9 @@ msgstr[1] "" #. ~ Description for Dungeon Master's Guide: 6th Edition #: lang/json/BOOK_from_json.py msgid "" -"A thick, hardcover volume with everything needed to weave legendary stories. " -"It's full of information, but finding the things you're looking for can be a " -"chore." +"A thick, hardcover volume with everything needed to weave legendary " +"stories. It's full of information, but finding the things you're looking " +"for can be a chore." msgstr "" #: lang/json/BOOK_from_json.py @@ -20390,6 +20437,152 @@ msgid "" "using radiation, so it's safe to eat." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "cranberry" +msgid_plural "cranberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for cranberry +#: lang/json/COMESTIBLE_from_json.py +msgid "Sour red berries. Good for your health." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "irradiated cranberry" +msgid_plural "irradiated cranberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for irradiated cranberry +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An irradiated cranberry will remain edible nearly forever. Sterilized using " +"radiation, so it's safe to eat." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "raspberry" +msgid_plural "raspberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for raspberry +#: lang/json/COMESTIBLE_from_json.py +msgid "A sweet red berry." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "irradiated raspberry" +msgid_plural "irradiated raspberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for irradiated raspberry +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An irradiated raspberry will remain edible nearly forever. Sterilized using " +"radiation, so it's safe to eat." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "huckleberry" +msgid_plural "huckleberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for huckleberry +#: lang/json/COMESTIBLE_from_json.py +msgid "Huckleberries, often times confused for blueberries." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "irradiated huckleberry" +msgid_plural "irradiated huckleberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for irradiated huckleberry +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An irradiated huckleberry will remain edible nearly forever. Sterilized " +"using radiation, so it's safe to eat." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "mulberry" +msgid_plural "mulberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for mulberry +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"Mulberries, this red variety is unique to east North America and is " +"described to have the strongest flavor of any variety in the world." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "irradiated mulberry" +msgid_plural "irradiated mulberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for irradiated mulberry +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An irradiated mulberry will remain edible nearly forever. Sterilized using " +"radiation, so it's safe to eat." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "elderberry" +msgid_plural "elderberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for elderberry +#: lang/json/COMESTIBLE_from_json.py +msgid "Elderberries, toxic when eaten raw but great when cooked." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "irradiated elderberry" +msgid_plural "irradiated elderberries" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for irradiated elderberry +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An irradiated elderberry will remain edible nearly forever. Sterilized " +"using radiation, so it's safe to eat." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "rose hip" +msgid_plural "rose hips" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for rose hip +#: lang/json/COMESTIBLE_from_json.py +msgid "The fruit of a pollinated rose flower." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "irradiated rose hips" +msgid_plural "irradiated rose hips" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for irradiated rose hips +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An irradiated rose hips will remain edible nearly forever. Sterilized using " +"radiation, so it's safe to eat." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "juice pulp" msgstr "" @@ -22733,7 +22926,7 @@ msgstr[1] "" #. ~ Description for grape #: lang/json/COMESTIBLE_from_json.py -msgid "A cluster of seedless grapes." +msgid "A cluster of juicy grapes." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -22813,30 +23006,6 @@ msgid "" "radiation, so it's safe to eat." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "cranberry" -msgid_plural "cranberries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for cranberry -#: lang/json/COMESTIBLE_from_json.py -msgid "Sour red berries. Good for your health." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "irradiated cranberry" -msgid_plural "irradiated cranberries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for irradiated cranberry -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"An irradiated cranberry will remain edible nearly forever. Sterilized using " -"radiation, so it's safe to eat." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py msgid "fast-food French fries" msgid_plural "fast-food French fries" @@ -22933,30 +23102,6 @@ msgid "" "radiation, so it's safe to eat." msgstr "" -#: lang/json/COMESTIBLE_from_json.py -msgid "raspberry" -msgid_plural "raspberries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for raspberry -#: lang/json/COMESTIBLE_from_json.py -msgid "A sweet red berry." -msgstr "" - -#: lang/json/COMESTIBLE_from_json.py -msgid "irradiated raspberry" -msgid_plural "irradiated raspberries" -msgstr[0] "" -msgstr[1] "" - -#. ~ Description for irradiated raspberry -#: lang/json/COMESTIBLE_from_json.py -msgid "" -"An irradiated raspberry will remain edible nearly forever. Sterilized using " -"radiation, so it's safe to eat." -msgstr "" - #: lang/json/COMESTIBLE_from_json.py msgid "malted milk ball" msgstr "" @@ -25868,6 +26013,17 @@ msgid "" "A super-concentrated stem cell treatment. You need a syringe to inject it." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "purifier smart shot" +msgstr "" + +#. ~ Description for purifier smart shot +#: lang/json/COMESTIBLE_from_json.py +msgid "" +"An experimental stem cell treatment, offering limited control over which " +"mutations are purified. The liquid sloshes strangely inside of this syringe." +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "soylent green drink" msgid_plural "soylent green drinks" @@ -25983,6 +26139,21 @@ msgstr[1] "" msgid "Some mushroom spores. You could probably plant these." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "hop rhizomes" +msgid_plural "hop rhizomes" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hop rhizomes +#: lang/json/COMESTIBLE_from_json.py +msgid "Roots of a hop plant, for growing your own." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "hops" +msgstr "" + #: lang/json/COMESTIBLE_from_json.py msgid "blackberry seeds" msgid_plural "blackberry seeds" @@ -26017,18 +26188,36 @@ msgid "Some cranberry seeds." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "hop rhizomes" -msgid_plural "hop rhizomes" +msgid "huckleberry seeds" +msgid_plural "huckleberry seeds" msgstr[0] "" msgstr[1] "" -#. ~ Description for hop rhizomes +#. ~ Description for huckleberry seeds #: lang/json/COMESTIBLE_from_json.py -msgid "Roots of a hop plant, for growing your own." +msgid "Some huckleberry seeds." msgstr "" #: lang/json/COMESTIBLE_from_json.py -msgid "hops" +msgid "mulberry seeds" +msgid_plural "mulberry seeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for mulberry seeds +#: lang/json/COMESTIBLE_from_json.py +msgid "Some mulberry seeds." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "elderberry seeds" +msgid_plural "elderberry seeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for elderberry seeds +#: lang/json/COMESTIBLE_from_json.py +msgid "Some elderberry seeds." msgstr "" #: lang/json/COMESTIBLE_from_json.py @@ -26053,6 +26242,34 @@ msgstr[1] "" msgid "Some strawberry seeds." msgstr "" +#: lang/json/COMESTIBLE_from_json.py +msgid "grape seeds" +msgid_plural "grape seeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for grape seeds +#: lang/json/COMESTIBLE_from_json.py +msgid "Some grape seeds." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py +msgid "rose seeds" +msgid_plural "rose seeds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for rose seeds +#: lang/json/COMESTIBLE_from_json.py +msgid "Some rose seeds." +msgstr "" + +#: lang/json/COMESTIBLE_from_json.py lang/json/GENERIC_from_json.py +msgid "rose" +msgid_plural "roses" +msgstr[0] "" +msgstr[1] "" + #: lang/json/COMESTIBLE_from_json.py msgid "tobacco seeds" msgid_plural "tobacco seeds" @@ -27865,11 +28082,6 @@ msgstr[1] "" msgid "Just a piece of butcher's paper. Good for starting fires." msgstr "" -#. ~ Description for laundry basket -#: lang/json/CONTAINER_from_json.py -msgid "A pastic basket meant for storing and hauling clothing." -msgstr "" - #: lang/json/CONTAINER_from_json.py msgid "styrofoam cup" msgid_plural "styrofoam cups" @@ -28127,7 +28339,7 @@ msgstr "" #: lang/json/ENGINE_from_json.py msgid "" "A small, primitive, steam engine. An integrated boiler burns coal to heat " -"water into steam, driving a reciprocating shaft. A condensor recaptures the " +"water into steam, driving a reciprocating shaft. A condenser recaptures the " "water, making this a closed cycle system." msgstr "" @@ -28139,7 +28351,7 @@ msgstr "" #: lang/json/ENGINE_from_json.py msgid "" "A small steam engine. An integrated boiler burns coal to heat water into " -"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"steam, driving a reciprocating shaft. A condenser recaptures the water, " "making this a closed cycle system." msgstr "" @@ -28151,7 +28363,7 @@ msgstr "" #: lang/json/ENGINE_from_json.py msgid "" "A medium sized steam engine. An integrated boiler burns coal to heat water " -"into steam, driving a reciprocating shaft. A condensor recaptures the " +"into steam, driving a reciprocating shaft. A condenser recaptures the " "water, making this a closed cycle system." msgstr "" @@ -29886,6 +30098,93 @@ msgstr[1] "" msgid "A dahlia bud. Contains some substances commonly produced by a dahlia." msgstr "" +#. ~ Description for rose +#: lang/json/GENERIC_from_json.py +msgid "A rose stalk with some petals." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "rose bud" +msgid_plural "rose buds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for rose bud +#: lang/json/GENERIC_from_json.py +msgid "" +"A rose bud. Contains some substances commonly produced by a rose flower." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "hydrangea" +msgid_plural "hydrangeas" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hydrangea +#: lang/json/GENERIC_from_json.py +msgid "A hydrangea stalk with some petals." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "hydrangea bud" +msgid_plural "hydrangea buds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for hydrangea bud +#: lang/json/GENERIC_from_json.py +msgid "" +"A hydrangea bud. Contains some substances commonly produced by a hydrangea " +"flower." +msgstr "" + +#: lang/json/GENERIC_from_json.py lang/json/furniture_from_json.py +msgid "tulip" +msgid_plural "tulips" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for tulip +#: lang/json/GENERIC_from_json.py +msgid "A tulip stalk with some petals." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "tulip bud" +msgid_plural "tulip buds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for tulip bud +#: lang/json/GENERIC_from_json.py +msgid "" +"A tulip bud. Contains some substances commonly produced by a tulip flower." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "spurge" +msgid_plural "spurges" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for spurge +#: lang/json/GENERIC_from_json.py +msgid "A spurge stalk with some petals." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "spurge bud" +msgid_plural "spurge buds" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for spurge bud +#: lang/json/GENERIC_from_json.py +msgid "" +"A spurge bud. Contains some substances commonly produced by a spurge flower." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "lump of clay" msgid_plural "lumps of clay" @@ -30251,6 +30550,28 @@ msgstr[1] "" msgid "A rather outdated light bulb used in all sorts of light equipment." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "clay flower pot" +msgid_plural "clay flower pots" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for clay flower pot +#: lang/json/GENERIC_from_json.py +msgid "A nice looking clay pot used for planting." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "plastic flower pot" +msgid_plural "plastic flower pots" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for plastic flower pot +#: lang/json/GENERIC_from_json.py +msgid "A cheap plastic pot used for planting." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "canister grenade" msgid_plural "canister grenades" @@ -31803,6 +32124,28 @@ msgstr[1] "" msgid "Medical data on zombie blood." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "lab data" +msgid_plural "lab data" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for lab data +#: lang/json/GENERIC_from_json.py +msgid "Research archives from a government laboratory." +msgstr "" + +#: lang/json/GENERIC_from_json.py +msgid "train data" +msgid_plural "train data" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for train data +#: lang/json/GENERIC_from_json.py +msgid "Logistical data on subterranean train routes and schedules." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "atomic coffee maker" msgid_plural "atomic coffee makers" @@ -34524,6 +34867,33 @@ msgstr[1] "" msgid "A large and heavy jagged metal disc to dig trenches." msgstr "" +#: lang/json/GENERIC_from_json.py +msgid "airjack" +msgid_plural "airjacks" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for airjack +#. ~ Description for air jack system +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "" +"An extendable metal pylon used to replace a portable jack. If mounted to a " +"vehicle, it could be used to lift it up." +msgstr "" + +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "motorcycle kickstand" +msgid_plural "motorcycle kickstands" +msgstr[0] "" +msgstr[1] "" + +#. ~ Description for motorcycle kickstand +#: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py +msgid "" +"A kickstand to keep the bike from falling over. You could use this to lean " +"it forward or backward to change a tire." +msgstr "" + #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "shredder" msgid_plural "shredders" @@ -38887,16 +39257,15 @@ msgid "A mass of spores the size of a balled fist, wafting around in the air." msgstr "" #: lang/json/MONSTER_from_json.py -msgid "tank drone" +msgid "Beagle Mini-Tank UGV" msgstr "" -#. ~ Description for tank drone +#. ~ Description for Beagle Mini-Tank UGV #: lang/json/MONSTER_from_json.py msgid "" -"The Northrup Emancipator is the first and only automated tank ever produced, " -"made shortly after the split-up of Northrup Grumman. Clad in depleted " -"uranium plating, and armed with advanced munitions and a 120-mm gun, it is " -"capable of delivering extraordinary firepower." +"The Northrup Beagle is a refrigerator-sized urban warfare UGV. Sporting an " +"anti-tank missile launcher, 40mm grenade launcher, and numerous anti-" +"infantry weapons, it's designed for high-risk urban fighting." msgstr "" #: lang/json/MONSTER_from_json.py @@ -51676,6 +52045,15 @@ msgstr "" msgid "Oxygenator" msgstr "" +#. ~ Description for Oxygenator +#: lang/json/bionic_from_json.py +msgid "" +"A complex oxygen delivery system. Improves the ability to extract oxygen " +"from air and allows extracting it from water. Will automatically turn on " +"when drowning. Turn on to recharge stamina faster, at moderate power cost. " +"Asthmatics may also use it to stop asthma attacks." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Terranian Sonar" msgstr "" @@ -52169,6 +52547,31 @@ msgid "" "water in." msgstr "" +#: lang/json/bionic_from_json.py +msgid "Intravenous Needletip" +msgstr "" + +#. ~ Description for Intravenous Needletip +#: lang/json/bionic_from_json.py +msgid "" +"The flesh of the inside of your middle finger has been replaced with a tube " +"leading into your arteries, with a retractable needle extending out of the " +"tip of the finger when clenched. This lets you pump intravenous drugs like " +"morphine directly into your bloodstream without needing to carry a syringe." +msgstr "" + +#: lang/json/bionic_from_json.py +msgid "Titanium Skeletal Bracing" +msgstr "" + +#. ~ Description for Titanium Skeletal Bracing +#: lang/json/bionic_from_json.py +msgid "" +"Titanium bracing has been installed onto your elbows, knees, and spine, " +"making them far better at handling strain. Your carrying capacity is " +"increased by 20 kilograms, or about 44 pounds." +msgstr "" + #: lang/json/bionic_from_json.py msgid "Kinetic Shock Absorbers" msgstr "" @@ -54242,7 +54645,7 @@ msgid "A laser sight is targeting you!" msgstr "" #: lang/json/effects_from_json.py lang/json/item_action_from_json.py -#: lang/json/item_action_from_json.py src/faction.cpp +#: lang/json/item_action_from_json.py msgid "Smoke" msgstr "" @@ -57100,7 +57503,7 @@ msgstr "" #. ~ Description for target #: lang/json/furniture_from_json.py -msgid "A shooting target in a rough shape of a human." +msgid "A metal shooting target in the rough shape of a human." msgstr "" #: lang/json/furniture_from_json.py @@ -57111,6 +57514,10 @@ msgstr "" msgid "chamomile" msgstr "" +#: lang/json/furniture_from_json.py +msgid "spurge flower" +msgstr "" + #: lang/json/furniture_from_json.py msgid "cattails" msgstr "" @@ -57453,7 +57860,7 @@ msgstr "" #: lang/json/furniture_from_json.py msgid "" "A large mat woven from fibrous material that can be used instead of a picnic " -"blanket, but it's more valuable as a butchery appliance. Too thin to be a " +"blanket, but it's more valuable as a butchery appliance. Too thin to be a " "comfortable sleeping place." msgstr "" @@ -63798,7 +64205,7 @@ msgid "Cut bolts or wires" msgstr "" #: lang/json/item_action_from_json.py -msgid "Heat up food" +msgid "Heat up food (with it)" msgstr "" #: lang/json/item_action_from_json.py @@ -63934,8 +64341,7 @@ msgstr "" msgid "Apply" msgstr "" -#: lang/json/item_action_from_json.py -#: lang/json/keybinding_from_json.py +#: lang/json/item_action_from_json.py lang/json/keybinding_from_json.py msgid "Eat" msgstr "" @@ -63985,6 +64391,10 @@ msgstr "" msgid "Trim the hair" msgstr "" +#: lang/json/item_action_from_json.py +msgid "Heat up food (in it)" +msgstr "" + #: lang/json/item_action_from_json.py msgid "Inhale" msgstr "" @@ -64050,7 +64460,7 @@ msgstr "" #: lang/json/item_action_from_json.py #: lang/json/item_action_from_json.py lang/json/talk_topic_from_json.py #: lang/json/talk_topic_from_json.py -#: src/game_inventory.cpp src/npctalk.cpp +#: lang/json/talk_topic_from_json.py src/game_inventory.cpp #: src/npctalk.cpp msgid "..." msgstr "" @@ -64250,7 +64660,7 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "" -"While wielded, this item allows you to mine thorough rocks and other hard " +"While wielded, this item allows you to mine through rocks and other hard " "obstacles by moving into tiles with them. Note that automatic mining option " "should be set to true for this to work." msgstr "" @@ -64424,17 +64834,10 @@ msgstr "" #: lang/json/json_flag_from_json.py msgid "" -"Can be worn comfortably by mutants with Tiny or Unassuming. Too small for " +"Can be worn comfortably by mutants with Tiny or Unassuming. Too small for " "anyone else." msgstr "" -#. ~ Please leave anything in unchanged. -#: lang/json/json_flag_from_json.py -msgid "" -"This clothing is undersized and can accommodate abnormally small " -"mutated anatomy." -msgstr "" - #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "" @@ -64832,8 +65235,8 @@ msgstr "" #: lang/json/json_flag_from_json.py msgid "" "This part will help prevent you from being thrown from the vehicle in a " -"collision. You will automaticlly enable this part when you move into a tile " -"with it." +"collision. You will automatically enable this part when you move into a " +"tile with it." msgstr "" #. ~ Please leave anything in unchanged. @@ -65900,6 +66303,10 @@ msgstr "" msgid "Disable zone" msgstr "" +#: lang/json/keybinding_from_json.py +msgid "Show all zones / hide distant zones" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Select left inventory" msgstr "" @@ -66737,7 +67144,7 @@ msgid "Women" msgstr "" #. ~ Sign -#: lang/json/mapgen_from_json.py src/faction.cpp +#: lang/json/mapgen_from_json.py msgid "Men" msgstr "" @@ -67030,6 +67437,31 @@ msgstr "" msgid "UNLOCK STORAGE" msgstr "" +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "PE019 \"Sculptor\" Secure Storage" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "PE050 \"Alpha\" Secure Storage" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "PE065 \"Chimera\" Secure Storage" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "PE070 \"Raptor\" Secure Storage" +msgstr "" + +#. ~ Computer name +#: lang/json/mapgen_from_json.py +msgid "PE023 \"Medical\" Secure Storage" +msgstr "" + #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Laboratory Train Controls" @@ -67042,7 +67474,7 @@ msgstr "" #. ~ Computer option #: lang/json/mapgen_from_json.py -msgid "Download Subway Routes" +msgid "View Subway Routes" msgstr "" #: lang/json/martial_art_from_json.py @@ -68077,7 +68509,7 @@ msgstr "" msgid "Steel" msgstr "" -#: lang/json/material_from_json.py src/faction.cpp +#: lang/json/material_from_json.py msgid "Stone" msgstr "" @@ -70622,6 +71054,144 @@ msgstr "" msgid "Reach Refugee Center" msgstr "" +#: lang/json/mission_def_from_json.py +msgid "" +"We don't have the equipment for real analysis here so it'll need to be done " +"in the field. I need you to get a fresh sample of zombie blood, take it to " +"a hospital, and perform a centrifuge analysis of it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Excellent. Take this blood draw kit; once you've found a zombie corpse, use " +"it to extract blood from the body, then take it to a hospital for analysis." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Download Workstation Data" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The medical software didn't just analyze the blood, it triggered a " +"government alert. Medical staff was under orders to immediately drive any " +"matching samples to the nearest laboratory. That must mean the government " +"knew! We have the destination address. Go there, get in, and bring back " +"any records you can download off a computer." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Great! I've mapped out a route to the address." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Can't blame you, but come back if you change your mind." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"If the laboratory is locked, maybe you can find an id card from employees " +"who died in the evacuation. Also brush up on your computer skills, any " +"computers will have some security on them. Bring back anything you find on " +"a USB drive." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Thanks! This data looks damaged, but maybe I can make something out of it." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Download Encryption Codes" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Unfortunately the data you got was incomplete and mostly encrypted. There " +"may be a way to get encryption codes, though. I found a complaint by the " +"infosec team that they were unable to deliver critical security updates to " +"one research site. It was some kind of more restricted secondary site " +"hidden beneath a town, they weren't allowed in. That means it should have " +"unsecured computers we can get the codes from." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Great! I've mapped out a route, it should look like a normal house. Bring " +"back anything you find on a USB drive." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Expect the lab to be locked as usual." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Wonderful! Now I just need to get an undamaged, complete archive, and we " +"can really figure out what happened." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Download Research Archives" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"So there looks to be months, maybe years of experiments, and that data set " +"must be huge. Database servers massive enough to house it would overheat " +"running on emergency power. But I did found communications from a lab that " +"had some kind of freezing portal open during the cataclysm, sending " +"everything to subzero temperatures. I bet the archives inside that lab are " +"still working." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Great! I've mapped out a route. Bundle up, it gets colder the deeper you " +"go and it looks like the archives were on the fourth basement level." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"That lab is going to start freezing and just get colder the deeper you go. " +"You'll really need special equipment to survive that far down. Bring back " +"anything you find on a USB drive." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Thanks! This is a lot of data to go through." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "Find Lab Tunnels" +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"In the data we found a major contract for tunneling and train equipment, " +"ordered eight months ago. It's the best lead we have. Here's the address " +"of the government lab where the equipment was delivered. I want you to go " +"there, find the tunnels that they dug, and download everything you can about " +"the train network." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "So glad for your help." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"The equipment was rated for 50 feet underground, so that tunnel entrance is " +"going to be deeper inside a lab than a normal subway. Fifty feet would mean " +"maybe four stories down. Bring back anything you find on a USB drive." +msgstr "" + +#: lang/json/mission_def_from_json.py +msgid "" +"Fantastic! I should be able to reconstruct what cargo moved between which " +"labs. I wonder what was really going on down there." +msgstr "" + #: lang/json/monster_attack_from_json.py src/monattack.cpp #, c-format, no-python-format msgid "The %1$s impales your torso!" @@ -72420,7 +72990,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "You have a soft spot for processed foods, and gain a morale bonus from " -"eating it." +"eating them." msgstr "" #: lang/json/mutation_from_json.py @@ -74896,9 +75466,9 @@ msgstr "" msgid "" "You're only half as tall as you used to be! The weight of things you once " "found easy to carry is now unbearable, clothes are now twice as encumbering " -"for you (since you're half their size), and your hit points are heavily " -"reduced. However, your movement is silent, and your dodge skill is a little " -"higher." +"for you unless you refit them (since you're half their size), and your hit " +"points are heavily reduced. However, your movement is silent, and your " +"dodge skill is a little higher." msgstr "" #: lang/json/mutation_from_json.py @@ -75341,8 +75911,9 @@ msgstr "" #. ~ Description for Metabolic Rehydration #: lang/json/mutation_from_json.py msgid "" -"Your body gets all the hydration it needs from the food that you eat! You " -"no longer need to drink water." +"Your body gets everything it needs from the food that you eat! You no " +"longer gain hydration from fluids - instead, your thirst will be equal to, " +"and change with, your hunger." msgstr "" #: lang/json/mutation_from_json.py @@ -76439,7 +77010,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "" "Weeks spent picking through manuals and researching topics you aren't versed " -"in has taught you to find what you need to know more quickly. You read " +"in has taught you to find what you need to know more quickly. You read " "slightly faster, and suffer no reading time penalty for books too complex " "for you to easily understand." msgstr "" @@ -76614,7 +77185,7 @@ msgstr "" #. ~ Description for Debug Bionic Power #: lang/json/mutation_from_json.py msgid "" -"For fueling your inner cybug. Activate to increase power capacity by 100 " +"For fueling your inner cybug. Activate to increase power capacity by 100 " "(can be repeated.)" msgstr "" @@ -76702,6 +77273,7 @@ msgid "I'm looking for some choice systems to hack." msgstr "" #: lang/json/npc_class_from_json.py lang/json/npc_from_json.py +#: lang/json/npc_from_json.py msgid "Doctor" msgstr "" @@ -76717,7 +77289,7 @@ msgstr "" msgid "I'm collecting gear and selling it." msgstr "" -#: lang/json/npc_class_from_json.py src/faction.cpp +#: lang/json/npc_class_from_json.py msgid "Ninja" msgstr "" @@ -76983,6 +77555,16 @@ msgid "" "and I don't plan to keep being one." msgstr "" +#: lang/json/npc_class_from_json.py +msgid "Mouse Mutant" +msgstr "" + +#: lang/json/npc_class_from_json.py +msgid "" +"I'm looking for mouse mutagen... this world is no place for humans anymore, " +"and I don't plan to keep being one." +msgstr "" + #: lang/json/npc_class_from_json.py msgid "Alpha Mutant" msgstr "" @@ -77455,6 +78037,10 @@ msgstr "" msgid "science train depot" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "central train depot" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "access shaft" msgstr "" @@ -82067,9 +82653,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "Trying to herd cats into getting into one place every week has taught you " -"something: it's usually better to cut your losses and trust your gut. For " +"something: it's usually better to cut your losses and trust your gut. For " "that reason, when you had two no-shows and the other two tried to eat you, " -"you ditched. Maybe you can find some new players in the ruins of the world." +"you ditched. Maybe you can find some new players in the ruins of the world." msgstr "" #: lang/json/professions_from_json.py @@ -82082,9 +82668,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "Trying to herd cats into getting into one place every week has taught you " -"something: it's usually better to cut your losses and trust your gut. For " +"something: it's usually better to cut your losses and trust your gut. For " "that reason, when you had two no-shows and the other two tried to eat you, " -"you ditched. Maybe you can find some new players in the ruins of the world." +"you ditched. Maybe you can find some new players in the ruins of the world." msgstr "" #: lang/json/professions_from_json.py @@ -82097,9 +82683,9 @@ msgstr "" msgctxt "prof_desc_male" msgid "" "You came into a large fortune, through luck or will, and hosted games for " -"people that most of the world knew on a first-name basis. You could afford " -"to spoil your players, and so you did. You invested in bionics to make you " -"smarter, and memorized the entire handbook. Let's hope that knowledge helps " +"people that most of the world knew on a first-name basis. You could afford " +"to spoil your players, and so you did. You invested in bionics to make you " +"smarter, and memorized the entire handbook. Let's hope that knowledge helps " "you now." msgstr "" @@ -82113,9 +82699,9 @@ msgstr "" msgctxt "prof_desc_female" msgid "" "You came into a large fortune, through luck or will, and hosted games for " -"people that most of the world knew on a first-name basis. You could afford " -"to spoil your players, and so you did. You invested in bionics to make you " -"smarter, and memorized the entire handbook. Let's hope that knowledge helps " +"people that most of the world knew on a first-name basis. You could afford " +"to spoil your players, and so you did. You invested in bionics to make you " +"smarter, and memorized the entire handbook. Let's hope that knowledge helps " "you now." msgstr "" @@ -85421,6 +86007,21 @@ msgid "" "the subject returned to baseline state with no apparent side effects." msgstr "" +#: lang/json/snippet_from_json.py +msgid "" +"Dr. Hofstadter has manufactured an improved version of PE018 by combining " +"with PE012 outside the subject, then administering the mixture through a " +"topical injection to a specific area of mutation. This has been denoted " +"PE019. Other labs have so far been unable to reproduce the process." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "" +"Rumors of Dr. Hofstadter and her laboratory staff whispering to PE019 " +"samples should be suppressed as malicious gossip. The jealousy of rival " +"teams cannot be allowed to degrade morale." +msgstr "" + #: lang/json/snippet_from_json.py msgid "" ":.||||ERROR||With XE037 having breached confinement, Dr. Maiar recommends " @@ -89607,6 +90208,30 @@ msgstr "" msgid "I'll just go to sleep, ?" msgstr "" +#: lang/json/snippet_from_json.py +msgid "I'm going to sleep now." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm off to bed. Wake me if you need me." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "I'm going to sleep over there." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Time for bed! See you in the morning." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "There's a bed calling my name, and I'm going to it." +msgstr "" + +#: lang/json/snippet_from_json.py +msgid "Good night! Wake me if you need me." +msgstr "" + #: lang/json/snippet_from_json.py msgid "extremely" msgstr "" @@ -92934,7 +93559,7 @@ msgstr "" msgid "cabin in the woods" msgstr "" -#: lang/json/start_location_from_json.py src/faction.cpp +#: lang/json/start_location_from_json.py msgid "Church" msgstr "" @@ -93497,6 +94122,43 @@ msgid "" "it gets too, uh... 'tender'." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "" +"Feed a man a fish, he's full for a day. Feed a man a bullet, he's full for " +"the rest of his life." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Spot your prey before something nastier spots you." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "I've heard that cougars sometimes leap. Maybe it's just a myth." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Jabberwock is real, don't listen to what anybody else says. If you see " +"it, RUN." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Zombie animal meat isn't good for eating, but sometimes you, might find " +"usable fur on 'em." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"A steady diet of cooked meat and clean water will keep you alive forever, " +"but your taste buds and your colon may start to get angry at you. Eat a " +"piece of fruit every once in a while." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Smoke crack to get more shit done." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Watch your back out there." msgstr "" @@ -93661,6 +94323,52 @@ msgstr "" msgid "Was hoping for something more..." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Hope you're here to trade." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I oversee the food stocks for the center. There was significant looting " +"during the panic when we first arrived so most of our food was carried " +"away. I manage what we have left and do everything I can to increase our " +"supplies. Rot and mold are more significant in the damp basement so I " +"prioritize non-perishable food, such as cornmeal, jerky, and fruit wine." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Why cornmeal, jerky, and fruit wine?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"All three are easy to locally produce in significant quantities and are non-" +"perishable. We have a local farmer or two and a few hunter types that have " +"been making attempts to provide us with the nutritious supplies. We do " +"always need more suppliers though. Because this stuff is rather cheap in " +"bulk I can pay a premium for any you have on you. Canned food and other " +"edibles are handled by the merchant in the front." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Are you looking to buy anything else?" +msgstr "" + +#: lang/json/talk_topic_from_json.py src/npctalk.cpp +msgid "Very well..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I'm actually accepting a number of different foodstuffs: beer, sugar, flour, " +"smoked meat, smoked fish, cooking oil; and as mentioned before, jerky, " +"cornmeal, and fruit wine." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Interesting..." +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Marshal..." msgstr "" @@ -93670,7 +94378,7 @@ msgid "Citizen..." msgstr "" #: lang/json/talk_topic_from_json.py -#: src/npctalk.cpp +#: lang/json/talk_topic_from_json.py src/npctalk.cpp msgid "Who are you?" msgstr "" @@ -93819,6 +94527,61 @@ msgstr "" msgid "Glad to have you aboard." msgstr "" +#: lang/json/talk_topic_from_json.py +msgid "Can I trade for supplies?" +msgstr "" + +#: lang/json/talk_topic_from_json.py src/npctalk.cpp +#: src/npctalk.cpp +msgid "Can I do anything for you?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"I'm a doctor, one of the several at the outpost. We were the lucky ones. " +"Came here right went things started to go wrong, never left." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "So what are you doing right now?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"The Old Guard--that's what's left of the feds--set me up here to screen any " +"new arrivals for infection risks. Can't be too paranoid these days. Sad to " +"have to turn people away, but I like the assignment for the chance to get " +"news about the outside world." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "What kind of news?" +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"Sightings of unusual living dead or new mutations. The more we know about " +"what's happening, the closer we can get to a treatment or maybe even a " +"cure. It's a long shot, but you have hope to survive." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "Good luck with that..." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"This is no classic zombie outbreak. The dead seem to be getting stronger as " +"the days go on. Some survivors too, come in here with... adaptations. " +"Maybe they're related." +msgstr "" + +#: lang/json/talk_topic_from_json.py +msgid "" +"We can't. There's nothing we can spare to sell and I've got no budget to " +"buy from you. I don't suppose you want to donate?" +msgstr "" + #: lang/json/talk_topic_from_json.py msgid "Are you part of the rescue team?" msgstr "" @@ -97297,6 +98060,46 @@ msgid "" "picked. You could also cut it down with the right tools." msgstr "" +#: lang/json/terrain_from_json.py +msgid "mulberry tree" +msgstr "" + +#. ~ Description for mulberry tree +#: lang/json/terrain_from_json.py +msgid "" +"This tree is a member of the 'Morus' genus, producing fruit commonly known " +"as mulberries. In the summer many berries can be picked. You could also " +"cut it down with the right tools." +msgstr "" + +#. ~ Description for mulberry tree +#: lang/json/terrain_from_json.py +msgid "" +"This tree is a member of the 'Morus' genus, producing fruit commonly known " +"as mulberries. There doesn't appear to be any ripe mulberries now. You " +"could also cut it down with the right tools." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "elderberry tree" +msgstr "" + +#. ~ Description for elderberry tree +#: lang/json/terrain_from_json.py +msgid "" +"This tree is a member of the 'Sambucus' genus, producing fruit commonly " +"known as elderberries. In the summer many berries can be picked. You could " +"also cut it down with the right tools." +msgstr "" + +#. ~ Description for elderberry tree +#: lang/json/terrain_from_json.py +msgid "" +"This tree is a member of the 'Sambucus' genus, producing fruit commonly " +"known as elderberries. There doesn't appear to be any ripe elderberries " +"now. You could also cut it down with the right tools." +msgstr "" + #: lang/json/terrain_from_json.py msgid "pine tree" msgstr "" @@ -97387,10 +98190,118 @@ msgstr "" msgid "blueberry bush" msgstr "" +#. ~ Description for blueberry bush +#: lang/json/terrain_from_json.py +msgid "A small bush of sweet blueberries." +msgstr "" + +#. ~ Description for blueberry bush +#: lang/json/terrain_from_json.py +msgid "A small blueberry bush that's fruitless." +msgstr "" + #: lang/json/terrain_from_json.py msgid "strawberry bush" msgstr "" +#. ~ Description for strawberry bush +#: lang/json/terrain_from_json.py +msgid "A small bush of juicy strawberries." +msgstr "" + +#. ~ Description for strawberry bush +#: lang/json/terrain_from_json.py +msgid "A small strawberry bush that's fruitless." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "blackberry bush" +msgstr "" + +#. ~ Description for blackberry bush +#: lang/json/terrain_from_json.py +msgid "A small bush of delicious blackberries. Watch out for its thorns!" +msgstr "" + +#. ~ Description for blackberry bush +#: lang/json/terrain_from_json.py +msgid "A small blackberry bush that's fruitless. Watch out for its thorns!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "huckleberry bush" +msgstr "" + +#. ~ Description for huckleberry bush +#: lang/json/terrain_from_json.py +msgid "A small bush of huckleberries, often mistaken as blueberries." +msgstr "" + +#. ~ Description for huckleberry bush +#: lang/json/terrain_from_json.py +msgid "A small huckleberry bush that's fruitless." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "raspberry bush" +msgstr "" + +#. ~ Description for raspberry bush +#: lang/json/terrain_from_json.py +msgid "A small bush of delicious raspberries. Watch out for its thorns!" +msgstr "" + +#. ~ Description for raspberry bush +#: lang/json/terrain_from_json.py +msgid "A small raspberry bush that's fruitless. Watch out for its thorns!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "grape bush" +msgstr "" + +#. ~ Description for grape bush +#: lang/json/terrain_from_json.py +msgid "A bush of a different species invaded by vines of grapes." +msgstr "" + +#. ~ Description for grape bush +#: lang/json/terrain_from_json.py +msgid "" +"A bush of a different species invaded by grape vines but they're fruitless." +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "rose bush" +msgstr "" + +#. ~ Description for rose bush +#: lang/json/terrain_from_json.py +msgid "" +"A fat bush of beautiful red roses, if only you could get a date! Watch out " +"for its thorns!" +msgstr "" + +#. ~ Description for rose bush +#: lang/json/terrain_from_json.py +msgid "" +"A fat rose bush that currently has no blooms. Watch out for its thorns!" +msgstr "" + +#: lang/json/terrain_from_json.py +msgid "hydrangea bush" +msgstr "" + +#. ~ Description for hydrangea bush +#: lang/json/terrain_from_json.py +msgid "A fat, bush of fragrant blue hydrangeas." +msgstr "" + +#. ~ Description for hydrangea bush +#: lang/json/terrain_from_json.py +msgid "A fat hydrangea bush that currently has no blooms." +msgstr "" + #: lang/json/terrain_from_json.py msgid "tree trunk" msgstr "" @@ -98319,6 +99230,10 @@ msgstr "" msgid "jacking" msgstr "" +#: lang/json/tool_quality_from_json.py +msgid "self jacking" +msgstr "" + #: lang/json/tool_quality_from_json.py msgid "chiseling" msgstr "" @@ -100166,12 +101081,19 @@ msgid "boom crane" msgstr "" #. ~ Description for boom crane +#. ~ Description for internal boom crane #: lang/json/vehicle_part_from_json.py msgid "" "A rigid steel boom crane. If it is in your line of sight and within two " "tiles of another vehicle, you will automatically use it when you want jack " -"up the other vehicle to change the its wheels, or lift a heavy component " -"like an engine that you are installing in or removing from the other vehicle." +"up the other vehicle to change the its wheels. To use it to lift a heavy " +"component like an engine that you are installing or removing, the crane must " +"have an unblocked direct path to where it is going and it must be within " +"four tiles of it." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "internal boom crane" msgstr "" #: lang/json/vehicle_part_from_json.py @@ -100183,9 +101105,10 @@ msgstr "" msgid "" "An extendable cantilever crane. If it is in your line of sight and within " "two tiles of another vehicle, you will automatically use it when you want " -"jack up the other vehicle to change the its wheels, or lift a heavy " -"component like an engine that you are installing in or removing from the " -"other vehicle." +"jack up the other vehicle to change the its wheels. To use it to lift a " +"heavy component like an engine that you are installing or removing, the " +"crane must have an unblocked direct path to where it is going and it must be " +"within four tiles of it." msgstr "" #. ~ Description for pallet lifter @@ -100193,8 +101116,10 @@ msgstr "" msgid "" "A small pallet lifter. If it is in your line of sight and within two tiles " "of another vehicle, you will automatically use it when you want jack up the " -"other vehicle to change the its wheels, or lift a heavy component like an " -"engine that you are installing in or removing from the other vehicle." +"other vehicle to change the its wheels. To use it to lift a heavy component " +"like an engine that you are installing or removing, the crane must have an " +"unblocked direct path to where it is going and it must be within four tiles " +"of it." msgstr "" #: lang/json/vehicle_part_from_json.py @@ -100206,8 +101131,10 @@ msgstr "" msgid "" "A pair of forklift arms. If it is in your line of sight and within two " "tiles of another vehicle, you will automatically use it when you want jack " -"up the other vehicle to change the its wheels, or lift a heavy component " -"like an engine that you are installing in or removing from the other vehicle." +"up the other vehicle to change the its wheels. To use it to lift a heavy " +"component like an engine that you are installing or removing, the crane must " +"have an unblocked direct path to where it is going and it must be within " +"four tiles of it." msgstr "" #. ~ Description for rockwheel @@ -100219,6 +101146,10 @@ msgid "" "dirt. Mount it on the edge of your vehicle." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "air jack system" +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "foldable light frame" msgstr "" @@ -102200,7 +103131,7 @@ msgstr "" #: src/game.cpp #: src/game.cpp src/iexamine.cpp #: src/iexamine.cpp -#: src/iexamine.cpp src/inventory_ui.cpp src/iuse.cpp +#: src/inventory_ui.cpp src/iuse.cpp #: src/iuse.cpp #: src/iuse_actor.cpp #: src/mission_companion.cpp @@ -103011,6 +103942,10 @@ msgstr "" msgid "The pet has moved somewhere else." msgstr "" +#: src/activity_item_handling.cpp +msgid "You can't reach the source tile. Try to sort out loot without a cart." +msgstr "" + #: src/activity_item_handling.cpp msgid "You sorted out every item you could." msgstr "" @@ -104906,6 +105841,10 @@ msgstr "" msgid "Your %s has lost connection and is turning off." msgstr "" +#: src/bionics.cpp +msgid "You feel your throat open up and air filling your lungs!" +msgstr "" + #: src/bionics.cpp msgid "You flub the removal." msgstr "" @@ -108177,7 +109116,7 @@ msgstr "" msgid "Bugged" msgstr "" -#: src/debug_menu.cpp +#: src/debug_menu.cpp src/wish.cpp msgid "Type:" msgstr "" @@ -109280,11 +110219,11 @@ msgid "stamina recovery" msgstr "" #: src/effect.cpp -msgid "quench" +msgid "thirst" msgstr "" #: src/effect.cpp -msgid "thirst" +msgid "quench" msgstr "" #: src/effect.cpp @@ -109296,11 +110235,11 @@ msgid "sate" msgstr "" #: src/effect.cpp -msgid "rest" +msgid "sleepiness" msgstr "" #: src/effect.cpp -msgid "sleepiness" +msgid "rest" msgstr "" #: src/effect.cpp @@ -109513,606 +110452,782 @@ msgstr[0] "" msgstr[1] "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Devoted" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Golden" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Holy" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Righteous" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Sacred" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Shining" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Divine" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Noble" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Radiant" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Splendid" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Venerable" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Virtuous" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Bright" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Heroic" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Immaculate" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Crystal" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Metal" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Mighty" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Original" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Powerful" msgstr "" -#: src/faction.cpp src/options.cpp +#: src/faction.cpp +msgctxt "faction_adj" msgid "Solid" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Colossal" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Famous" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Firey" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Invincible" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" +msgid "Stone" +msgstr "" + +#: src/faction.cpp +msgctxt "faction_adj" msgid "Supreme" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Electric" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Great" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Unlimited" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Deadly" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Foul" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Nefarious" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Poisonous" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Vile" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Wicked" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Baleful" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Devastating" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Horror" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Ruinous" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Sinister" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Vicious" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Dread" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Pernicious" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Pestilent" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Dervishes" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Destroyers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Fists" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Furies" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Slayers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Tigers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Army" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Berserkers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Killers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Paladins" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Samurai" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Valkyries" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Huntsmen" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Knights" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Warriors" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Agents" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Assassins" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" +msgid "Ninja" +msgstr "" + +#: src/faction.cpp +msgctxt "faction_adj" msgid "Rats" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Shadows" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Snakes" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Arachnids" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Creepers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Eliminators" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Guerillas" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" +msgid "Smoke" +msgstr "" + +#: src/faction.cpp +msgctxt "faction_adj" msgid "Snipers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Eels" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Shade" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Stalkers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Bandits" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Family" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Gang" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Mafia" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Mob" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Punks" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Vandals" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Cutthroats" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Faction" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Guild" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Muggers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Sharks" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Thugs" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Crooks" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Racket" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Brotherhood" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" +msgid "Church" +msgstr "" + +#: src/faction.cpp +msgctxt "faction_adj" msgid "Creed" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Crucible" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Ones" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Sect" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Clerics" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Doctrine" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Monks" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Pastors" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Priests" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Tenet" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Elders" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Gnostics" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Inquisitors" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Clan" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" +msgid "Men" +msgstr "" + +#: src/faction.cpp +msgctxt "faction_adj" msgid "People" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Settlers" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Society" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Tribe" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Colony" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Folk" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Kingdom" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Nation" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Party" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Republic" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "State" msgstr "" #: src/faction.cpp +msgctxt "faction_adj" msgid "Company" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "basic survival" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "financial wealth" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "dominance of the region" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "the extermination of monsters" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "contact with unseen powers" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "bringing the apocalypse" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "general chaos and anarchy" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "the cultivation of knowledge" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "harmony with nature" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "rebuilding civilization" msgstr "" #: src/faction.cpp +msgctxt "faction_goal" msgid "spreading the fungus" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "protection rackets" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "the sale of information" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "their bustling trade centers" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "trade caravans" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "scavenging supplies" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "mercenary work" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "assassinations" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "raiding settlements" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "the theft of property" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "gambling parlors" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "medical aid" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "farming & selling food" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "drug dealing" msgstr "" #: src/faction.cpp +msgctxt "faction_job" msgid "selling manufactured goods" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their charitable nature" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their isolationism" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "exploring extensively" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "collecting rare artifacts" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their knowledge of bionics" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their libraries" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their elite training" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their robotics factories" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "treachery" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "the avoidance of drugs" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their adherence to the law" msgstr "" #: src/faction.cpp +msgctxt "faction_value" msgid "their cruelty" msgstr "" @@ -110669,6 +111784,14 @@ msgstr "" msgid "Unchallenged" msgstr "" +#: src/faction.cpp +msgid "Mighty" +msgstr "" + +#: src/faction.cpp +msgid "Famous" +msgstr "" + #: src/faction.cpp msgid "Well-Known" msgstr "" @@ -111199,11 +112322,11 @@ msgid "smoke vent" msgstr "" #: src/field.cpp -msgid "Man, that smells like some good shit!" +msgid "Whew... smells like skunk!" msgstr "" #: src/field.cpp -msgid "Whew... smells like skunk!" +msgid "Man, that smells like some good shit!" msgstr "" #: src/field.cpp @@ -111258,11 +112381,11 @@ msgid "You're standing in a pool of acid" msgstr "" #: src/field.cpp -msgid "The sap sticks to !" +msgid "The sap sticks to you!" msgstr "" #: src/field.cpp -msgid "The sap sticks to you!" +msgid "The sap sticks to !" msgstr "" #: src/field.cpp @@ -111327,11 +112450,11 @@ msgid "This radioactive gas burns!" msgstr "" #: src/field.cpp -msgid " is torched by flames!" +msgid "You're torched by flames!" msgstr "" #: src/field.cpp -msgid "You're torched by flames!" +msgid " is torched by flames!" msgstr "" #: src/field.cpp @@ -111379,19 +112502,19 @@ msgid "The bees sting you all over your body!" msgstr "" #: src/field.cpp -msgid "The incendiary burns !" +msgid "The incendiary burns you!" msgstr "" #: src/field.cpp -msgid "The incendiary burns you!" +msgid "The incendiary burns !" msgstr "" #: src/field.cpp -msgid "The incendiary melts into s skin!" +msgid "The incendiary melts into your skin!" msgstr "" #: src/field.cpp -msgid "The incendiary melts into your skin!" +msgid "The incendiary melts into s skin!" msgstr "" #: src/field.cpp @@ -111803,42 +112926,27 @@ msgstr "" msgid "No." msgstr "" -#: src/game.cpp -msgid "" -"You're engorged to hibernate. The alarm would only attract attention. Enter " -"hibernation?" -msgstr "" - #: src/game.cpp msgid "You may want to deactivate these before you sleep." msgstr "" #: src/game.cpp -msgid "Set alarm to wake up in 3 hours." -msgstr "" - -#: src/game.cpp -msgid "Set alarm to wake up in 4 hours." -msgstr "" - -#: src/game.cpp -msgid "Set alarm to wake up in 5 hours." -msgstr "" - -#: src/game.cpp -msgid "Set alarm to wake up in 6 hours." +msgid "" +"You're engorged to hibernate. The alarm would only attract attention. Set an " +"alarm anyway?" msgstr "" #: src/game.cpp -msgid "Set alarm to wake up in 7 hours." +msgid "You have an alarm clock. Set an alarm?" msgstr "" #: src/game.cpp -msgid "Set alarm to wake up in 8 hours." +msgid "No, don't set an alarm." msgstr "" #: src/game.cpp -msgid "Set alarm to wake up in 9 hours." +#, c-format +msgid "Set alarm to wake up in %i hours." msgstr "" #: src/game.cpp @@ -111946,6 +113054,10 @@ msgstr "" msgid "player memorial" msgstr "" +#: src/game.cpp +msgid "quick shortcuts" +msgstr "" + #: src/game.cpp msgid "uistate data" msgstr "" @@ -113117,7 +114229,11 @@ msgid "%s [%d]" msgstr "" #: src/game.cpp -msgid "Show on ap" +msgid "how all / hide distant" +msgstr "" + +#: src/game.cpp +msgid "ap" msgstr "" #: src/game.cpp @@ -113553,6 +114669,10 @@ msgid "" "better effects." msgstr "" +#: src/game.cpp +msgid "Quarter corpse" +msgstr "" + #: src/game.cpp msgid "" "By quartering a previously field dressed corpse you will aquire four parts " @@ -113562,7 +114682,7 @@ msgid "" msgstr "" #: src/game.cpp -msgid "Quarter corpse" +msgid "Dissect corpse" msgstr "" #: src/game.cpp @@ -113573,10 +114693,6 @@ msgid "" "most useful here." msgstr "" -#: src/game.cpp -msgid "Dissect corpse" -msgstr "" - #: src/game.cpp msgid "You're too full to eat the underbrush." msgstr "" @@ -114702,7 +115818,7 @@ msgid "You don't have any items you could disassemble." msgstr "" #: src/game_inventory.cpp -msgid "NUTRITION" +msgid "CALORIES" msgstr "" #: src/game_inventory.cpp @@ -118129,7 +119245,7 @@ msgid "burn: " msgstr "" #: src/item.cpp -msgid "Nutrition: " +msgid "Calories (kcal): " msgstr "" #: src/item.cpp @@ -118788,6 +119904,22 @@ msgstr "" msgid "* This piece of clothing can be refitted." msgstr "" +#: src/item.cpp +msgid "" +"* These clothes are too large but can be undersized." +msgstr "" + +#: src/item.cpp +msgid "" +"* These clothes are undersized enough to accommodate " +"abnormally small mutated anatomy." +msgstr "" + +#: src/item.cpp +msgid "" +"* These clothes are undersized but can be refitted." +msgstr "" + #: src/item.cpp msgid "* This item can be worn on either side of the body." msgstr "" @@ -119046,6 +120178,14 @@ msgctxt "item name" msgid "%s, full" msgstr "" +#: src/item.cpp +msgid " (poisonous)" +msgstr "" + +#: src/item.cpp +msgid " (hallucinogenic)" +msgstr "" + #: src/item.cpp msgid " (rotten)" msgstr "" @@ -119079,11 +120219,15 @@ msgid " (melted)" msgstr "" #: src/item.cpp -msgid " (fits)" +msgid " (oversize)" +msgstr "" + +#: src/item.cpp +msgid " (undersize)" msgstr "" #: src/item.cpp -msgid " (undersized)" +msgid " (fits)" msgstr "" #: src/item.cpp @@ -119787,6 +120931,30 @@ msgstr "" msgid "Feels like you're on fire, but you're OK." msgstr "" +#: src/iuse.cpp +msgctxt "memorial_male" +msgid "Injected smart purifier." +msgstr "" + +#: src/iuse.cpp +msgctxt "memorial_female" +msgid "Injected smart purifier." +msgstr "" + +#: src/iuse.cpp +msgid "You don't have any mutations to purify." +msgstr "" + +#: src/iuse.cpp +msgid "Choose a mutation to purify" +msgstr "" + +#: src/iuse.cpp +msgid "" +"You inject the purifier. The liquid thrashes inside the tube and goes down " +"reluctantly." +msgstr "" + #: src/iuse.cpp #, c-format msgid "" @@ -121480,6 +122648,10 @@ msgstr "" msgid "You heat up the food." msgstr "" +#: src/iuse.cpp +msgid "There is no fire around, use your integrated toolset instead?" +msgstr "" + #: src/iuse.cpp #, c-format msgid "You need to be next to fire to heat something up with the %s." @@ -122619,7 +123791,7 @@ msgid "You need %s to do it!" msgstr "" #: src/iuse_actor.cpp -msgid "You need a syringe to inject this drug" +msgid "You need a syringe to inject this drug." msgstr "" #: src/iuse_actor.cpp @@ -123027,6 +124199,11 @@ msgstr "" msgid "Your %1$s is too heavy to fit in your %2$s" msgstr "" +#: src/iuse_actor.cpp +#, c-format +msgid "You don't think putting your %1$s in your %2$s is a good idea" +msgstr "" + #: src/iuse_actor.cpp #, c-format msgid "You can't put your %1$s in your %2$s" @@ -124750,6 +125927,11 @@ msgctxt "Main Menu|World" msgid "how World Mods" msgstr "" +#: src/main_menu.cpp +msgctxt "Main Menu|World" +msgid "opy World Settings" +msgstr "" + #: src/main_menu.cpp msgctxt "Main Menu|Settings" msgid "ptions" @@ -128000,6 +129182,10 @@ msgid "" "You mark the refugee center, but you have no idea how to get there by road..." msgstr "" +#: src/mission_start.cpp +msgid "Download Routing Software" +msgstr "" + #: src/mission_ui.cpp msgid "ACTIVE MISSIONS" msgstr "" @@ -129583,7 +130769,6 @@ msgstr "" msgid "Rats suddenly swarm into view." msgstr "" -#. ~ %s is the possessive form of the monster's name #: src/mondeath.cpp #, c-format msgid "" @@ -131480,6 +132665,10 @@ msgstr "" msgid " is no longer afraid." msgstr "" +#: src/npcmove.cpp +msgid "" +msgstr "" + #: src/npcmove.cpp #, c-format msgid "%s lies down to sleep." @@ -131687,6 +132876,10 @@ msgstr "" msgid "The bite wound on my %s looks bad." msgstr "" +#: src/npcmove.cpp +msgid "" +msgstr "" + #: src/npcmove.cpp msgid "I'm suffering from radiation sickness..." msgstr "" @@ -131840,43 +133033,6 @@ msgstr "" msgid "Sure, here you go!" msgstr "" -#: src/npctalk.cpp -msgid "" -"Feed a man a fish, he's full for a day. Feed a man a bullet, he's full for " -"the rest of his life." -msgstr "" - -#: src/npctalk.cpp -msgid "Spot your prey before something nastier spots you." -msgstr "" - -#: src/npctalk.cpp -msgid "I've heard that cougars sometimes leap. Maybe it's just a myth." -msgstr "" - -#: src/npctalk.cpp -msgid "" -"The Jabberwock is real, don't listen to what anybody else says. If you see " -"it, RUN." -msgstr "" - -#: src/npctalk.cpp -msgid "" -"Zombie animal meat isn't good for eating, but sometimes you might find " -"usable fur on 'em." -msgstr "" - -#: src/npctalk.cpp -msgid "" -"A steady diet of cooked meat and clean water will keep you alive forever, " -"but your taste buds and your colon may start to get angry at you. Eat a " -"piece of fruit every once in a while." -msgstr "" - -#: src/npctalk.cpp -msgid "Smoke crack to get more shit done." -msgstr "" - #: src/npctalk.cpp msgid "Hello, marshal." msgstr "" @@ -131985,36 +133141,6 @@ msgid "" "hoping a few plain text messages can get picked up though." msgstr "" -#: src/npctalk.cpp -msgid "Hope you're here to trade." -msgstr "" - -#: src/npctalk.cpp -msgid "" -"I oversee the food stocks for the center. There was significant looting " -"during the panic when we first arrived so most of our food was carried " -"away. I manage what we have left and do everything I can to increase our " -"supplies. Rot and mold are more significant in the damp basement so I " -"prioritize non-perishable food, such as cornmeal, jerky, and fruit wine." -msgstr "" - -#: src/npctalk.cpp -msgid "" -"All three are easy to locally produce in significant quantities and are non-" -"perishable. We have a local farmer or two and a few hunter types that have " -"been making attempts to provide us with the nutritious supplies. We do " -"always need more suppliers though. Because this stuff is rather cheap in " -"bulk I can pay a premium for any you have on you. Canned food and other " -"edibles are handled by the merchant in the front." -msgstr "" - -#: src/npctalk.cpp -msgid "" -"I'm actually accepting a number of different foodstuffs: beer, sugar, flour, " -"smoked meat, smoked fish, cooking oil; and as mentioned before, jerky, " -"cornmeal, and fruit wine." -msgstr "" - #: src/npctalk.cpp msgid "Pleasure doing business!" msgstr "" @@ -132937,22 +134063,6 @@ msgstr "" msgid "You might be seeing more of me..." msgstr "" -#: src/npctalk.cpp -msgid "Why cornmeal, jerky, and fruit wine?" -msgstr "" - -#: src/npctalk.cpp -msgid "Are you looking to buy anything else?" -msgstr "" - -#: src/npctalk.cpp -msgid "Very well..." -msgstr "" - -#: src/npctalk.cpp -msgid "Interesting..." -msgstr "" - #: src/npctalk.cpp msgid "" "[MISSION] The merchant at the Refugee Center sent me to get a prospectus " @@ -133140,10 +134250,6 @@ msgstr "" msgid "Any tips?" msgstr "" -#: src/npctalk.cpp -msgid "Can I do anything for you?" -msgstr "" - #: src/npctalk.cpp msgid "Want to travel with me?" msgstr "" @@ -134206,6 +135312,10 @@ msgstr "" msgid "Specified the mode in which the minimap drawn." msgstr "" +#: src/options.cpp +msgid "Solid" +msgstr "" + #: src/options.cpp msgid "Squares" msgstr "" @@ -134297,6 +135407,13 @@ msgstr "" msgid "( WIP feature ) Determines terrain, shops, plants, and more." msgstr "" +#: src/options.cpp +msgid "" +"Season length, in days. Warning: Very little other than the duration of " +"seasons scales with this value, so adjusting it may cause nonsensical " +"results." +msgstr "" + #: src/options.cpp msgid "Static NPCs" msgstr "" @@ -134531,7 +135648,19 @@ msgid "Color codes: " msgstr "" #: src/overmap_ui.cpp -msgid "Note (X:TEXT for custom symbol, G; for color):" +msgid "Type GLYPH:TEXT to set a custom glyph." +msgstr "" + +#: src/overmap_ui.cpp +msgid "Type COLOR;TEXT to set a custom color." +msgstr "" + +#: src/overmap_ui.cpp +msgid "Examples: B:Base | g;Loot | !:R;Minefield" +msgstr "" + +#: src/overmap_ui.cpp +msgid "Note:" msgstr "" #: src/overmap_ui.cpp @@ -135238,14 +136367,26 @@ msgstr "" msgid " attempts to put out the fire on them!" msgstr "" +#: src/player.cpp +msgid "a loud scream!" +msgstr "" + #: src/player.cpp msgid "yourself scream loudly!" msgstr "" +#: src/player.cpp +msgid "a piercing howl!" +msgstr "" + #: src/player.cpp msgid "yourself let out a piercing howl!" msgstr "" +#: src/player.cpp +msgid "a loud shout!" +msgstr "" + #: src/player.cpp msgid "yourself shout loudly!" msgstr "" @@ -136129,6 +137270,10 @@ msgstr "" msgid "You have an asthma attack!" msgstr "" +#: src/player.cpp +msgid "You use your Oxygenator to clear it up, then go back to sleep." +msgstr "" + #: src/player.cpp msgid "You use your inhaler and go back to sleep." msgstr "" @@ -139641,6 +140786,10 @@ msgstr "" msgid "Select part to refill:" msgstr "" +#: src/veh_interact.cpp +msgid "You cannot recharge a vehicle battery with handheld batteries" +msgstr "" + #: src/veh_interact.cpp msgid "Engines" msgstr "" diff --git a/lang/po/de.po b/lang/po/de.po index 59c3d16fbce08..5d6a22c81025d 100644 --- a/lang/po/de.po +++ b/lang/po/de.po @@ -1,15 +1,16 @@ # Translators: -# Vlasov Vitaly , 2018 -# Wuzzy , 2018 -# Enrico Grunitz, 2018 # Brett Dong , 2018 +# Enrico Grunitz, 2018 # Mark Bies, 2018 +# Wuzzy , 2018 +# Vlasov Vitaly , 2018 # Kitty M , 2018 # Nipaporn P. , 2018 # Ozone H3 , 2018 # Phil Mait , 2018 # Robert Boettcher , 2018 # marc s , 2018 +# P M , 2018 # Nico Brandt , 2018 # - - , 2018 # Maximus Minerias , 2018 @@ -17,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Maximus Minerias , 2018\n" "Language-Team: German (https://www.transifex.com/cataclysm-dda-translators/teams/2217/de/)\n" @@ -32345,6 +32346,10 @@ msgstr "einfacher Dieselmotor" msgid "base gasoline engine" msgstr "einfacher Benzinmotor" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "Einzylindermotor" @@ -32452,6 +32457,114 @@ msgstr "" "Ein wuchtiger und extrem schwerer Zwölfzylindermotor; üblicherweise werden " "diese in schweren Lastern eingebaut." +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -41197,6 +41310,15 @@ msgstr "ARTEFAKTE" msgid "ARMOR" msgstr "KLEIDUNG" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "Munitionsgurt" @@ -46635,11 +46757,9 @@ msgstr "Heuschreckenpuppe" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" -"Eine Heuschrecke von der Größe eines Kaninchens. Du hasst schon den Gedanken" -" daran, was ein Schwarm von dieser Art anrichten könnte." #: lang/json/MONSTER_from_json.py msgid "bear cub" @@ -47786,12 +47906,8 @@ msgstr "Riesenklapperschlange" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" -"Eine mutierte Wald-Klapperschlange, etwa drei mal größer als die Norm. " -"Obwohl sie nicht groß genug ist, um Menschen als mögliche Beute zu " -"betrachten, ist sie aggressiver und gefährlicher im Vergleich zu einer " -"normalen Klapperschlange." #: lang/json/MONSTER_from_json.py msgid "sewer snake" @@ -55356,9 +55472,9 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" -msgstr[0] "Taschenuhr" -msgstr[1] "Taschenuhren" +msgid_plural "pocket watches" +msgstr[0] "" +msgstr[1] "" #. ~ Description for pocket watch #: lang/json/TOOL_from_json.py @@ -76102,6 +76218,10 @@ msgstr "Defekt eines Teils beheben" msgid "Refill tank/battery" msgstr "Tank/Batterie wiederbefüllen" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "Teil entfernen" @@ -90531,6 +90651,10 @@ msgstr "öffentliche Toilette" msgid "roadside foodcart" msgstr "Essenswagen am Straßenrand" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "religiöser Friedhof" @@ -90858,7 +90982,7 @@ msgid "stadium parking" msgstr "Stadionparkplatz" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" +msgid "stadium" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -90926,7 +91050,7 @@ msgid "trailer park" msgstr "Wohnwagenplatz" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" +msgid "mass grave" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -91006,12 +91130,12 @@ msgid "Bankrupt Pizzeria" msgstr "Bankrotte Pizzeria" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" -msgstr "Bootsverleih" +msgid "boat rental" +msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" -msgstr "Flussuferbehausung" +msgid "riverside dwelling" +msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "municipal reactor" @@ -91219,11 +91343,19 @@ msgid "animal clinic" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" +msgid "war memorial" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - barn" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" +msgid "ruined cabin - dirt plaza" msgstr "" #: lang/json/professions_from_json.py @@ -115599,6 +115731,10 @@ msgstr "Polizei-K9-Transporter" msgid "SWAT Truck" msgstr "SWAT-Laster" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "Automatiktraktor" @@ -117056,20 +117192,22 @@ msgid "external cargo rack" msgstr "äußeres Lagergestell" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." msgstr "" -"Ein Verbrennungsmotor. Verbrennt Treibstoff aus einem Tank im Fahrzeug, um " -"das Fahrzeug zu bewegen, falls das Fahrzeug über ausreichend Räder verfügt." #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" -"Ein Verbrennungsmotor. Verbrennt Benzin aus einem Tank im Fahrzeug, um das " -"Fahrzeug zu bewegen, falls das Fahrzeug über ausreichend Räder verfügt." #: lang/json/vehicle_part_from_json.py msgid "boom crane" @@ -117474,6 +117612,14 @@ msgstr "Außentank (200 l)" msgid "barrel (100L)" msgstr "Fass (100 l)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "montierter Flammenwerfer" @@ -118886,6 +119032,12 @@ msgid "A living blob turned into a heavy vehicle weapon." msgstr "" "Ein lebendiger Blob, der zu einer schweren Fahrzeugwaffe umgeformt wurde." +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -125012,7 +125164,8 @@ msgstr[1] "Du brauchst 1 %s mit %d Ladungen." #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "Vergiss es." @@ -125346,6 +125499,42 @@ msgstr "Du triffst %s für %d Schaden." msgid "%1$s shoots %2$s." msgstr "%1$s schießt auf %2$s." +#: src/creature.cpp +msgid "Severe pain" +msgstr "" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "" + +#: src/creature.cpp +msgid "No pain" +msgstr "" + #: src/creature.cpp msgid "Hostile" msgstr "Feindlich" @@ -129112,16 +129301,15 @@ msgstr "Welt behalten. Verbleibende Protagonisten:%s" msgid "Wait till you wake up..." msgstr "Warte, bis du aufwachst …" -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "" -" (Y) ja, (N) nein, (I) weitere Ablenkungen ignorieren und fertig machen." - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s. Automatische Fortbewegung abgebrochen" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -130618,7 +130806,7 @@ msgstr "%s kann nirgendwo hingehen!" msgid "Use which item?" msgstr "Welchen Gegenstand benutzen?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "Vergiss es" @@ -154221,7 +154409,7 @@ msgstr "Schweißgerät benutzen?" #: src/pickup.cpp msgid "Purify water in carried container" -msgstr "Passer in getragenem Behälter reinigen" +msgstr "Wasser in getragenem Behälter reinigen" #: src/pickup.cpp msgid "Purify water in vehicle tank" @@ -156440,7 +156628,7 @@ msgstr "Einmal lesen" #: src/player.cpp msgid "Read until this NPC gains a level:" -msgstr "Resen, bis dieser NPC eine neue Stufe erreicht:" +msgstr "Lesen, bis dieser NPC eine neue Stufe erreicht:" #: src/player.cpp msgid "Reading for fun:" @@ -159379,6 +159567,14 @@ msgstr "Du kannst nichts aus einem sich bewegenden Fahrzeug absaugen." msgid "Select part to siphon: " msgstr "" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "Hier gibt es keinen Reifen zum Wechseln." @@ -159569,6 +159765,10 @@ msgstr ":entfernen" msgid "iphon" msgstr "abaugen" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "" + #: src/veh_interact.cpp msgid "hange tire" msgstr ":Reifen" @@ -159719,6 +159919,10 @@ msgstr "Welches Ding benutzen?" msgid "Select tank to siphon:" msgstr "" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/es_AR.po b/lang/po/es_AR.po index c6ff4fbaabf6a..37c461f0e73d0 100644 --- a/lang/po/es_AR.po +++ b/lang/po/es_AR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Miguel de Dios Matias , 2018\n" "Language-Team: Spanish (Argentina) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_AR/)\n" @@ -17132,10 +17132,10 @@ msgid "" "Having at least one of these is a prerequisite to using powered bionics. " "You will also need a power supply, found in another CBM." msgstr "" -"Un Módulo Compacto de Biónicos que incrementa tu almacenamiento de energía " -"en 100 unidades. Tener por lo menos uno de estos es un requisito para poder " -"usar biónicos que necesitan energía. También vas a necesitar una fuente de " -"energía, que es otro MCB." +"Es un Módulo Compacto de Biónicos que incrementa tu almacenamiento de " +"energía en 100 unidades. Tener por lo menos uno de estos es un requisito " +"para poder usar biónicos que necesitan energía. También vas a necesitar una " +"fuente de energía, que es otro MCB." #: lang/json/BIONIC_ITEM_from_json.py msgid "Power Storage CBM Mk. II" @@ -17151,8 +17151,8 @@ msgid "" "for the highly successful Power Storage CBM. Increases your power capacity " "by 250 units." msgstr "" -"Un Módulo Compacto de Biónicos diseñado en las industrias DoubleTech como " -"reemplazo del exitoso MCB Almacenamiento de energía. Incrementa tu " +"Es un Módulo Compacto de Biónicos diseñado en las industrias DoubleTech como" +" reemplazo del exitoso MCB Almacenamiento de energía. Incrementa tu " "almacenamiento de energía en 200 unidades." #: lang/json/BIONIC_ITEM_from_json.py @@ -17309,7 +17309,7 @@ msgid "" "A small module connected to your brain allows you to interface with nearby " "devices with wireless capabilities." msgstr "" -"Un pequeño módulo conectado a tu cerebro te permite interactuar con los " +"Es un pequeño módulo conectado a tu cerebro te permite interactuar con los " "dispositivos cercanos que se puedan controlar de manera inalámbrica." #: lang/json/BIONIC_ITEM_from_json.py @@ -32225,6 +32225,10 @@ msgstr "motor diésel" msgid "base gasoline engine" msgstr "motor a nafta" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "motor de vapor" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "motor de 1 cilindro" @@ -32332,6 +32336,147 @@ msgstr "" "Es un motor V12 enorme y extremadamente poderoso, usualmente utilizado en " "camiones grandes." +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "motor de vapor improvisado" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" +"Es un pequeño y primitivo motor de vapor. Una caldera integrada quema carbón" +" para calentar agua haciendo vapor, moviendo un vástago reciprocante. Un " +"condensador captura el agua, convirtiendo esto en un sistema cíclico " +"cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "motor chico de vapor" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Es un pequeño motor de vapor. Una caldera integrada quema carbón para " +"calentar agua haciendo vapor, moviendo un vástago reciprocante. Un " +"condensador captura el agua, convirtiendo esto en un sistema cíclico " +"cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "motor mediano de vapor" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" +"Es un motor de vapor de tamaño mediano. Una caldera integrada quema carbón " +"para calentar agua haciendo vapor, moviendo un vástago reciprocante. Un " +"condensador captura el agua, convirtiendo esto en un sistema cíclico " +"cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "motor grande de vapor" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Es un motor grande de vapor. Una caldera integrada quema carbón para " +"calentar agua haciendo vapor, moviendo un vástago reciprocante. Un " +"condensador captura el agua, convirtiendo esto en un sistema cíclico " +"cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "motor enorme de vapor" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Es un motor enorme de vapor. Una caldera integrada quema carbón para " +"calentar agua haciendo vapor, moviendo un vástago reciprocante. Un " +"condensador captura el agua, convirtiendo esto en un sistema cíclico " +"cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "turbina chica de vapor" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"Es una turbina chica de vapor. Una caldera integrada quema carbón para " +"calentar agua haciendo vapor, moviendo una turbina giratoria. Un condensador" +" captura el agua, convirtiendo esto en un sistema cíclico cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "turbina mediana de vapor" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Es una turbina de vapor de tamaño mediano. Una caldera integrada quema " +"carbón para calentar agua haciendo vapor, moviendo una turbina giratoria. Un" +" condensador captura el agua, convirtiendo esto en un sistema cíclico " +"cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "turbina grande de vapor" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"Es una turbina grande de vapor. Una caldera integrada quema carbón para " +"calentar agua haciendo vapor, moviendo una turbina giratoria. Un condensador" +" captura el agua, convirtiendo esto en un sistema cíclico cerrado." + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "turbina enorme de vapor" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"Es una turbina enorme de vapor. Una caldera integrada quema carbón para " +"calentar agua haciendo vapor, moviendo una turbina giratoria. Un condensador" +" captura el agua, convirtiendo esto en un sistema cíclico cerrado." + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -33524,8 +33669,8 @@ msgid "" "A module designed to receive many forms of signals. Useful for crafting " "communications equipment." msgstr "" -"Un módulo diseñado para recibir muchas formas de señales. Útil para fabricar" -" equipos de comunicación." +"Es un módulo diseñado para recibir muchas formas de señales. Útil para " +"fabricar equipos de comunicación." #: lang/json/GENERIC_from_json.py msgid "small LCD screen" @@ -40995,6 +41140,15 @@ msgstr "ARTEFACTOS" msgid "ARMOR" msgstr "ARMADURA" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "carbonera" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "Es un tacho para contener combustible sólido." + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "cinta cargadora" @@ -46402,7 +46556,7 @@ msgstr "langosta ninfa" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" "Es una langosta del tamaño de un conejo. Te da miedo pensar lo que sería un " @@ -47530,7 +47684,7 @@ msgstr "serpiente de cascabel gigante" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" "Es una serpiente de cascabel de la madera mutada, de unas tres veces más " "grande que la común. Aunque no es lo suficientemente grande como para " @@ -48412,8 +48566,8 @@ msgid "" "A huge mottled dinosaur with a blunt head crest. It contentedly strips " "leaves from a nearby shrub." msgstr "" -"Un enorme dinosaurio con manchas, con una cresta roma en la cabeza. Se la " -"pasa arrancando con satisfacción las hojas de los arbustos cercanos." +"Es un enorme dinosaurio con manchas, con una cresta roma en la cabeza. Se la" +" pasa arrancando con satisfacción las hojas de los arbustos cercanos." #: lang/json/MONSTER_from_json.py msgid "Dimorphodon" @@ -54970,7 +55124,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" +msgid_plural "pocket watches" msgstr[0] "reloj de bolsillo" msgstr[1] "relojes de bolsillo" @@ -70751,9 +70905,9 @@ msgid "" "A highly modular, selective fire battle rifle used by the US military. It " "uses either compact 20-round or bulkier 30-round detachable magazines." msgstr "" -"Un rifle de combate con muchos módulos y de disparo selectivo usado por el " -"ejército de Estados Unidos. Puede usar el cargador extraíble compacto de 20 " -"balas o el más grande de 30." +"Es un rifle de combate con muchos módulos y de disparo selectivo usado por " +"el ejército de Estados Unidos. Puede usar el cargador extraíble compacto de " +"20 balas o el más grande de 30." #: lang/json/gun_from_json.py msgid "medium machine gun" @@ -75447,6 +75601,10 @@ msgstr "Parte arreglada" msgid "Refill tank/battery" msgstr "Rellenar tanque/Cargar batería" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "Descargar carbonera" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "Quitar parte" @@ -89765,6 +89923,10 @@ msgstr "baño público" msgid "roadside foodcart" msgstr "carrito de comida de ruta" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "garage - estación de servicio" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "cementerio religioso" @@ -89980,15 +90142,15 @@ msgstr "granja de árboles" #: lang/json/overmap_terrain_from_json.py msgid "dirt road" -msgstr "" +msgstr "calle de tierra" #: lang/json/overmap_terrain_from_json.py msgid "rural house" -msgstr "" +msgstr "rancho" #: lang/json/overmap_terrain_from_json.py msgid "moonshine still" -msgstr "" +msgstr "destilador de moonshine" #: lang/json/overmap_terrain_from_json.py msgid "shooting range" @@ -90092,8 +90254,8 @@ msgid "stadium parking" msgstr "estacionamiento del estadio" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" -msgstr "kiosco del estadio" +msgid "stadium" +msgstr "estadio" #: lang/json/overmap_terrain_from_json.py msgid "stadium entrance" @@ -90160,8 +90322,8 @@ msgid "trailer park" msgstr "camping para casas rodantes" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" -msgstr "Fosa Común" +msgid "mass grave" +msgstr "fosa común" #: lang/json/overmap_terrain_from_json.py msgid "abandoned drive-through" @@ -90240,12 +90402,12 @@ msgid "Bankrupt Pizzeria" msgstr "Pizzería Bancarota" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" -msgstr "Alquiler de Botes" +msgid "boat rental" +msgstr "alquiler de botes" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" -msgstr "Casita del Río" +msgid "riverside dwelling" +msgstr "casita del río" #: lang/json/overmap_terrain_from_json.py msgid "municipal reactor" @@ -90450,15 +90612,23 @@ msgstr "estación eléctrica" #: lang/json/overmap_terrain_from_json.py msgid "animal clinic" -msgstr "" +msgstr "clínica animal" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" -msgstr "" +msgid "war memorial" +msgstr "monumento de guerra" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" -msgstr "" +msgid "ruined cabin - barn" +msgstr "cabaña en ruinas - granero" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "cabaña en ruinas - venta de autos" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" +msgstr "cabaña en ruinas - plaza" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -112899,7 +113069,7 @@ msgstr "brash." #: lang/json/terrain_from_json.py msgid "shrub" -msgstr "maleza" +msgstr "arbusto" #: lang/json/terrain_from_json.py msgid "blueberry bush" @@ -113051,7 +113221,7 @@ msgstr "montículo fúngico" #: lang/json/terrain_from_json.py msgid "fungal shrub" -msgstr "maleza fúngica" +msgstr "arbusto fúngico" #: lang/json/terrain_from_json.py msgid "fungal tree" @@ -114622,6 +114792,10 @@ msgstr "Transporte de K9 de Policía" msgid "SWAT Truck" msgstr "Camión de SWAT" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "Tractor Primitivo" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "Tractor Automático" @@ -116061,20 +116235,24 @@ msgid "external cargo rack" msgstr "estante externo de carga" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." -msgstr "" -"Es un motor de combustión. Quema combustible del tanque del vehículo para " -"moverlo, si es que tiene suficientes ruedas." +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "Es un motor de combustión. Quema combustible del tanque del vehículo." + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "Es un motor de combustión. Quema gasoil del tanque del vehículo." + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." +msgstr "Es un motor de combustión. Quema nafta del tanque del vehículo." #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" -"Es un motor de combustión. Quema nafta del tanque del vehículo para moverlo," -" si es que tiene suficientes ruedas." +"Es un motor de vapor de combustión externa, con ciclo cerrado. Quema carbón " +"de la carbonera del vehículo para producir vapor." #: lang/json/vehicle_part_from_json.py msgid "boom crane" @@ -116470,6 +116648,17 @@ msgstr "tanque externo (200L)" msgid "barrel (100L)" msgstr "barril (100L)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" +"Es un espacio de almacenamiento para combustible sólido. Si se lo llena con " +"el combustible apropiado para el motor del vehículo, el motor lo usará " +"automáticamente cuando está encendido." + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "lanzallamas montado" @@ -117869,6 +118058,14 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "Es un blobo vivo que funciona como un arma grande de vehículo." +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" +"Es una turbina de vapor de combustión externa, con ciclo cerrado. Quema " +"carbón de la carbonera del vehículo para producir vapor." + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -118038,7 +118235,7 @@ msgstr "barrera de diamante" #. ~ Description for diamond barrier #: lang/json/vehicle_part_from_json.py msgid "A transparent, solid sheet of self-sustaining crystals." -msgstr "" +msgstr "Es una lámina sólida y transparente de cristales autosostenidos." #. ~ Description for diamond frame #: lang/json/vehicle_part_from_json.py @@ -118047,6 +118244,9 @@ msgid "" "mounted on it, and it can be attached to other frames to increase the " "vehicle's size." msgstr "" +"Es una estructura de cristal super-fuerte. Se pueden poner otras partes del " +"vehículo en ella, y puede ser unida a otras estructuras para incrementar el " +"tamaño del vehículo." #. ~ Description for diamond plating #: lang/json/vehicle_part_from_json.py @@ -118054,6 +118254,8 @@ msgid "" "Transparent crystal armor plate. Will partially protect other components on" " the same frame from damage." msgstr "" +"Es una placa de cristal transparente. Protege parcialmente otros componentes" +" que estén en el mismo lugar de la estructura." #: lang/json/vehicle_part_from_json.py msgid "cargo dimension" @@ -119018,7 +119220,7 @@ msgstr "Araste cada espacio que pudiste." #: src/activity_handlers.cpp msgid "You planted all seeds you could." -msgstr "" +msgstr "Plantaste todas las semillas que pudiste." #: src/activity_item_handling.cpp #, c-format @@ -121050,8 +121252,8 @@ msgid "" "You might plug in your solar pack to the cable charging system, if you " "unfold it." msgstr "" -"Podrías conectar tu pack solar a los cables del sistema de carga, si lo " -"desplegás. " +"Podrías conectar tu pack solar a tu sistema de cables de carga, si lo " +"desplegás." #: src/bionics.cpp #, c-format @@ -121899,17 +122101,17 @@ msgstr "Pierna Der." #: src/character.cpp #, c-format msgid "(bandaged [%s] & disinfected [%s])" -msgstr "" +msgstr "(vendado [%s] & desinfectado [%s])" #: src/character.cpp #, c-format msgid "(bandaged [%s])" -msgstr "" +msgstr "(vendado [%s])" #: src/character.cpp #, c-format msgid "(disinfected [%s])" -msgstr "" +msgstr "(desinfectado [%s])" #: src/character.cpp #, c-format @@ -122088,11 +122290,11 @@ msgstr "Granja: Terreno" #: src/clzones.cpp msgid "No seed" -msgstr "" +msgstr "Sin semilla" #: src/clzones.cpp msgid "Plant seed: " -msgstr "" +msgstr "Semilla de planta:" #: src/clzones.cpp msgid "Zone name:" @@ -123639,15 +123841,15 @@ msgstr "¡Puaj! ¿Cómo puede ser que alguien coma esto?" #: src/consumption.cpp msgid "Mmm, junk food." -msgstr "" +msgstr "Mmm, comida chatarra." #: src/consumption.cpp msgid "When life's got you down, there's always sugar." -msgstr "" +msgstr "Cuando la vida te trata mal, siempre te queda el azúcar." #: src/consumption.cpp msgid "They may do what they must... you've already won." -msgstr "" +msgstr "Tal vez hagan lo que tengan que hacer... vos ya ganaste." #: src/consumption.cpp msgid "Your stomach begins gurgling and you feel bloated and ill." @@ -123946,7 +124148,8 @@ msgstr[1] "Necesitás un/a %s con %d cargas." #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "No importa." @@ -124284,6 +124487,42 @@ msgstr "Golpeaste %s causando %d de daño." msgid "%1$s shoots %2$s." msgstr "%1$s le dispara a %2$s." +#: src/creature.cpp +msgid "Severe pain" +msgstr "Dolor severo" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "Dolor intenso" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "Dolor insoportable" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "Dolor inquietante" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "Dolor molesto" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "Dolor moderado" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "Dolor leve" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "Dolor mínimo" + +#: src/creature.cpp +msgid "No pain" +msgstr "Sin dolor" + #: src/creature.cpp msgid "Hostile" msgstr "Hostil" @@ -126013,22 +126252,22 @@ msgstr "pero no causa ningún daño" #, c-format msgid "You are hit by %s bomb fragment, %s." msgid_plural "You are hit by %s bomb fragments, %s." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Fuiste alcanzado/a por %s fragmento de bomba, %s." +msgstr[1] "Fuiste alcanzado/a por %s fragmentos de bomba, %s." #: src/explosion.cpp #, c-format msgid " is hit by %s bomb fragment, %s." msgid_plural " is hit by %s bomb fragments, %s." -msgstr[0] "" -msgstr[1] "" +msgstr[0] " es alcanzado/a por %s fragmento de bomba, %s." +msgstr[1] " es alcanzado/a por %s fragmentos de bomba, %s." #: src/explosion.cpp #, c-format msgid "The %s is hit by %s bomb fragment, %s." msgid_plural "The %s is hit by %s bomb fragments, %s." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "El %s es alcanzado por %s fragmento de bomba, %s." +msgstr[1] "El %s es alcanzado por %s fragmentos de bomba, %s." #: src/faction.cpp msgid "Devoted" @@ -127716,7 +127955,7 @@ msgstr "gas denso fungicida" #: src/field.cpp msgid "smoke vent" -msgstr "" +msgstr "salida de humo" #: src/field.cpp msgid "Man, that smells like some good shit!" @@ -128031,11 +128270,11 @@ msgstr "Últimas palabras: %s" #: src/game.cpp msgid "Keep world" -msgstr "" +msgstr "Mantener mundo" #: src/game.cpp msgid "Reset world" -msgstr "" +msgstr "Resetear mundo" #: src/game.cpp #, c-format @@ -128046,15 +128285,15 @@ msgstr "Mundo retenido. Personajes que quedan:%s" msgid "Wait till you wake up..." msgstr "Esperá a que te despiertes..." -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "(Y)-Sí, (N)o, (I)gnorar otras distracciones y terminar." - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s. Auto-moverse cancelado" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "(Y)-Sí, (N)o, (I)gnorar distracciones similares y terminar." + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -128223,7 +128462,7 @@ msgstr "Auto-moverse cancelado" #: src/game.cpp #, c-format msgid "Unknown command: \"%s\" (%ld)" -msgstr "" +msgstr "Comando desconocido: \"%s\" (%ld)" #: src/game.cpp msgid "You can't open things while you're in your shell." @@ -128421,7 +128660,7 @@ msgstr "¿Guardar y salir?" #: src/game.cpp #, c-format msgid "Auto %1$s is now %2$s." -msgstr "" +msgstr "Auto %1$s ahora es %2$s." #: src/game.cpp msgid "Debug mode ON!" @@ -128471,7 +128710,7 @@ msgstr "información de clima" #: src/game.cpp msgid "player memorial" -msgstr "memorial de jugadores" +msgstr "monumento de jugadores" #: src/game.cpp msgid "uistate data" @@ -128636,6 +128875,8 @@ msgid "" "Current turn: %d.\n" "%s\n" msgstr "" +"Turno actual: %d.\n" +"%s\n" #: src/game.cpp #, c-format @@ -128799,6 +129040,8 @@ msgstr "TOTAL DE MUERTES: %d" #: src/game.cpp msgid " You are forgotten among the billions lost in the cataclysm..." msgstr "" +" Quedas olvidado entre los miles de millones perdidos en el " +"cataclismo..." #: src/game.cpp msgid "" @@ -128806,6 +129049,10 @@ msgid "" "their resources in a handful of fortified bases along the coast. Without " "the men or material to rebuild, the soldiers that remained lost all hope..." msgstr "" +" Atrapados en una batalla interminable, la Vieja Guardia fue forzada a " +"juntar sus recursos en un puñado de bases fortificadas a lo largo de la " +"costa. Sin los hombres o los materiales para reconstruir, los soldados que " +"quedaron ya perdieron las esperanzas..." #: src/game.cpp msgid "" @@ -128817,6 +129064,13 @@ msgid "" "the years past, little materialized from the hopes of rebuilding " "civilization..." msgstr "" +" La resolución de algunos supervivientes luego del cataclismo mantuvo los" +" despojos de lo que una vez fue un glorioso sindicato. Estimulados por " +"pequeños éxitos, un grupo de operaciones para reconquistar instalaciones " +"fueron logrados con un éxito limitado. Eventualmente fueron forzados a armar" +" bases grandes, y la Vieja Guardia dejó esas instalaciones en las manos de " +"unos pocos sobrevivientes que quedaron. Al paso de unos años, poco se pudo " +"materializar de las esperanzas por reconstruir la civilización..." #: src/game.cpp msgid "" @@ -128825,6 +129079,11 @@ msgid "" "craftsmen dispersed to found new colonies but most became victims of " "marauding bandits. Those who survived never found a place to call home..." msgstr "" +" La vida en el refugio se fue deteriorando a medida que la comida fue " +"escasa y las enfermedades destruyeron toda esperanza de mantener un lugar " +"civilizado. Los comerciantes y artesanos se dispersaron para encontrar " +"nuevas colonias, pero la mayoría fue víctima de bandidos saqueadores. " +"Aquellos que sobrevivieron nunca encontraron un lugar para llamar hogar..." #: src/game.cpp msgid "" @@ -128834,6 +129093,11 @@ msgid "" "stories of the old days when food was abundant and the children were allowed" " to play in the sun..." msgstr "" +" Los Mercaderes Libres lucharon por años para poder mantenerse " +"alimentados, pero sus rutas de comercio fueron atacadas por bandidos. A las " +"primeras generaciones nacidas entre la mugre luego del cataclismo, le " +"cuentan historias de los viejos días cuando la comida era abundante y los " +"niños podían salir a jugar al sol..." #: src/game.cpp msgid "" @@ -128842,6 +129106,10 @@ msgid "" "their support. When the exhausted migrants returned to the refugee center " "they were turned away to face the world on their own." msgstr "" +" El incipiente puesto fue abandonado unos meses después. Las amenazas " +"externas combinadas con la baja cosecha, hicieron que los Mercaderes Libres " +"retiraran su ayuda. Cuando los extenuados migrantes volvieron al refugio, " +"fueron enviados a enfrentar el mundo por su propia cuenta." #: src/game.cpp msgid "" @@ -128851,6 +129119,12 @@ msgid "" "of the Free Merchants. Hard labor for little reward remained the price to " "be paid for those who sought the safety of the community." msgstr "" +" La comunidad siguió creciendo rápidamente a lo largo de los años, a " +"pesar de las amenazas externas constantes. Mientras mantenía su reputación " +"de paraíso para los ciudadanos obedientes a las leyes, el liderazgo de la " +"comunidad se mantuvo leal a los intereses de los Mercaderes Libres. Trabajo " +"duro a cambio de poco fue el precio que tuvieron que pagar aquellos que " +"buscaron la seguridad de la comunidad." #: src/game.cpp msgid "" @@ -128859,6 +129133,11 @@ msgid "" "monstrosities that had adapted to live in their world, those who did survive" " lived in dejected poverty and hopelessness..." msgstr "" +" Los solitarios grupos de sobrevivientes que vagaron el mundo ahora " +"alienígena, menguaron en número a lo largo de los años. Incapaces de " +"competir con las monstruosidades que se adaptar a la vida de este mundo, " +"aquellos que sobrevivieron viven en la pobreza desmoralizante y sin " +"esperanza..." #: src/game.cpp msgid "" @@ -128869,6 +129148,13 @@ msgid "" "fringes of where civilization once ended, bands of hunter-gatherers began to" " adopt agrarian lifestyles in fortified enclaves..." msgstr "" +" Los cartoneros que florecieron en los primeros días del cataclismo, " +"encontraron un problema creciente para encontrar equipamiento del viejo " +"mundo. Enormes hordas hicieron imposible entrar en las ciudades a la vez que" +" horrores espeluznantes aparecieron misteriosamente cerca de los viejos " +"laboratorios de investigación. Pero en los límites de lo que la civilización" +" fue alguna vez, grupos de cazadores-recolectores comenzaron a adoptar la " +"vida agraria en enclaves fortificados..." #: src/game.cpp msgid "" @@ -128879,6 +129165,13 @@ msgid "" "infighting erupted into civil war but there were few survivors left to " "celebrate their destruction." msgstr "" +" Los piratas crecieron en poder más que cualquier otro bando mientras la " +"Vieja Guardia fue destruida por la contrición. Los despiadados hombres y " +"mujeres que se juntaron para robarle a los refugiados y saquear " +"asentamientos, pronto se encontraron sin víctimas para poder sobrevivir. Los" +" Piratas del Infierno fueron destruidos eventualmente cuando las peleas " +"internas se convirtieron en guerra civil, pero pocos quedaron vivos como " +"para festejar su destrucción." #: src/game.cpp msgid "" @@ -128889,6 +129182,13 @@ msgid "" "leadership of the faction. When only one warlord finally secured control, " "there was nothing left to fight for... just endless cities full of the dead." msgstr "" +" Alimentados por las drogas y la ira, los Piratas del Infierno lucharon " +"con uñas y dientes para derrocar las últimas fortalezas del a Vieja Guardia." +" Las costosas victorias les dieron a los caudillos territorio y esclavos " +"abundantes pero nada en pos de la estabilidad. En semanas, las peleas " +"internas llevaron a la guerra civil cuando las tribus compitieron por el " +"liderazgo del bando. Cuando finalmente un caudillo se quedó con el control, " +"ya no había nada por lo que luchar... solo ciudades llenas de muertos." #: src/game.cpp #, c-format @@ -128910,11 +129210,11 @@ msgstr "Bajo tierra" #: src/game.cpp msgid "Weather:" -msgstr "" +msgstr "Clima:" #: src/game.cpp msgid "Temperature:" -msgstr "" +msgstr "Temperatura:" #: src/game.cpp #, c-format @@ -128938,7 +129238,7 @@ msgstr "¡%s encontrado! " #: src/game.cpp #, c-format msgid "We have detected a %s - an enemy of the Mycus!" -msgstr "" +msgstr "Hemos detectado un/a %s - ¡un enemigo del Mycus!" #: src/game.cpp msgid "Our fibers strain with renewed wrath!" @@ -129013,7 +129313,7 @@ msgstr "¡Te alcanzó la onda sísmica!" #: src/game.cpp #, c-format msgid "Nothing at (%d,%d,%d) to knockback!" -msgstr "" +msgstr "¡No hay nada en (%d,%d,%d) para empujar!" #: src/game.cpp #, c-format @@ -129100,7 +129400,7 @@ msgstr "Necesitás ponerte los lentes para poder leer la pantalla." #: src/game.cpp msgid "The console doesn't display anything coherent." -msgstr "" +msgstr "La consola no muestra nada coherente." #: src/game.cpp #, c-format @@ -129133,7 +129433,7 @@ msgstr "¡La explosión del PEM deja frito el %s!" #: src/game.cpp #, c-format msgid "The %s's electrical field momentarily goes out!" -msgstr "" +msgstr "¡El campo elécrtrico del %s se apaga momentáneamente!" #: src/game.cpp #, c-format @@ -129205,20 +129505,20 @@ msgstr "¡Ahí no hay nada para destrozar!" #: src/game.cpp msgid "There is no compatible zone nearby." -msgstr "" +msgstr "No hay una zona compatible cerca." #: src/game.cpp #, c-format msgid "Compatible zones are %s and %s" -msgstr "" +msgstr "Las zonas compatbiles son %s y %s" #: src/game.cpp msgid "Pick action:" -msgstr "" +msgstr "Elegir acción:" #: src/game.cpp msgid "Sort out my loot" -msgstr "" +msgstr "Ordenar mis cosas" #: src/game.cpp msgid "" @@ -129226,40 +129526,46 @@ msgid "" " Uses empty space in your inventory or utilizes a cart, if you are holding " "one." msgstr "" +"Ordena las cosas de la zona Cosas: Desordenadas y las pone en zonas " +"apropiadas de cosas. Utiliza los espacios libres en tu inventario o un " +"changuito, si tenés uno." #: src/game.cpp msgid "Till farm plots" -msgstr "" +msgstr "Arar campos" #: src/game.cpp msgid "Till farm plots... you need a tool to dig with" -msgstr "" +msgstr "Arar campos... necesitás una herramienta para cavar" #: src/game.cpp msgid "Tills nearby Farm: Plot zones." -msgstr "" +msgstr "Arar zonas cercanas de Granja: Lote." #: src/game.cpp msgid "Plant seeds... it is too cold for planting" -msgstr "" +msgstr "Plantar semillas... hace demasiado frío para plantar" #: src/game.cpp msgid "Plant seeds" -msgstr "" +msgstr "Plantar semillas" #: src/game.cpp msgid "Plant seeds... you don't have any" -msgstr "" +msgstr "Plantar semillas... no tenés semillas" #: src/game.cpp msgid "" "Plant seeds into nearby Farm: Plot zones. Farm plot has to be set to " "specific plant seed and you must have seeds in your inventory." msgstr "" +"Plantar semillas en zonas cercanas de Granja: Lote. Los lotes de granja " +"tienen que ser establecidos para semillas específicas y tenés que tener las " +"semillas en tu inventario." #: src/game.cpp msgid "You need a tool to dig with." -msgstr "" +msgstr "Necesitás una herramienta para cavar." #: src/game.cpp src/iexamine.cpp src/mission_companion.cpp #: src/vehicle_part.cpp @@ -129268,7 +129574,7 @@ msgstr "Hace demasiado frío para poder plantar algo ahora." #: src/game.cpp msgid "You don't have any seeds." -msgstr "" +msgstr "No tenés semillas." #: src/game.cpp msgid "You pull a handbrake." @@ -129485,7 +129791,7 @@ msgstr "¡%s no tiene adonde ir!" msgid "Use which item?" msgstr "¿Qué objeto querés usar?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "No importa" @@ -129499,41 +129805,47 @@ msgstr "¿Qué querés examinar?" #: src/game.cpp msgid "There is a fire here." -msgstr "" +msgstr "Hay un fuego acá." #: src/game.cpp msgid "It's too big and unpredictable to evaluate how long it will last." -msgstr "" +msgstr "Es demasiado grande e impredecible para evaluar cuánto tiempo durará." #: src/game.cpp msgid "It's going to go out soon without extra fuel." -msgstr "" +msgstr "Se va a apagar pronto sin más combustible." #: src/game.cpp #, c-format msgid "" "Without extra fuel it might burn yet for %s, but might also go out sooner." -msgstr "" +msgstr "Sin más combustible puede durar %s, pero se puede apagar antes." #: src/game.cpp msgid "" "It's quite decent and looks like it'll burn for a bit without extra fuel." msgstr "" +"Está bastante bien y parece que puede arder por un rato aunque no se le " +"agregue más combustible." #: src/game.cpp msgid "It's looks solid, and will burn for a few hours without extra fuel." msgstr "" +"Se ve firme y va a seguir ardiendo por unas horas aunque no se le agregue " +"más combustible." #: src/game.cpp msgid "" "It's very well supplied and even without extra fuel might burn for at least " "s part of a day." msgstr "" +"Está bien alimentado y aunque no se le agregue nada más, puede seguir " +"ardiendo por gran parte del día." #: src/game.cpp #, c-format msgid "Without extra fuel it will burn for %s." -msgstr "" +msgstr "Sin más combustible puede durar %s." #: src/game.cpp msgid "You can't do that while driving." @@ -129681,11 +129993,11 @@ msgstr "Editar tipo" #: src/game.cpp msgid "Edit options" -msgstr "" +msgstr "Editar opciones" #: src/game.cpp msgid "Edit position" -msgstr "" +msgstr "Editar posición" #: src/game.cpp msgid "No Zones defined." @@ -130049,19 +130361,21 @@ msgid "" "You are not in the mood and the prospect of guts and blood on your hands " "convinces you to turn away." msgstr "" +"No estás con ganas y pensar en tripas y sangre en tus manos te convence de " +"alejarte." #: src/game.cpp msgid "" "You are not in the mood and the prospect of work stops you before you begin." -msgstr "" +msgstr "No tenés ganas y pensar en el trabajo te frena antes de empezar." #: src/game.cpp msgid "Choose type of butchery:" -msgstr "" +msgstr "Elegir manera de carnear:" #: src/game.cpp msgid "Quick butchery" -msgstr "" +msgstr "Carnear rápido" #: src/game.cpp msgid "" @@ -130070,10 +130384,14 @@ msgid "" " but it's useful if you don't want to set up a workshop. Prevents zombies " "from raising." msgstr "" +"Esta técnica se usa cuando estás apurado, pero igual querés conseguir algo " +"del cuerpo. Lo que consigas será poco porque no estás intentando ser " +"preciso, pero es útil si no tenés armado un lugar para carnear. Evita que " +"los zombis se vuelvan a levantar." #: src/game.cpp msgid "Full butchery" -msgstr "" +msgstr "Carnear completo" #: src/game.cpp msgid "" @@ -130082,10 +130400,14 @@ msgid "" " etc.) and good tools. Yields are plentiful and varied, but it is time " "consuming." msgstr "" +"Esta técnica se usa para carnear apropiadamente un cadáver, y requiere una " +"soga y un árbol o un soporte, una superficie plana (como una mesa, una lona " +"de cuero, etc.) y buenas herramientas. Vas a conseguir varias cosas, pero te" +" lleva más tiempo." #: src/game.cpp msgid "Field dress corpse" -msgstr "" +msgstr "Preparar cadáver" #: src/game.cpp msgid "" @@ -130094,6 +130416,10 @@ msgid "" "lighter and will stay fresh longer. Can be combined with other methods for " "better effects." msgstr "" +"Esta técnica se usa para quitar los órganos internos y las víscera para " +"proteger el cadáver y que no se pudra desde adentro. Vas a conseguir los " +"órganos internos. La carcasa será más liviana y se mantendrá por más tiempo." +" Puede ser combinada con otros métodos para obtener mejores resultados." #: src/game.cpp msgid "" @@ -130102,10 +130428,14 @@ msgid "" "This action destroys skin, hide, pelt, etc., so don't use it if you want to " "harvest them later." msgstr "" +"Al descuartizar un cadáver previamente preparado, vas a conseguir cuatro " +"partes con menor peso y volumen. Puede ser útil para transportar cuerpos " +"grandes. Esta acción destruye la piel, el pellejo, el pelaje, etc., así que " +"no lo uses si necesitas algunas de esas cosas." #: src/game.cpp msgid "Quarter corpse" -msgstr "" +msgstr "Descuartizar cadáver" #: src/game.cpp msgid "" @@ -130114,14 +130444,18 @@ msgid "" "tools, ruins corpse, and consumes lot of time. Your medical knowledge is " "most useful here." msgstr "" +"Con una disección cuidadosa del cadáver, vas a buscar por posibles implantes" +" de biónicos, y lograr sacarlos si es posible. Requiere una herramienta " +"similar a un escalpelo, te lleva mucho tiempo y arruina el cadáver. Tu " +"conocimiento médico es lo que más necesitas para esto." #: src/game.cpp msgid "Dissect corpse" -msgstr "" +msgstr "Diseccionar cadáver" #: src/game.cpp msgid "You're too full to eat the underbrush." -msgstr "" +msgstr "Estás demasiado lleno como para comerte la maleza." #: src/game.cpp msgid "You eat the underbrush." @@ -130269,7 +130603,7 @@ msgstr "Escribí la oración que vas a gritar" #: src/game.cpp #, c-format msgid "You yell, \"%s\"" -msgstr "" +msgstr "Gritás, \"%s\"" #: src/game.cpp msgid "You can't drive the vehicle from here. You need controls!" @@ -130330,6 +130664,8 @@ msgid "" "Spotted %1$s--safe mode is on! (%2$s to turn it off, %3$s to ignore " "monster%4$s)" msgstr "" +"Encontraste un/a %1$s--¡el modo seguro está activado! (%2$s para " +"desactivarlo, %3$s para ignorar el monstruo %4$s)" #: src/game.cpp #, c-format @@ -130372,17 +130708,17 @@ msgstr "" #: src/game.cpp #, c-format msgid "You start breaking the %1$s with your %2$s." -msgstr "" +msgstr "Empezás a romper el/a %1$s con tu %2$s." #: src/game.cpp #, c-format msgid "Your %s doesn't turn on." -msgstr "" +msgstr "Tu %s no se enciende." #: src/game.cpp #, c-format msgid "You start tearing into the %s with your teeth and claws." -msgstr "" +msgstr "Empezás a abrirte paso en el/a %s con tus garras y dientes." #: src/game.cpp msgid "You cannot pull yourself away from the faultline..." @@ -130502,7 +130838,7 @@ msgstr "El cartel dice: %s" #: src/game.cpp msgid "There is a sign here, but you are unable to read it." -msgstr "" +msgstr "Hay un cartel acá, pero no podés leerlo." #: src/game.cpp #, c-format @@ -130511,7 +130847,7 @@ msgstr "Escrito acá: %s" #: src/game.cpp msgid "Something is written here, but you are unable to read it." -msgstr "" +msgstr "Hay algo escrito acá, pero no podés leerlo." #: src/game.cpp #, c-format @@ -130682,7 +131018,7 @@ msgstr "¡Necesitás respirar pero no podés nadar! ¡Salí del agua, rápido!" #: src/game.cpp msgid "No hostile creature in reach. Waiting a turn." -msgstr "" +msgstr "No hay criaturas hostiles al alcance. Se va a esperar un turno." #: src/game.cpp msgid "You dive into water." @@ -130777,12 +131113,16 @@ msgid "" "There is a LOT of heat coming out of there, even the stairs have melted " "away. Jump down? You won't be able to get back up." msgstr "" +"Se siente MUCHO calor saliendo de ahí, incluso las escaleras se derritieron." +" ¿Querés saltar? No vas a poder volver a subir." #: src/game.cpp msgid "" "There is a LOT of heat coming out of there. Push through the half-molten " "rocks and ascend? You will not be able to get back down." msgstr "" +"Se siente MUCHO calor saliendo de ahí. ¿Querés abrirte paso por las piedras " +"derretidas y subir? No vas a poder volver a bajar." #: src/game.cpp msgid "Halfway down, the way down becomes blocked off." @@ -131055,7 +131395,7 @@ msgstr "Sentís cómo se descompone tu cuerpo." #: src/game.cpp msgid "You feel fatigue seeping into your body." -msgstr "" +msgstr "Sentís el cansancio metiéndose en tu cuerpo." #: src/game.cpp #, c-format @@ -131105,7 +131445,7 @@ msgstr "Sentís que tu espalda está más fuerte." #: src/game.cpp msgid "You feel a pleasant tingle." -msgstr "" +msgstr "Sentís un hormigueo placentero." #: src/game.cpp msgid "You feel hungry." @@ -131347,8 +131687,8 @@ msgstr "ACCIÓN" #, c-format msgid "Needs at least %d charge" msgid_plural "Needs at least %d charges" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Necesita por lo menos %d carga" +msgstr[1] "Necesita por lo menos %d cargas" #: src/game_inventory.cpp msgid "Use item" @@ -131650,11 +131990,11 @@ msgstr "c: Ver" #: src/help.cpp msgid "d: Hunger, thirst, and sleep" -msgstr "" +msgstr "d: Hambre, sed y sueño" #: src/help.cpp msgid "e: Pain and stimulants" -msgstr "" +msgstr "e: Dolor y estimulantes" #: src/help.cpp msgid "f: Addiction" @@ -131662,11 +132002,11 @@ msgstr "f: Adicciones" #: src/help.cpp msgid "g: Morale and learning" -msgstr "" +msgstr "g: Moral y aprendizaje" #: src/help.cpp msgid "h: Radioactivity and mutation" -msgstr "" +msgstr "h: Radiactividad y mutaciones" #: src/help.cpp msgid "i: Bionics" @@ -131690,7 +132030,7 @@ msgstr "m: Combate" #: src/help.cpp msgid "n: Unarmed styles" -msgstr "" +msgstr "n: Estilos de lucha desarmada" #: src/help.cpp msgid "o: Survival tips" @@ -131714,7 +132054,7 @@ msgstr "3: Descripción de las clases de armas" #: src/help.cpp msgid "4: Frequently Asked Questions (some spoilers!)" -msgstr "" +msgstr "4: Preguntas más frecuentes (¡tiene spoilers!)" #: src/help.cpp msgid " " @@ -131843,6 +132183,10 @@ msgid "" "roles in this process. Named coefficients are measured in the range from " "0%% (which means terrible inefficiency) to 100%% (ideal conditions)." msgstr "" +"Cuando te conviertas en un habilidoso mecánico, vas a querer tunear tu auto." +" Los coeficientes de aerodinamia, fricción y eficiencia de masa juegan roles" +" importantes en el proceso. Los coeficientes mencionados se miden en un " +"rango desde 0%% (terriblemente ineficiente) a 100%% (condiciones ideales)." #: src/help.cpp msgid "" @@ -132247,6 +132591,13 @@ msgid "" " Many bionic canisters are difficult to find, but may be purchased from " "certain wandering vagabonds for a very high price." msgstr "" +"Los biónicos vienen en recipientes listos para instalar. Es mejor dejar que " +"la instalación de un biónico la realice un profesional entrenado o un " +"aparato médico especializado. Usar maquinaria para manipular biónicos " +"requiere grandes niveles de inteligencia, y conocimiento en primeros " +"auxilios, mecánica y electrónica. ¡Tené cuidado porque una falla puede " +"dejarte lisiado! Muchos biónicos son difíciles de encontrar, pero pueden " +"comprarse a algunos vagabundos errantes por un precio muy alto." #: src/help.cpp msgid "" @@ -132256,6 +132607,11 @@ msgid "" "than its installation; and as well as installation, this non-trivial " "surgical procedure requires anesthesia." msgstr "" +"Como te habrás dado cuenta, todas las partes de tu cuerpo tiene un lugar " +"limitado para tener biónicos, así que tenés que elegir sabiamente qué " +"biónicos instalar. Claro que los biónicos pueden ser sacados de tu cuerpo " +"pero es tan difícil como su instalación; y así como la instalación, este " +"procedimiento quirúrgico poco común requiere anestesia." #: src/help.cpp msgid "" @@ -132568,6 +132924,11 @@ msgid "" ".270 = .30-06,\n" ".40 S&W = 10mm." msgstr "" +"Mientras que los cargadores son a menudo específicos para un arma, en algunas ocasiones un cargador puede ser compatible con varias. Las armas que están en el juego reflejan los prototipos reales en términos de calibre y compatibilidad. Acá hay unos ejemplos de munición intercambiable:\n" +".308 = 7.62x51mm,\n" +".223 = 5.56 NATO,\n" +".270 = 30-06,\n" +".40 S&W = 10mm." #: src/help.cpp msgid "Magazine descriptions also list the compatible ammo." @@ -133193,6 +133554,8 @@ msgid "" "Q: I have a question that's not addressed here. How can I get an answer?\n" "A: Ask the helpful people on the forum at discourse.cataclysmdda.org or at the IRC channel #CataclysmDDA on freenode." msgstr "" +"P: Tengo una pregunta que acá no está. ¿Dónde me la pueden responder?\n" +"R: Preguntale a alguna de las personas serviciales del foro, en discourse.cataclysmdda.org o en el canal de IRC #CataclysmDDA en la red freenode." #: src/help.cpp msgid " HELP " @@ -133234,6 +133597,8 @@ msgid "" "Welcome to the C.C.B.o.t.T. ATM. What would you like to do?\n" "Your current balance is: %s" msgstr "" +"Bienvenido al Cajero Automático del C.C.B. ¿Qué operación querés realizar?\n" +"Tu saldo actual es: %s" #: src/iexamine.cpp msgid "Purchase cash card?" @@ -133271,7 +133636,7 @@ msgstr "Transferir Todo el Dinero" #: src/iexamine.cpp #, c-format msgid "Your account now holds %s." -msgstr "" +msgstr "Tu cuenta ahora tiene %s." #: src/iexamine.cpp msgid "This will automatically deduct $1.00 from your bank account. Continue?" @@ -133307,7 +133672,7 @@ msgstr "¡Necesitás una tarjeta de crédito cargada para comprar cosas!" #: src/iexamine.cpp #, c-format msgid "Money left: %s" -msgstr "" +msgstr "Dinero disponible: %s" #: src/iexamine.cpp msgid "That item is too expensive!" @@ -133376,15 +133741,15 @@ msgstr "¿Querés trepar ese %s?" #: src/iexamine.cpp msgid "You vault over the obstacle with ease." -msgstr "" +msgstr "Saltas sobre el obstáculo con facilidad." #: src/iexamine.cpp msgid "You vault over the obstacle." -msgstr "" +msgstr "Saltás sobre el obstáculo." #: src/iexamine.cpp msgid "Climbing this obstacle is trivial for one such as you." -msgstr "" +msgstr "Trepar este obstáculo es fácil para alguien como vos." #: src/iexamine.cpp msgid "You quickly scale the fence." @@ -133392,7 +133757,7 @@ msgstr "Trepás rápidamente la valla." #: src/iexamine.cpp msgid "This obstacle is no match for your freerunning abilities." -msgstr "" +msgstr "Este obstáculo no es nada para tus habilidades en freerunning." #: src/iexamine.cpp msgid "You slip while climbing and fall down again." @@ -133400,7 +133765,7 @@ msgstr "Te resbalás mientras trepabas y te caés de nuevo." #: src/iexamine.cpp msgid "Climbing this obstacle is impossible in your current state." -msgstr "" +msgstr "Es imposible trepar este obstáculo en tu estado actual." #: src/iexamine.cpp #, c-format @@ -133704,7 +134069,7 @@ msgstr "¿Qué semilla querés usar?" #: src/iexamine.cpp #, c-format msgid "Planted %s." -msgstr "" +msgstr "Plantaste %s." #: src/iexamine.cpp msgid "You have no seeds to plant." @@ -133804,17 +134169,17 @@ msgstr "Acá hay una fosa de carbonización." #, c-format msgid "It will finish burning in about %d hour." msgid_plural "It will finish burning in about %d hours." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Va a terminar de arder en más o menos %d hora." +msgstr[1] "Va a terminar de arder en unas %d horas." #: src/iexamine.cpp msgid "It will finish burning in less than an hour." -msgstr "" +msgstr "Va a terminar de arder en menos de una hora." #: src/iexamine.cpp #, c-format msgid "It should take about %d minutes to finish burning." -msgstr "" +msgstr "Debería tardar unos %d minutos en terminar de arder." #: src/iexamine.cpp msgid "You have no brew to ferment." @@ -134056,7 +134421,7 @@ msgstr "Buscás algo para comer en el/a %s." #: src/iexamine.cpp msgid "Recycle what metal?" -msgstr "" +msgstr "¿Qué metal querés reciclar?" #. ~ %1$s: an item in the compactor , %2$s: desired compactor output material #: src/iexamine.cpp @@ -134065,6 +134430,8 @@ msgid "" "You realize this isn't going to work because %1$s is not made purely of " "%2$s." msgstr "" +"Te das cuenta de que no va a funcionar porque el/a %1$s no está hecho " +"puramente de %2$s." #. ~ %1$s: an item in the compactor #: src/iexamine.cpp @@ -134073,6 +134440,8 @@ msgid "" "You realize this isn't going to work because %1$s has not been emptied of " "its contents." msgstr "" +"Te das cuenta de que no va a funcionar porque el/a %1$s todavía tiene algo " +"en su interior." #. ~ %1$s: desired compactor output material #: src/iexamine.cpp @@ -134081,19 +134450,21 @@ msgid "" "There is no %1$s in the compactor. Drop some metal items onto it and try " "again." msgstr "" +"No hay %1$s en la compactadora. Poné algunos objetos de metal y probá de " +"nuevo." #. ~ %1$.3f: total mass of material in compactor, %2$s: weight units , %3$s: #. compactor output material #: src/iexamine.cpp #, c-format msgid "Compact %1$.3f %2$s of %3$s into:" -msgstr "" +msgstr "Compactar %1$.3f %2$s de %3$s en:" #. ~ %1$d: number of, %2$s: output item #: src/iexamine.cpp #, c-format msgid "about %1$d %2$s" -msgstr "" +msgstr "más o menos %1$d %2$s" #: src/iexamine.cpp msgid "Ka-klunk!" @@ -134101,19 +134472,19 @@ msgstr "¡Ka-klunk!" #: src/iexamine.cpp msgid "The compactor chews up all the items in its hopper." -msgstr "" +msgstr "La compactadora se mastica todos los objetos que tenía en la tolva." #. ~ %1$s: compactor output material #: src/iexamine.cpp #, c-format msgid "The compactor beeps: \"No %1$s to process!\"" -msgstr "" +msgstr "La compactadora hace un pitido: \"¡No hay %1$s para procesar!\"" #. ~ %1$s: compactor output material #: src/iexamine.cpp #, c-format msgid "The compactor beeps: \"Insufficient %1$s!\"" -msgstr "" +msgstr "La compactadora hace un pitido: \"¡No hay suficiente %1$s!\"" #: src/iexamine.cpp msgid "It spits out an assortment of smaller pieces instead." @@ -134310,7 +134681,7 @@ msgstr "Glug Glug Glug" #: src/iexamine.cpp #, c-format msgid "Your cash cards now hold %s." -msgstr "" +msgstr "Tu tarjeta de crédito ahora tiene %s." #: src/iexamine.cpp msgid "You hack the terminal and route all available fuel to your pump!" @@ -134367,56 +134738,64 @@ msgid "" " of success compared to your %3$d chance of success." " Continue with a higher risk of failure?" msgstr "" +"%1$s está durmiendo, pero tiene un " +"%2$d de oportunidad de tener éxito comparado con " +"tu %3$d de oportunidad. ¿Querés continuar con el " +"alto riesgo de fallar?" #. ~ %1$s is the name of the ally #: src/iexamine.cpp #, c-format msgid "%1$s will perform the operation with a %2$d chance of success." msgstr "" +"%1$s llevará a cabo la operación con un %2$d de oportunidad de tener éxito." #: src/iexamine.cpp msgid "No connected couches found. Operation impossible. Exiting." -msgstr "" +msgstr "No se encontraron sofás conectados. Operación imposible. Abandonando." #: src/iexamine.cpp msgid "" "No patient found located on the connected couches. Operation impossible. " "Exiting." msgstr "" +"No se encontró paciente en los sofás conectados. Operación imposible. " +"Abandonando." #: src/iexamine.cpp msgid "You need an anesthesia kit for autodoc to perform any operation." msgstr "" +"Necesitás un equipo de anestesia para que el autodoc realice una operación." #: src/iexamine.cpp msgid "Autodoc Mk. XI. Status: Online. Please choose operation." -msgstr "" +msgstr "Autodoc Mk. XI. Estado: Activo. Por favor, elegir operación." #: src/iexamine.cpp msgid "Choose Compact Bionic Module to install." -msgstr "" +msgstr "Elegir Módulo Compacto de Biónico para instalar." #: src/iexamine.cpp msgid "Choose installed bionic to uninstall." -msgstr "" +msgstr "Elegir biónico instalado para desinstalar." #: src/iexamine.cpp msgid "Do nothing." -msgstr "" +msgstr "Hacer nada." #: src/iexamine.cpp msgid "Choose CBM to install" -msgstr "" +msgstr "Elegir MCB para instalar" #: src/iexamine.cpp msgid "You don't have any CBMs to install." -msgstr "" +msgstr "No tenés ningún MCB para instalar." #. ~ %1$s is the bionic CBM display name, %2$s is the patient name #: src/iexamine.cpp #, c-format msgid "%1$s cannot be installed on %2$s." -msgstr "" +msgstr "%1$s no puede ser instalado en %2$s." #. ~ %1$s is patient name #: src/iexamine.cpp src/iuse_actor.cpp @@ -134426,95 +134805,103 @@ msgstr "Ya tenés instalado este biónico." #: src/iexamine.cpp #, c-format msgid "%1$s has already installed this bionic." -msgstr "" +msgstr "%1$s ya tiene instalado este biónico." #. ~ %1$s is patient name #: src/iexamine.cpp msgid "You have no base version of this bionic to upgrade." -msgstr "" +msgstr "No tenés una versión base de este biónico para mejorar." #: src/iexamine.cpp #, c-format msgid "%1$s has no base version of this bionic to upgrade." -msgstr "" +msgstr "%1$s no tiene una versión base de este biónico para mejorar." #. ~ %1$s is patient name #: src/iexamine.cpp msgid "You have already installed a superior version of this bionic." -msgstr "" +msgstr "Ya tenés instalado una versión superior de este biónico." #: src/iexamine.cpp #, c-format msgid "%1$s has installed a superior version of this bionic." -msgstr "" +msgstr "%1$s ya tiene instalado una versión superior de este biónico." #. ~ %1$s is installer name, %2$s is bionic CBM display name, %3$s is patient #. name #: src/iexamine.cpp #, c-format msgid "%1$s prepares to install the %2$s on %3$s." -msgstr "" +msgstr "%1$s se prepara para instalar el %2$s en %3$s." #. ~ %1$s is patient name #: src/iexamine.cpp msgid "You don't have any bionics installed." -msgstr "" +msgstr "No tenés instalado ningún biónico." #: src/iexamine.cpp #, c-format msgid "%1$s doesn't have any bionics installed." -msgstr "" +msgstr "%1$s no tiene instalado ningún biónico." #: src/iexamine.cpp msgid "Choose bionic to uninstall" -msgstr "" +msgstr "Elegir biónico para desinstalar" #: src/iexamine.cpp msgid "This rack already contains smoked food." -msgstr "" +msgstr "Este soporte ya tiene comida ahumada." #: src/iexamine.cpp msgid "Remove it before firing the smoking rack again." -msgstr "" +msgstr "Sacala antes de encender otra vez el soporte para ahumar." #: src/iexamine.cpp #, c-format msgid "This rack contains %s, which can't be smoked!" -msgstr "" +msgstr "Este soporte tiene %s, ¡que no puede ahumarse!" #: src/iexamine.cpp #, c-format msgid "You remove %s from the rack." -msgstr "" +msgstr "Sacás el/a %s del soporte." #: src/iexamine.cpp msgid "" "This rack has some smoked food that might be dehydrated by smoking it again." msgstr "" +"Este soporte tiene un poco de comida ahumada que puede ser deshidratada para" +" volver a ahumarse otra vez." #: src/iexamine.cpp msgid "" "This rack is empty. Fill it with raw meat, fish or sausages and try again." msgstr "" +"Este soporte está vacío. Ponele carne cruda, pescado o salchichas y probá " +"otra vez." #: src/iexamine.cpp msgid "There is no charcoal in the rack." -msgstr "" +msgstr "No hay carbón vegetal para el soporte." #: src/iexamine.cpp msgid "" "This rack is overloaded with food, and it blocks the flow of smoke. Remove " "some and try again." msgstr "" +"El soporte está sobrecargado de comida, y bloquea el flujo del humo. Saca " +"algo y probá otra vez." #: src/iexamine.cpp #, c-format msgid "You think that you can load about %s %s in it." -msgstr "" +msgstr "Te parece que podés poner unos %s %s en el soporte." #: src/iexamine.cpp msgid "There is not enough charcoal in the rack to smoke this much food." msgstr "" +"No hay suficiente carbón vegetal en el soporte para ahumar tanta cantidad de" +" comida." #: src/iexamine.cpp #, c-format @@ -134522,132 +134909,138 @@ msgid "" "You need at least %1$s pieces of charcoal, and the smoking rack has %2$s " "inside." msgstr "" +"Necesitás por lo menos %1$s pedazos de carbón vegetal, y el soporte para " +"ahumar tiene %2$s adentro." #: src/iexamine.cpp msgid "This smoking rack is ready to be fired, but you have no fire source." msgstr "" +"Este soporte para ahumar está preparado para ser encendido, pero no tenés " +"con qué prender fuego." #: src/iexamine.cpp msgid "Fire the smoking rack?" -msgstr "" +msgstr "¿Querés encender el soporte para ahumar?" #: src/iexamine.cpp msgid "You light a small fire under the rack and it starts to smoke." -msgstr "" +msgstr "Encendés un pequeño fuego bajo el soporte y empieza a ahumar." #: src/iexamine.cpp msgid "You can't place more food while it's smoking." -msgstr "" +msgstr "No podés agregar más comida cuando está en el proceso de ahumado." #: src/iexamine.cpp msgid "Load smoking rack with what kind of food?" -msgstr "" +msgstr "¿Con qué comida querés cargar el soporte para ahumar?" #: src/iexamine.cpp msgid "You don't have any food that can be smoked." -msgstr "" +msgstr "No tenés ninguna comida que pueda ser ahumada." #: src/iexamine.cpp #, c-format msgid "Insert how many %s into the rack?" -msgstr "" +msgstr "¿Cuántos %s querés poner en el soporte?" #: src/iexamine.cpp msgid "You can't place that many." -msgstr "" +msgstr "No podés poner tantos." #: src/iexamine.cpp msgid "You have rotten food mixed with fresh. Get rid of it first." msgstr "" +"Tenés comida podrida mezclada con la fresca. Primera, deshacete de la " +"podrida." #: src/iexamine.cpp #, c-format msgid "You carefully place %s %s in the rack." -msgstr "" +msgstr "Cuidadosamente, ponés %s %s en el soporte." #: src/iexamine.cpp msgid "What to do with the smoking rack:" -msgstr "" +msgstr "Qué querés hacer con el soporte para ahumar:" #: src/iexamine.cpp msgid "Inspect smoking rack" -msgstr "" +msgstr "Inspeccionar soporte para ahumar" #: src/iexamine.cpp msgid "Light up and smoke food (lit & smoking)" -msgstr "" +msgstr "Encender y ahumar comida (encendido y ahumando)" #: src/iexamine.cpp msgid "Light up and smoke food" -msgstr "" +msgstr "Encender y ahumar comida" #: src/iexamine.cpp msgid "Insert food for smoking" -msgstr "" +msgstr "Poner comida para ahumar" #: src/iexamine.cpp msgid "Reload with charcoal" -msgstr "" +msgstr "Recargar carbón vegetal" #: src/iexamine.cpp msgid "Remove food from rack" -msgstr "" +msgstr "Sacar comida del soporte" #: src/iexamine.cpp msgid "Remove food from rack (none inside)" -msgstr "" +msgstr "Sacar comida del soporte (no tiene nada)" #: src/iexamine.cpp msgid "Remove charcoal from rack; has: " -msgstr "" +msgstr "Sacar carbón vegetal del soporte; tiene: " #: src/iexamine.cpp msgid "Remove charcoal from rack (none inside)" -msgstr "" +msgstr "Sacar carbón vegetal del soporte (no tiene nada)" #: src/iexamine.cpp msgid "Quench burning charcoal" -msgstr "" +msgstr "Extinguir carbón vegetal encendido" #: src/iexamine.cpp msgid "There's a smoking rack here. It is lit and smoking." -msgstr "" +msgstr "Acá hay un soporte para ahumar. Está encendido y ahumando." #: src/iexamine.cpp #, c-format msgid "It will finish smoking in about %d hour." msgid_plural "It will finish smoking in about %d hours." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Va a terminar el proceso de ahumado en más o menos %d hora." +msgstr[1] "Va a terminar el proceso de ahumado en unas %d horas." #: src/iexamine.cpp msgid "It will finish smoking in less than an hour." -msgstr "" +msgstr "Va a terminar el proceso de ahumado en menos de una hora." #: src/iexamine.cpp #, c-format msgid "It should take about %d minutes to finish smoking." -msgstr "" +msgstr "Debería tardar unos %d minutos en terminar de ahumar." #: src/iexamine.cpp msgid "There's a smoking rack here." -msgstr "" +msgstr "Acá hay un soporte para ahumar." #: src/iexamine.cpp msgid "You inspect its contents and find: " -msgstr "" +msgstr "Inspeccionás su contenido y encontrás:" #: src/iexamine.cpp msgid "You see some smoldering embers there." -msgstr "" +msgstr "Ves unas brasas ardientes ahí." #: src/iexamine.cpp msgid "It is already lit and smoking." -msgstr "" +msgstr "Ya está encendido y ahumando." #: src/iexamine.cpp msgid "You stop the smoking process." -msgstr "" +msgstr "Detenés el proceso de ahumado." #: src/iexamine.cpp msgid "Use electrohack?" @@ -134735,7 +135128,7 @@ msgstr "Recetas de fabricación" #: src/init.cpp msgid "Recipe groups" -msgstr "" +msgstr "Grupos de receta" #: src/init.cpp msgid "Martial arts" @@ -134916,7 +135309,7 @@ msgstr "movimiento del mouse" #: src/inventory.cpp #, c-format msgid "Your %s is damaged by rust." -msgstr "" +msgstr "Tu %s está dañaodo por el óxido." #: src/inventory_ui.cpp #, c-format @@ -135115,7 +135508,7 @@ msgstr "heladera:" #: src/item.cpp msgid "freezer: " -msgstr "" +msgstr "freezer: " #: src/item.cpp msgid "last rot: " @@ -135123,15 +135516,15 @@ msgstr "last rot: " #: src/item.cpp msgid "HOT: " -msgstr "" +msgstr "CALIENTE:" #: src/item.cpp msgid "COLD: " -msgstr "" +msgstr "FRÍO:" #: src/item.cpp msgid "FROZEN: " -msgstr "" +msgstr "CONGELADO:" #: src/item.cpp msgid "burn: " @@ -135197,52 +135590,67 @@ msgstr "" #: src/item.cpp msgid "* This food looks as fresh as it can be." -msgstr "" +msgstr "* Esta comida parece tan fresca como puede estar." #: src/item.cpp msgid "" "* This food looks still quite fresh. It's far from becoming " "old." msgstr "" +"* Esta comida parece bastante fresca. Está lejos de volverse " +"vieja." #: src/item.cpp msgid "" "* This food looks like it is reaching its midlife. It has" " some time ahead before spoiling." msgstr "" +"* Esta comida parece que está alcanzando la mitad de su vida " +"útil. Todavía falta un tiempo para que se pudra." #: src/item.cpp msgid "" "* This food looks like it has passed its midlife. Edible," " but will go old sooner rather then later." msgstr "" +"* Esta comida parece que pasó la mitad de su vida útil. " +"Se puede comer, pero se va a pudrir más antes que después." #: src/item.cpp msgid "" "* This food looks like it will be old soon. It's now or never, if" " you plan to use it." msgstr "" +"* Esta comida parece que se va a poner vieja pronto. Es ahora o " +"nunca, si planeás comértela." #: src/item.cpp msgid "" "* This food looks old. It's on a brink of becoming inedible." msgstr "" +"* Esta comida parece vieja. Esta a un pasito de volverse " +"incomible." #: src/item.cpp msgid "" "* Quality of this food suffers when it's frozen, and it will become" " mushy after thawing out.." msgstr "" +"* La calidad de esta comida queda dañada cuando se congela, y se " +"pone blanda cuando se descongela." #: src/item.cpp msgid "" "* It was frozen once and after thawing became mushy and " "tasteless." msgstr "" +"* Estuvo congelada antes y después de descongelarse se vuelve blanda y " +"sin gusto." #: src/item.cpp msgid "* It seems that deep freezing killed all parasites." msgstr "" +"* Parece que al estar muy congelada mató todos los parásitos." #: src/item.cpp msgid "" @@ -135423,7 +135831,7 @@ msgstr "Cargadores compatibles: " #: src/item.cpp msgid "Mods: " -msgstr "" +msgstr "Modificaciones: " #: src/item.cpp #, c-format @@ -135749,7 +136157,7 @@ msgstr "Contiene objetos con calidades:" #: src/item.cpp msgid "Techniques when wielded: " -msgstr "" +msgstr "Técnicas cuando está empuñado: " #: src/item.cpp msgid "* This item can be used to make long reach attacks." @@ -135821,7 +136229,7 @@ msgstr "* Este objeto conduce la electricidad." #: src/item.cpp msgid "* This item can be worn with a helmet." -msgstr "" +msgstr "* Este objeto puede ser usado con un casco." #: src/item.cpp msgid "* This piece of clothing fits you perfectly." @@ -136005,7 +136413,7 @@ msgstr "Mod: " #: src/item.cpp msgid "Content of this item:" -msgstr "" +msgstr "Contenido de este objeto:" #: src/item.cpp msgid "You know dozens of things you could craft with it." @@ -136125,7 +136533,7 @@ msgstr " (podrido/a)" #: src/item.cpp msgid " (mushy)" -msgstr "" +msgstr "(blando)" #: src/item.cpp msgid " (old)" @@ -136145,11 +136553,11 @@ msgstr " (frío/a)" #: src/item.cpp msgid " (frozen)" -msgstr "" +msgstr "(congelado)" #: src/item.cpp msgid " (melted)" -msgstr "" +msgstr "(derretido)" #: src/item.cpp msgid " (fits)" @@ -136157,7 +136565,7 @@ msgstr " (tu talle)" #: src/item.cpp msgid " (undersized)" -msgstr "" +msgstr "(muy pequeño)" #: src/item.cpp msgid " (filthy)" @@ -136288,7 +136696,7 @@ msgstr "no es suficientemente grande para usar esa modificación" #: src/item.cpp msgid "can only accept small mods on that slot" -msgstr "" +msgstr "solo puede aceptar modificaciones pequeñas en ese lugar" #. ~ %1$s - name of the gunmod, %2$s - name of the ammo #: src/item.cpp @@ -136430,16 +136838,16 @@ msgstr "¡Necesitás un UPS para usar el/a %s!" msgctxt "item name" msgid "%s carcass" msgid_plural "%s carcasses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%s cadáver" +msgstr[1] "%s cadáveres" #: src/item.cpp #, c-format msgctxt "item name" msgid "quartered %s carcass" msgid_plural "quartered %s carcasses" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "carcasa %s descuartizada" +msgstr[1] "carcasas %s descuartizadas" #: src/item.cpp #, c-format @@ -136454,8 +136862,8 @@ msgstr[1] "%s cadáveres" msgctxt "item name" msgid "%s carcass of %s" msgid_plural "%s carcasses of %s" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%s carcasa de %s" +msgstr[1] "%s carcasas de %s" #: src/item.cpp #, c-format @@ -136646,6 +137054,8 @@ msgid "" "Maybe just placebo effect, but you feel a little better as the dose settles " "in." msgstr "" +"Tal vez sea solo el efecto placebo, pero te sentís un poco mejor a medida " +"que la dosis actúa." #: src/iuse.cpp #, c-format @@ -136814,7 +137224,7 @@ msgstr "Esto parece poco saludable, ¿seguro que querés comerlo?" #: src/iuse.cpp msgid "Blech, that tastes gross!" -msgstr "" +msgstr "¡Puaj, tiene un gusto horrible!" #: src/iuse.cpp msgid "Blech, that burns your throat!" @@ -137036,22 +137446,28 @@ msgstr "" #: src/iuse.cpp msgid "We welcome into us. We have endured long in this forbidding world." msgstr "" +"Nosotros te damos la bienvenida a nosotros. Nosotros hemos sobrevivido en " +"este mundo prohibitivo." #: src/iuse.cpp msgid "" "A sea of white caps, waving gently. A haze of spores wafting silently over a" " forest." msgstr "" +"Es un mar de oronjas blancas, ondeando gentilmente. Una niebla de esporas " +"flotando silenciosamente sobre un bosque." #: src/iuse.cpp msgid "The natives have a saying: \"E Pluribus Unum.\" Out of many, one." -msgstr "" +msgstr "Los nativos tienen un dicho: \"E Pluribus Unum.\" De muchos, uno." #: src/iuse.cpp msgid "" "The blazing pink redness of the berry. The juices spreading across your " "tongue, the warmth draping over us like a lover's embrace." msgstr "" +"El centelleante rojizo rosado del fruto. Los jugos chorreando por tu lengua," +" la tibieza cubriéndonos como el abrazo de un amante." #: src/iuse.cpp msgid "" @@ -137059,12 +137475,17 @@ msgid "" "unite this world. Even now, our fruits adapt to better serve local " "physiology." msgstr "" +"Nosotros le damos la bienvenida a la unión entre nuestras lineas en nuestra " +"guía local. Prosperaremos, y uniremos este mundo. Incluso ahora, nuestros " +"frutos se adaptan para servir mejor a la fisiología local." #: src/iuse.cpp msgid "" "The sky-blue of the seed. The nutty, creamy flavors intermingling with the " "berry, a memory that will never leave us." msgstr "" +"El azul del cielo de la semilla. Los sabores a crema y nuez entremezclándose" +" con el fruto, un recuerdo que nunca nos abandonará." #: src/iuse.cpp msgid "" @@ -137079,6 +137500,8 @@ msgid "" "The amber-yellow of the sap. Feel it flowing through our veins, taking the " "place of the strange, thin red gruel called \"blood.\"" msgstr "" +"El amarillo ámbar de la savia. Sentila fluyendo por nuestras venas, " +"reemplazando esa extraña, espesa, roja y fina llamada \"sangre\"." #: src/iuse.cpp msgid "This apple tastes really weird! You're not sure it's good for you..." @@ -137089,7 +137512,7 @@ msgstr "" #: src/iuse.cpp #, c-format msgid "The %s doesn't want that kind of food." -msgstr "" +msgstr "El/a %s no quiere esa clase de comida." #: src/iuse.cpp #, c-format @@ -137144,12 +137567,15 @@ msgid "" "The %s seems to like you! Or maybe it just tolerates your presence better." " It's hard to tell with felines." msgstr "" +"¡Parece que le gustás al/a %s! O tal vez solo tolera tu presencia un poco " +"más. Es difícil darse cuenta con los felinos." #: src/iuse.cpp #, c-format msgid "" "The %s seems to like you! It runs around your legs and seems friendly." msgstr "" +"¡Parece que le gustás al/a %s! Pasa cerca de tus piernas y parece amistoso." #: src/iuse.cpp msgid "There is nothing to be fed here." @@ -137615,11 +138041,11 @@ msgstr "Rompés el vidrio." #: src/iuse.cpp msgid "Till soil where?" -msgstr "" +msgstr "¿Dónde querés arar el suelo?" #: src/iuse.cpp msgid "You think about jumping on a shovel, but then change up your mind." -msgstr "" +msgstr "Pensás en saltar sobre una pala, pero luego te arrepentís." #: src/iuse.cpp src/mutation.cpp msgid "You can't churn up this ground." @@ -137627,35 +138053,35 @@ msgstr "No podés remover este suelo." #: src/iuse.cpp src/mutation.cpp msgid "Dig pit where?" -msgstr "" +msgstr "¿Dónde querés cavar un pozo?" #: src/iuse.cpp src/mutation.cpp msgid "You delve into yourself." -msgstr "" +msgstr "Indagás tu interior." #: src/iuse.cpp msgid "You can't deepen this pit without a proper shovel." -msgstr "" +msgstr "No podés hacer más profundo este pozo sin una pala adecuada." #: src/iuse.cpp src/mutation.cpp msgid "You can't dig a pit on this ground." -msgstr "" +msgstr "No podés cavar un pozo en este suelo." #: src/iuse.cpp msgid "Fill which pit or mound?" -msgstr "" +msgstr "¿Qué pozo o montículo querés rellenar?" #: src/iuse.cpp src/mutation.cpp msgid "You decide not to bury yourself that early." -msgstr "" +msgstr "Decidís no enterrarte a vos mismo tan temprano." #: src/iuse.cpp msgid "There is nothing to fill." -msgstr "" +msgstr "No hay nada para rellenar." #: src/iuse.cpp src/mutation.cpp msgid "Clear rubble where?" -msgstr "" +msgstr "¿Qué escombro querés limpiar?" #: src/iuse.cpp msgid "There's no rubble to clear." @@ -137906,23 +138332,23 @@ msgstr "¡Incorporado!" #: src/iuse.cpp msgid "BUGFIXES!" -msgstr "" +msgstr "BUGFIXES!" #: src/iuse.cpp msgid "BUFFS!" -msgstr "" +msgstr "BUFFS!" #: src/iuse.cpp msgid "NERFS!" -msgstr "" +msgstr "NERFS!" #: src/iuse.cpp msgid "REVERTS!" -msgstr "" +msgstr "REVERTIR!" #: src/iuse.cpp msgid "BEES!" -msgstr "" +msgstr "ABEJAS!" #: src/iuse.cpp msgid "Set the timer to (0 to cancel)?" @@ -138127,51 +138553,53 @@ msgstr "El reproductor de mp3 se apaga." msgid "" "You have no cable charging system to plug it in, so you leave it alone." msgstr "" +"No tenés sistema de cables de carga para enchufarlo, así que lo dejás." #: src/iuse.cpp msgid "Activate your cable charging system to take advantage of it." -msgstr "" +msgstr "Activá tu sistema de cables de carga para poder usarlo." #: src/iuse.cpp #, c-format msgid "You need to wear the %1$s before you can unfold it." -msgstr "" +msgstr "Necesitás ponerte el/a %1$s antes de poder desplegarlo/a." #: src/iuse.cpp #, c-format msgid "You cannot use the %1$s with another of it's kind." -msgstr "" +msgstr "No podés usar el/a %1$s con otro de su misma clase." #: src/iuse.cpp msgid "You unfold solar array from the pack and plug it in." -msgstr "" +msgstr "Desplegás la matriz solar de su paquete y la conectás." #: src/iuse.cpp msgid "You fold your portable solar array into the pack." -msgstr "" +msgstr "Plegás la matriz solar portátil y la guardás en su paquete." #: src/iuse.cpp msgid "You unplug and fold your portable solar array into the pack." msgstr "" +"Desconectás y plegás tu matriz solar portátil y lo guardás en su paquete." #: src/iuse.cpp #, c-format msgid "Your %s requires new filter!" -msgstr "" +msgstr "¡Tu %s necesita un filtro nuevo!" #: src/iuse.cpp msgid " needs new gas mask filter!" -msgstr "" +msgstr "¡ necesita un filtro nuevo para la máscara de gas!" #: src/iuse.cpp #, c-format msgid "Your %s don't have a filter." -msgstr "" +msgstr "Tu %s no tiene filtro." #: src/iuse.cpp #, c-format msgid "You prepared your %s." -msgstr "" +msgstr "Preparás tu %s." #: src/iuse.cpp src/player.cpp msgid "You're illiterate!" @@ -138199,7 +138627,7 @@ msgstr "Buscaminas" #: src/iuse.cpp src/iuse_software_lightson.cpp msgid "Lights on!" -msgstr "" +msgstr "¡Luces encendidas!" #: src/iuse.cpp #, c-format @@ -138222,7 +138650,7 @@ msgstr "Hacés arrancar tu %s y empezás a liberar la tensión." #: src/iuse.cpp #, c-format msgid "You whip out your %s and start getting the tension out." -msgstr "" +msgstr "Te sacás tu %s y empezás a liberar tensiones." #: src/iuse.cpp msgid "Air swirls around you for a moment." @@ -138315,7 +138743,7 @@ msgstr "No podés talar eso." #: src/iuse.cpp msgid "Chop which tree trunk?" -msgstr "" +msgstr "¿Qué tronco querés cortar?" #: src/iuse.cpp msgid "You can't chop that." @@ -138561,11 +138989,11 @@ msgstr "Una sombra se forma en un lugar cercano." #: src/iuse.cpp msgid "Your body feels like jelly." -msgstr "" +msgstr "Tu cuerpo se siente como gelatina." #: src/iuse.cpp msgid "You're filled with euphoria!" -msgstr "" +msgstr "¡Estás lleno de euforia!" #: src/iuse.cpp src/iuse_actor.cpp msgid "An item" @@ -138609,7 +139037,7 @@ msgstr "No tenés la comida apropiada para calentar." #: src/iuse.cpp msgid "You defrost the food." -msgstr "" +msgstr "Descongelás la comida." #: src/iuse.cpp msgid "You heat up the food." @@ -139173,7 +139601,7 @@ msgstr "Esta foto es mejor que la anterior." #: src/iuse.cpp #, c-format msgid "You took a photo of %1$s. It is %2$s." -msgstr "" +msgstr "Le sacás una foto al/a %1$s. Quedó %2$s." #: src/iuse.cpp #, c-format @@ -139609,20 +140037,20 @@ msgstr "El %1$s lee %2$s." #: src/iuse.cpp #, c-format msgid "You need to wear the %1$s before activating it." -msgstr "" +msgstr "Necesitás ponerte el %1$s antes de activarlo." #: src/iuse.cpp msgid "Choose hologram direction." -msgstr "" +msgstr "Elegí la dirección del holograma." #: src/iuse.cpp msgid "Can't create a hologram there." -msgstr "" +msgstr "No podés crear un holograma ahí." #: src/iuse.cpp #, c-format msgid "The %s must be installed in a vehicle before being loaded." -msgstr "" +msgstr "El %s tiene que estar instalado en un vehículo antes de ser cargado." #: src/iuse.cpp #, c-format @@ -139688,7 +140116,7 @@ msgstr "Ponés la escalera." #: src/iuse.cpp msgid "You're carrying too much to clean anything." -msgstr "" +msgstr "Estás cargando demasiadas cosas como para limpiar algo." #: src/iuse.cpp msgid "You need a cleansing agent to use this." @@ -139696,52 +140124,53 @@ msgstr "Necesitás un agente limpiador para usar esto." #: src/iuse.cpp msgid "ITEMS TO CLEAN" -msgstr "" +msgstr "OBJETOS PARA LIMPIAR" #: src/iuse.cpp msgid "Multiclean" -msgstr "" +msgstr "Multi-limpieza" #: src/iuse.cpp msgid "To clean x items, type a number before selecting." -msgstr "" +msgstr "Para limpiar x objetos, escribí el número antes de elegirlos." #: src/iuse.cpp msgid "You have nothing to clean." -msgstr "" +msgstr "No tenés nada para limpiar." #: src/iuse.cpp msgid "You are too weak to even try." -msgstr "" +msgstr "Estás demasiado débil como para intentarlo." #: src/iuse.cpp msgid "" "You use all your strength, but the stick won't break. Perhaps try again?" msgstr "" +"Usás toda tu fuerza pero el palo no se rompe. ¿Porahi si probás de nuevo?" #: src/iuse.cpp msgid "You try to break the stick in two, but it shatters into splinters." -msgstr "" +msgstr "Intentás romper el palo a la mitad, pero se destroza en astillas." #: src/iuse.cpp msgid "The stick breaks clean into two parts." -msgstr "" +msgstr "El palo se rompe en dos mitades perfectas." #: src/iuse.cpp msgid "You break the stick, but one half shatters into splinters." -msgstr "" +msgstr "Rompés el palo, pero una de las mitades se destroza en astillas." #: src/iuse.cpp msgid "The throbbing of the infection diminishes. Slightly." -msgstr "" +msgstr "El latido que sentís en la infección disminuye. Un poco." #: src/iuse.cpp msgid "You feel much better - almost entirely." -msgstr "" +msgstr "Te sentís mucho mejor - casi completamente bien." #: src/iuse.cpp msgid "You feel AMAZING!" -msgstr "" +msgstr "¡Te sentís GENIAL!" #: src/iuse_actor.cpp #, c-format @@ -139778,11 +140207,11 @@ msgstr "Energía en el epicentro: " #: src/iuse_actor.cpp msgid "Casing mass: " -msgstr "" +msgstr "Vaina masa: " #: src/iuse_actor.cpp msgid "Fragment mass: " -msgstr "" +msgstr "Fragmento masa: " #: src/iuse_actor.cpp #, c-format @@ -139915,20 +140344,20 @@ msgstr "La cerradura no cede a tus intentos de forzarla." #: src/iuse_actor.cpp msgid "Deploy where?" -msgstr "" +msgstr "¿Dónde querés desplegarlo/a?" #: src/iuse_actor.cpp msgid "You attempt to become one with the furniture. It doesn't work." -msgstr "" +msgstr "Intentás compenetrarte con el mueble. No funciona." #: src/iuse_actor.cpp #, c-format msgid "You can't deploy a %s there." -msgstr "" +msgstr "No podés desplegar un/a %s ahí." #: src/iuse_actor.cpp msgid "There is already furniture at that location." -msgstr "" +msgstr "Ya hay un mueble en ese lugar." #: src/iuse_actor.cpp #, c-format @@ -139974,11 +140403,11 @@ msgstr "Prendés un fuego exitosamente." #: src/iuse_actor.cpp msgid "You light a fire, but it isn't enough. You need to light more." -msgstr "" +msgstr "Encendés un fuego pero no es suficiente. Necesitás encender más." #: src/iuse_actor.cpp msgid "You happily light a fire." -msgstr "" +msgstr "Prendés un fuego con mucha felicidad." #: src/iuse_actor.cpp msgid "This tool doesn't have enough charges." @@ -140362,12 +140791,12 @@ msgstr "Ajustás tu %s, mejorando la manera en que te queda." #: src/iuse_actor.cpp #, c-format msgid "You resize the %s to accommodate your tiny build." -msgstr "" +msgstr "Redimencionás el/a %s para acomodar tu pequeña estructura." #: src/iuse_actor.cpp #, c-format msgid "You adjust the %s back to its normal size." -msgstr "" +msgstr "Ajustás el/a %s para que vuelva a su tamaño normal." #: src/iuse_actor.cpp #, c-format @@ -140481,19 +140910,19 @@ msgstr "Curación real: " #: src/iuse_actor.cpp msgid "Base bandaging quality: " -msgstr "" +msgstr "Calidad básica de vendaje: " #: src/iuse_actor.cpp msgid "Actual bandaging quality: " -msgstr "" +msgstr "Calidad actual de vendaje: " #: src/iuse_actor.cpp msgid "Base disinfecting quality: " -msgstr "" +msgstr "Calidad básica de desinfección: " #: src/iuse_actor.cpp msgid "Actual disinfecting quality: " -msgstr "" +msgstr "Calidad actual de desinfección: " #: src/iuse_actor.cpp msgid "Chance to heal (percent): " @@ -140579,7 +141008,7 @@ msgstr "No podés recortar cañones con modificaciones." #: src/iuse_actor.cpp msgid "You can't self-install bionics." -msgstr "" +msgstr "No podés autoinstalarte biónicos." #: src/iuse_actor.cpp msgid "There is nothing to upgrade." @@ -140713,7 +141142,7 @@ msgstr "Una coma sola, olvidada, se sienta allé, sollozando." #: src/iuse_software_kitten.cpp msgid "ONE HUNDRED THOUSAND CARPET FIBERS!" -msgstr "" +msgstr "¡CIEN MIL FIBRAS DE UNA ALFOMBRA!" #: src/iuse_software_kitten.cpp msgid "It's Richard Nixon's nose!" @@ -141151,7 +141580,7 @@ msgstr "Esta es la mundialmente famosa Cadena de Suspensorios." #: src/iuse_software_kitten.cpp msgid "A trash compactor, compacting away." -msgstr "Es un compactador de basura, compactando." +msgstr "Es una compactadora de basura, compactando." #: src/iuse_software_kitten.cpp msgid "This toaster strudel is riddled with bullet holes!" @@ -141564,6 +141993,10 @@ msgid "" "they are kitten or not. The game ends when robot finds kitten. " "Alternatively, you may end the game by hitting 'q', 'Q' or the Escape key." msgstr "" +"Tu trabajo es encontrar kitten. Esta tarea es complicada por la existencia " +"de varios objetos que no son kitten. El robot debe tocar el objeto para " +"determinar si es kitten o no. El juego termina cuando robot encuentra " +"kitten. Si no, podés terminar el juego apretando 'q', 'Q' o la tecla Escape." #: src/iuse_software_kitten.cpp msgid "Press any key to start." @@ -141579,7 +142012,7 @@ msgstr "¡Encontraste a kitten! ¡Así se hace, robot!" #: src/iuse_software_lightson.cpp msgid " toggle lights" -msgstr "" +msgstr " activar luces" #: src/iuse_software_lightson.cpp src/iuse_software_sokoban.cpp msgid "eset" @@ -141592,15 +142025,15 @@ msgstr " salir" #: src/iuse_software_lightson.cpp msgid "Game goal: Switch all the lights on." -msgstr "" +msgstr "Objetivo del juego: Activar todas las luces." #: src/iuse_software_lightson.cpp msgid "Legend: # on, - off." -msgstr "" +msgstr "Leyenda: # encendido, - apagado." #: src/iuse_software_lightson.cpp msgid "Toggle lights switches selected light and 4 its neighbors." -msgstr "" +msgstr "Activa los interruptores de la luz seleccionados y 4 de los costados." #: src/iuse_software_lightson.cpp src/iuse_software_minesweeper.cpp msgid "Congratulations, you won!" @@ -141918,15 +142351,15 @@ msgstr "Cargando" #: src/lua_console.cpp msgid "This build does not support Lua." -msgstr "" +msgstr "Esta versión no soporta Lua." #: src/lua_console.cpp msgid "Welcome to the Lua console! Here you can enter Lua code." -msgstr "" +msgstr "¡Bienvenido a la consola Lua! Acá podés ingresar el código Lua." #: src/lua_console.cpp msgid "Press [Esc] to close the Lua console." -msgstr "" +msgstr "Apretá [Esc] para cerrar la consola Lua." #: src/main.cpp msgid "Really Quit? All unsaved changes will be lost." @@ -142058,7 +142491,7 @@ msgstr "No se pudo crear directorio para plantillas. Revisá los permisos." #: src/main_menu.cpp msgid "Unable to make sound directory. Check permissions." -msgstr "" +msgstr "No se pudo crear directorio de sonido. Revisá los permisos." #: src/main_menu.cpp msgid "Really quit?" @@ -142086,7 +142519,7 @@ msgstr "Pesonaje Aleatorio" #: src/main_menu.cpp msgctxt "Main Menu|New Game" msgid "Play Now! (ixed Scenario)" -msgstr "" +msgstr "¡Jugar ahora! (Escenario ijo)" #: src/main_menu.cpp msgctxt "Main Menu|New Game" @@ -142253,12 +142686,12 @@ msgstr "¡No pudiste desarmar la trampa, y la hiciste accionar!" #: src/map.cpp #, c-format msgid "Something has crawled out of the %s plants!" -msgstr "" +msgstr "¡Algo salió arrastrándose de las plantas de %s!" #: src/map.cpp #, c-format msgid "Something has crawled out of the %s!" -msgstr "" +msgstr "¡Algo salió arrastrándose del/a %s!" #: src/map_extras.cpp msgid "DANGER! MINEFIELD!" @@ -142490,17 +142923,17 @@ msgstr "¡El/a %s de queda dañado/a por la fuerza del golpe!" #: src/melee.cpp #, c-format msgid "Your %s breaks apart!" -msgstr "" +msgstr "¡Tu %s se rompe!" #: src/melee.cpp #, c-format msgid "'s %s breaks apart!" -msgstr "" +msgstr "¡El/a %s de se rompe!" #: src/melee.cpp #, c-format msgid "The %s is destroyed!" -msgstr "" +msgstr "¡El/a %s queda destruido/a!" #: src/melee.cpp #, c-format @@ -142935,7 +143368,7 @@ msgstr "%s por %d de daño." #: src/melee.cpp #, c-format msgid "You lunge for the %s, but miss!" -msgstr "" +msgstr "¡intentás darle un golpe de esgrima al %s, pero le errás!" #: src/melee.cpp #, c-format @@ -143036,11 +143469,11 @@ msgstr "Misiones del Puesto" #: src/mission_companion.cpp msgid "Base Missions" -msgstr "" +msgstr "Misiones de Base" #: src/mission_companion.cpp msgid "Junk Shop Missions" -msgstr "" +msgstr "Misiones de Negocio de objetos usados" #: src/mission_companion.cpp msgid "Agricultural Missions" @@ -143070,7 +143503,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Assign Scavenging Patrol" -msgstr "" +msgstr "Asignar Patrulla de Cartoneo" #: src/mission_companion.cpp msgid "" @@ -143088,7 +143521,7 @@ msgstr "" #: src/mission_companion.cpp msgid " hours] \n" -msgstr "" +msgstr " horas] \n" #: src/mission_companion.cpp msgid "" @@ -143102,7 +143535,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Retrieve Scavenging Patrol" -msgstr "" +msgstr "Retirar Patrulla de Cartoneo" #: src/mission_companion.cpp msgid "" @@ -143120,7 +143553,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Assign Scavenging Raid" -msgstr "" +msgstr "Asignar Grupo de Saqueo" #: src/mission_companion.cpp msgid "" @@ -143138,7 +143571,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Retrieve Scavenging Raid" -msgstr "" +msgstr "Retirar Grupo de Saqueo" #: src/mission_companion.cpp msgid "" @@ -143156,7 +143589,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Assign Ally to Menial Labor" -msgstr "" +msgstr "Asignar Aliado a Labores Menores" #: src/mission_companion.cpp msgid "" @@ -143174,7 +143607,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Recover Ally from Menial Labor" -msgstr "" +msgstr "Retirar Aliado de Labores Menores" #: src/mission_companion.cpp msgid "" @@ -143192,7 +143625,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Assign Ally to Carpentry Work" -msgstr "" +msgstr "Asignar Aliado a Carpintería" #: src/mission_companion.cpp msgid "" @@ -143210,15 +143643,15 @@ msgstr "" #: src/mission_companion.cpp msgid "Recover Ally from Carpentry Work" -msgstr "" +msgstr "Retirar Aliado de Carpintería" #: src/mission_companion.cpp msgid "Upgrade Camp" -msgstr "" +msgstr "Mejorar Campamento" #: src/mission_companion.cpp msgid "Gather Materials" -msgstr "" +msgstr "Recolectar Materiales" #: src/mission_companion.cpp #, c-format @@ -143237,10 +143670,23 @@ msgid "" " \n" "Total faction food stock: %d kcal or %d day's rations" msgstr "" +"Notas:\n" +"Distribuir comida con tus seguidores y llenar las alacenas. Poner la comida que querés distribuir en el lado opuesto a la puerta, entre el director y la pared.\n" +" \n" +"Efectos:\n" +"> Incrementa la comida de tu bando que será usada para pagar a los trabajadores por su tiempo\n" +" \n" +"Debe tener Disfrute >= -6\n" +"La comida perecedera liquidada en penalidad depende de las mejoras y tiempo podrida:\n" +"> Podrida: 0%%\n" +"> Se pudre en < 2 días: 60%%\n" +"> Se pudre en < 5 días: 80%%\n" +" \n" +"Suministro total del bando: %d kcal o %d días con raciones" #: src/mission_companion.cpp msgid "Distribute Food" -msgstr "" +msgstr "Distribuir Comida" #: src/mission_companion.cpp msgid "" @@ -143252,10 +143698,17 @@ msgid "" "> Items sitting on any type of furniture will not be moved.\n" "> Items that are not listed in one of the categories are defaulted to the tools group." msgstr "" +"Notas:\n" +"Resetear los puntos en que los objetos son ordenados usando la misión [ Labor Menor ] .\n" +" \n" +"Efectos:\n" +"> Puntos Asignables: comida, comida para distribuir, semillas, armas, ropa, biónicos, herramientas, madera, basura, libros, medicamentos y munición.\n" +"> Los objetos en los muebles no serán movidos.\n" +"> Los objetos que no están listados en las categorías van al grupo de herramientas." #: src/mission_companion.cpp msgid "Reset Sort Points" -msgstr "" +msgstr "Resetear Puntos de Orden" #: src/mission_companion.cpp #, c-format @@ -143274,10 +143727,23 @@ msgid "" "Time: 3 Hours, Repeated\n" "Positions: %d/3\n" msgstr "" +"Notas:\n" +"Enviar un compañero a recolectar arbustos y palos grandes.\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: N/D \n" +"Posibilidad de Recolectar:\n" +"> palos grandes\n" +"> plantas marchitas\n" +"> astillas de madera\n" +" \n" +"Riesgo: Muy Bajo\n" +"Tiempo: 3 Horas, Repetir\n" +"Posiciones: %d/3\n" #: src/mission_companion.cpp msgid "Collect Firewood" -msgstr "" +msgstr "Recolectar Leña" #: src/mission_companion.cpp #, c-format @@ -143295,10 +143761,22 @@ msgid "" "Time: 3 Hours\n" "Positions: %d/1\n" msgstr "" +"Notas:\n" +"Enviar compañero a hacer tareas rutinarias y ordenar cosas.\n" +" \n" +"Habilidad usada: fabricación\n" +"Dificultad: N/D \n" +"Efectos:\n" +"> Los materiales dejados afuera en el piso serán ordenados en cuatro cajas en la puerta de la carpa.\n" +"Por defecto, de arriba a abajo: Ropa, Comida, Libros/Biónicos y Herramientas. La madera será apilada en el sur. La basura, en el norte.\n" +" \n" +"Riesgo: Ninguno\n" +"Tiempo: 3 Horas\n" +"Posiciones: %d/1\n" #: src/mission_companion.cpp msgid "Menial Labor" -msgstr "" +msgstr "Labores Menores" #: src/mission_companion.cpp #, c-format @@ -143315,10 +143793,21 @@ msgid "" "Time: 3 Hours \n" "Positions: %d/1\n" msgstr "" +"Notas:\n" +"Tu base se hizo lo suficientemente grande como para agrandarla. Las expansiones abren nuevas posibilidades pero pueden ser costosas y llevan tiempo. Elegí la expansión con cuidado, solamente se pueden construir 8 por campamento.\n" +" \n" +"Habilidad usada: fabricación\n" +"Dificultad: N/D \n" +"Efectos:\n" +"> Elegí cualquiera de las expansiones disponibles. Empezar por la granja o la maderera son siempre las mejores opciones ya que la comida es necesaria para las misiones de los compañeros y la madera es el principal material.\n" +" \n" +"Riesgo: Ninguno\n" +"Tiempo: 3 Horas \n" +"Posiciones: %d/1\n" #: src/mission_companion.cpp msgid "Expand Base" -msgstr "" +msgstr "Expandir Base" #: src/mission_companion.cpp #, c-format @@ -143337,10 +143826,23 @@ msgid "" "Time: 6 Hour Base + Travel Time + Cutting Time\n" "Positions: %d/1\n" msgstr "" +"Notas:\n" +"Enviar compañero a un bosque cercano a cortar troncos.\n" +" \n" +"Habilidad usada: fabricación\n" +"Dificultad: 1 \n" +"Efectos:\n" +"> 50%% de los árboles/troncos en el bosque serán cortados.\n" +"> 50%% del material total será traído.\n" +"> Se puede repetir con resultados menores.\n" +" \n" +"Riesgo: Bajo-Medio\n" +"Tiempo: 6 Horas en Base + Tiempo de Traslado + Tiempo de Tala\n" +"Posiciones: %d/1\n" #: src/mission_companion.cpp msgid "Cut Logs" -msgstr "" +msgstr "Cortar Troncos" #: src/mission_companion.cpp #, c-format @@ -143359,10 +143861,23 @@ msgid "" "Time: 6 Hour Construction + Travel\n" "Positions: %d/1\n" msgstr "" +"Notas:\n" +"Enviar un compañero a construir un refugio improvisado y llenarlo con equipamiento en un lugar del mapa.\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: 3\n" +"Efectos:\n" +"> Sirve para establecer puntos de contingencia o de suministros.\n" +"> El equipo queda sin supervisión y puede ser robado.\n" +"> El tiempo depende del peso del equipo enviado.\n" +" \n" +"Riesgo: Medio\n" +"Tiempo: 6 Horas de Construcción + Traslado\n" +"Posiciones: %d/1\n" #: src/mission_companion.cpp msgid "Setup Hide Site" -msgstr "" +msgstr "Establecer Escondite" #: src/mission_companion.cpp #, c-format @@ -143381,22 +143896,35 @@ msgid "" "Time: 1 Hour Base + Travel\n" "Positions: %d/1\n" msgstr "" +"Notas:\n" +"Enviar equipamiento a escondite o traerlo de nuevo a la base.\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: 1\n" +"Efectos:\n" +"> Sirve para recuperar equipo que dejaste en el refugio de escondite.\n" +"> El equipo queda sin supervisión y puede ser rebado.\n" +"> El tiempo depende del peso del equipo trasladado.\n" +" \n" +"Riesgo: Medio\n" +"Tiempo: 1 Hora en Base + Traslado\n" +"Posiciones: %d/1\n" #: src/mission_companion.cpp msgid "Relay Hide Site" -msgstr "" +msgstr "Equipar Escondite" #: src/mission_companion.cpp msgid "Construct Map Fortifications" -msgstr "" +msgstr "Construir Fortificaciones" #: src/mission_companion.cpp msgid "Construct Spiked Trench" -msgstr "" +msgstr "Construir Trinchera con Púas" #: src/mission_companion.cpp msgid "Recruit Companions" -msgstr "" +msgstr "Reclutar Compañeros" #: src/mission_companion.cpp #, c-format @@ -143415,10 +143943,23 @@ msgid "" "Time: Travel\n" "Positions: %d/3\n" msgstr "" +"Notas:\n" +"Enviar compañero a territorio desconocido. Se necesita habilidad en supervivencia para evitar las luchas pero igual deberías prepararte para algunas.\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: 3\n" +"Efectos:\n" +"> Elegir puntos específicos para trazar el camino.\n" +"> Revela terreno alrededor del camino.\n" +"> Puede pasar por escondites para extender su alcance.\n" +" \n" +"Riesgo: Alto\n" +"Tiempo: Traslado\n" +"Posiciones: %d/3\n" #: src/mission_companion.cpp msgid "Scout Mission" -msgstr "" +msgstr "Misión de Exploración" #: src/mission_companion.cpp #, c-format @@ -143437,14 +143978,27 @@ msgid "" "Time: Travel\n" "Positions: %d/3\n" msgstr "" +"Notas:\n" +"Enviar compañero a purgar las tierras baldías. Su objetivo es eliminar cualquier cosa hostil que encuentre y regresar cuando esté muy herido o se haya complicado mucho su misión.\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: 4\n" +"Efectos:\n" +"> Hace que las criaturas luchen en lugar de que huyan.\n" +"> Elegir puntos específicos para trazar el camino.\n" +"> Puede pasar por escondites para extender su alcance.\n" +" \n" +"Riesgo: Muy Alto\n" +"Tiempo: Traslado\n" +"Posiciones: %d/3\n" #: src/mission_companion.cpp msgid "Combat Patrol" -msgstr "" +msgstr "Patrulla de Combate" #: src/mission_companion.cpp msgid " Expansion Upgrade" -msgstr "" +msgstr "Mejora de Expansión" #: src/mission_companion.cpp msgid "" @@ -143460,10 +144014,21 @@ msgid "" "Risk: None\n" "Time: Skill Based \n" msgstr "" +"Notas:\n" +"Enviar un compañero a intentar desarmar completamente un vehiculo.\n" +" \n" +"Habilidad usada: mecánica\n" +"Dificultad: 2 \n" +"Efectos:\n" +"> Las partes quitadas serán puestas en muebles en el garage.\n" +"> La habilidad determina qué puede ser recuperado.\n" +" \n" +"Riesgo: Ninguno\n" +"Tiempo: Depende de la Habilidad \n" #: src/mission_companion.cpp msgid " Chop Shop" -msgstr "" +msgstr "Desarmadero" #: src/mission_companion.cpp msgid "" @@ -143471,6 +144036,9 @@ msgid "" "Plow any spaces that have reverted to dirt or grass.\n" " \n" msgstr "" +"Notas:\n" +"Arar cualquier espacio que haya vuelto a ser tierra normal o pasto.\n" +" \n" #: src/mission_companion.cpp msgid "" @@ -143486,10 +144054,21 @@ msgid "" "Time: 5 Min / Plot \n" "Positions: 0/1 \n" msgstr "" +"\n" +" \n" +"Habilidad usada: fabricación\n" +"Dificultad: N/D \n" +"Efectos:\n" +"> Recupera solo los espacios creados en la última expansión.\n" +"> No daña los cultivos que haya.\n" +" \n" +"Riesgo: Ninguno\n" +"Tiempo: 5 Min / Lote \n" +"Posiciones: 0/1 \n" #: src/mission_companion.cpp msgid " Plow Fields" -msgstr "" +msgstr "Arar Campos" #: src/mission_companion.cpp msgid "" @@ -143497,6 +144076,9 @@ msgid "" "Plant designated seeds in the spaces that have already been tilled.\n" " \n" msgstr "" +"Notas:\n" +"Planta las semillas designadas en los lugares que hayan sido arados.\n" +" \n" #: src/mission_companion.cpp msgid "" @@ -143513,10 +144095,22 @@ msgid "" "Time: 1 Min / Plot \n" "Positions: 0/1 \n" msgstr "" +"\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: N/D \n" +"Efectos:\n" +"> Elegir cuáles semilla o si usarás todas las semillas.\n" +"> Detenerse cuando se quede sin semillas o sin lotes.\n" +"> Plantará en todos los montículos de tierra de la expansión.\n" +" \n" +"Riesgo: Ninguno\n" +"Tiempo: 1 Min / Lote \n" +"Posiciones: 0/1 \n" #: src/mission_companion.cpp msgid " Plant Fields" -msgstr "" +msgstr "Plantar Campos" #: src/mission_companion.cpp msgid "" @@ -143524,6 +144118,9 @@ msgid "" "Harvest any plants that are ripe and bring the produce back.\n" " \n" msgstr "" +"Notas:\n" +"Cosechar cualquier planta que esté madura y traer el producto.\n" +" \n" #: src/mission_companion.cpp msgid "" @@ -143538,146 +144135,156 @@ msgid "" "Time: 3 Min / Plot \n" "Positions: 0/1 \n" msgstr "" +"\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: N/D \n" +"Efectos:\n" +"> Dejará todos los productos cosechados en tu lugar.\n" +" \n" +"Riesgo: Ninguno\n" +"Tiempo: 3 Min / Lote \n" +"Posiciones: 0/1 \n" #: src/mission_companion.cpp msgid " Harvest Fields" -msgstr "" +msgstr "Cosechar Campos" #: src/mission_companion.cpp msgid "Working to expand your camp!\n" -msgstr "" +msgstr "¡Trabajando para expandir tu campamento!\n" #: src/mission_companion.cpp msgid " hours left] \n" -msgstr "" +msgstr " horas que faltan] \n" #: src/mission_companion.cpp msgid " minutes left] \n" -msgstr "" +msgstr " minutos que faltan] \n" #: src/mission_companion.cpp msgid " [DONE]\n" -msgstr "" +msgstr " [LISTO]\n" #: src/mission_companion.cpp msgid "Recover Ally from Upgrading" -msgstr "" +msgstr "Recuperar Aliado de Mejoras" #: src/mission_companion.cpp msgid "Working to upgrade your expansions!\n" -msgstr "" +msgstr "¡Trabajando para mejorar tus expansiones!\n" #: src/mission_companion.cpp msgid " Expansion" -msgstr "" +msgstr "Expansión" #: src/mission_companion.cpp msgid "Recover Ally, " -msgstr "" +msgstr "Recuperar Aliado" #: src/mission_companion.cpp msgid "Working at the chop shop...\n" -msgstr "" +msgstr "Trabajando en el desarmadero...\n" #: src/mission_companion.cpp msgid "/120 hours] \n" -msgstr "" +msgstr "/120 horas] \n" #: src/mission_companion.cpp msgid " (Finish) Chop Shop" -msgstr "" +msgstr " (Terminar) Desarmadero" #: src/mission_companion.cpp msgid "Working in your kitchen!\n" -msgstr "" +msgstr "¡Trabajando en tu cocina!\n" #: src/mission_companion.cpp msgid " [ALMOST DONE]\n" -msgstr "" +msgstr " [CASI LISTO]\n" #: src/mission_companion.cpp msgid " (Finish) Cooking" -msgstr "" +msgstr " (Terminar) Cocinar" #: src/mission_companion.cpp msgid "Working in your blacksmith shop!\n" -msgstr "" +msgstr "¡Trabajando en tu herrería!\n" #: src/mission_companion.cpp msgid " (Finish) Smithing" -msgstr "" +msgstr " (Terminar) Herrería" #: src/mission_companion.cpp msgid "Working to plow your fields!\n" -msgstr "" +msgstr "¡Trabajando en arar tus campos!\n" #: src/mission_companion.cpp msgid "/~48 hours] \n" -msgstr "" +msgstr "/~48 horas] \n" #: src/mission_companion.cpp msgid " (Finish) Plow Fields" -msgstr "" +msgstr " (Terminar) Arar Campos" #: src/mission_companion.cpp msgid "Working to plant your fields!\n" -msgstr "" +msgstr "¡Trabajando en plantar en tus campos!\n" #: src/mission_companion.cpp msgid "/4 hours] \n" -msgstr "" +msgstr "/4 horas] \n" #: src/mission_companion.cpp msgid " (Finish) Plant Fields" -msgstr "" +msgstr " (Terminar) Plantar Campos" #: src/mission_companion.cpp msgid "Working to harvest your fields!\n" -msgstr "" +msgstr "¡Trabajando en cosechar tus campos!\n" #: src/mission_companion.cpp msgid "/~10 hours] \n" -msgstr "" +msgstr "/~10 horas] \n" #: src/mission_companion.cpp msgid " (Finish) Harvest Fields" -msgstr "" +msgstr " (Terminar) Cosechar Campos" #: src/mission_companion.cpp msgid "Working on your farm!\n" -msgstr "" +msgstr "¡Trabajando en tu granja!\n" #: src/mission_companion.cpp msgid " (Finish) Crafting" -msgstr "" +msgstr " (Terminar) Fabricación" #: src/mission_companion.cpp msgid "Busy crafting!\n" -msgstr "" +msgstr "¡Ocupado fabricando!\n" #: src/mission_companion.cpp msgid "Searching for materials to upgrade the camp.\n" -msgstr "" +msgstr "Buscando materiales para mejorar el campamento.\n" #: src/mission_companion.cpp msgid "/3 hours] \n" -msgstr "" +msgstr "/3 horas] \n" #: src/mission_companion.cpp msgid "Recover Ally from Gathering" -msgstr "" +msgstr "Recuperar Aliado de Recolección" #: src/mission_companion.cpp msgid "Searching for firewood.\n" -msgstr "" +msgstr "Buscando leña.\n" #: src/mission_companion.cpp msgid "Recover Firewood Gatherers" -msgstr "" +msgstr "Recuperar Recolectores de Leña" #: src/mission_companion.cpp msgid "Performing menial labor...\n" -msgstr "" +msgstr "Haciendo tarea menor...\n" #: src/mission_companion.cpp msgid "" @@ -143685,66 +144292,69 @@ msgid "" " \n" "Do you wish to bring your allies back into your party?\n" msgstr "" +"\n" +" \n" +"¿Querés intentar traer a tus aliados de nuevo a tu grupo?\n" #: src/mission_companion.cpp msgid "Recover Menial Laborer" -msgstr "" +msgstr "Recuperar Trabajador en Tareas Menores" #: src/mission_companion.cpp msgid "Surveying for expansion...\n" -msgstr "" +msgstr "Inspeccionando el terreno para expandir...\n" #: src/mission_companion.cpp msgid "Recover Surveyor" -msgstr "" +msgstr "Recuperar Topógrafo" #: src/mission_companion.cpp msgid "Cutting logs in the woods...\n" -msgstr "" +msgstr "Cortando árboles en el bosque...\n" #: src/mission_companion.cpp msgid "Recover Log Cutter" -msgstr "" +msgstr "Recuperar Talador" #: src/mission_companion.cpp msgid "Setting up a hide site...\n" -msgstr "" +msgstr "Estableciendo escondite...\n" #: src/mission_companion.cpp msgid "Recover Hide Setup" -msgstr "" +msgstr "Recuperar Establecedor de Escondite" #: src/mission_companion.cpp msgid "Constructing fortifications...\n" -msgstr "" +msgstr "Construyendo fortificaciones...\n" #: src/mission_companion.cpp msgid "Finish Map Fortifications" -msgstr "" +msgstr "Terminar Fortificaciones" #: src/mission_companion.cpp msgid "Searching for recruits.\n" -msgstr "" +msgstr "Buscando reclutas.\n" #: src/mission_companion.cpp msgid "Recover Recruiter" -msgstr "" +msgstr "Recuperar Reclutador" #: src/mission_companion.cpp msgid "Scouting the region.\n" -msgstr "" +msgstr "Inspeccionando la región.\n" #: src/mission_companion.cpp msgid "Recover Scout" -msgstr "" +msgstr "Recuperar Explorador" #: src/mission_companion.cpp msgid "Patrolling the region.\n" -msgstr "" +msgstr "Patrullando la región.\n" #: src/mission_companion.cpp msgid "Recover Combat Patrol" -msgstr "" +msgstr "Recuperar Patrulla de Combate" #: src/mission_companion.cpp msgid "" @@ -143780,7 +144390,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Purchase East Field" -msgstr "" +msgstr "Comprar Campo Este" #: src/mission_companion.cpp msgid "" @@ -143816,7 +144426,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Upgrade East Field I" -msgstr "" +msgstr "Mejorar Campo Este I" #: src/mission_companion.cpp msgid "" @@ -143852,7 +144462,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Plant East Field" -msgstr "" +msgstr "Plantar Campo Este" #: src/mission_companion.cpp msgid "" @@ -143888,7 +144498,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Harvest East Field" -msgstr "" +msgstr "Cosechar Campo Este" #: src/mission_companion.cpp msgid "" @@ -143906,7 +144516,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Assign Ally to Forage for Food" -msgstr "" +msgstr "Asignar Aliado a Buscar Comida" #: src/mission_companion.cpp msgid "" @@ -143924,7 +144534,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Recover Ally from Foraging" -msgstr "" +msgstr "Recuperar Aliado de Buscar Comida" #: src/mission_companion.cpp msgid "" @@ -143946,7 +144556,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Caravan Commune-Refugee Center" -msgstr "" +msgstr "Caravana Comuna-Centro de Refugio" #: src/mission_companion.cpp msgid "" @@ -143974,7 +144584,7 @@ msgstr " [TERMINADO] \n" #: src/mission_companion.cpp msgid " Hours] \n" -msgstr "" +msgstr " Horas] \n" #: src/mission_companion.cpp msgid "" @@ -143988,11 +144598,11 @@ msgstr "" #: src/mission_companion.cpp msgid "Begin Commune-Refugee Center Run" -msgstr "" +msgstr "Comenzar Caravana Comuna-Centro de Refugio" #: src/mission_companion.cpp msgid "Recover Commune-Refugee Center" -msgstr "" +msgstr "Recuperar Caravana Comuna-Centro de Refugio" #: src/mission_companion.cpp msgid "There are no missions at this colony. Press Spacebar..." @@ -144016,80 +144626,82 @@ msgstr "se va a trabajar como obrero..." #: src/mission_companion.cpp msgid "You don't have enough food stored to feed your companion." -msgstr "" +msgstr "No tenés suficiente comida almacenada para alimentar a tu compañero." #: src/mission_companion.cpp msgid "begins to upgrade the camp..." -msgstr "" +msgstr "comienza a mejorar el campamento..." #: src/mission_companion.cpp msgid "You already have a companion upgrading the camp." -msgstr "" +msgstr "Ya tenés un compañero mejorando el campamento." #: src/mission_companion.cpp msgid "You don't have the materials for the upgrade." -msgstr "" +msgstr "No tenés los materiales para la mejora." #: src/mission_companion.cpp #, c-format msgid "%s returns from your garage..." -msgstr "" +msgstr "%s vuelve de tu garage..." #: src/mission_companion.cpp #, c-format msgid "%s returns from your kitchen with something..." -msgstr "" +msgstr "%s vuelve de tu cocina con algo..." #: src/mission_companion.cpp #, c-format msgid "%s returns from your blacksmith shop with something..." -msgstr "" +msgstr "%s vuelve de tu herrería con algo..." #: src/mission_companion.cpp #, c-format msgid "%s returns from your farm with something..." -msgstr "" +msgstr "%s vuelve de tu granja con algo..." #: src/mission_companion.cpp #, c-format msgid "%s returns to you with something..." -msgstr "" +msgstr "%s vuelve con algo..." #: src/mission_companion.cpp msgid "departs to search for materials..." -msgstr "" +msgstr "se va a buscar materiales..." #: src/mission_companion.cpp msgid "There are too many companions working on this mission!" -msgstr "" +msgstr "¡Hay demasiados compañeros trabajando en esta misión!" #: src/mission_companion.cpp msgid "departs to search for firewood..." -msgstr "" +msgstr "se va a buscar leña..." #: src/mission_companion.cpp msgid "departs to dig ditches and scrub toilets..." -msgstr "" +msgstr "se va a cavar trincheras y limpiar inodoros..." #: src/mission_companion.cpp msgid "departs to survey land..." -msgstr "" +msgstr "se va a inspeccionar la zona..." #: src/mission_companion.cpp msgid "You have already selected a surveyor!" -msgstr "" +msgstr "¡Ya seleccionaste un topógrafo!" #: src/mission_companion.cpp msgid "begins to upgrade the expansion..." -msgstr "" +msgstr "empieza a mejorar la expansión..." #: src/mission_companion.cpp msgid "You already have a worker upgrading that expansion!" -msgstr "" +msgstr "¡Ya tenés un trabajador mejorando la expansión!" #: src/mission_companion.cpp msgid "Forests and swamps are the only valid cutting locations." msgstr "" +"Los únicos lugares válidos para cortar árboles son los bosques y los " +"pantanos." #: src/mission_companion.cpp #, c-format @@ -144097,53 +144709,56 @@ msgid "" "Trip Estimate:\n" "%s" msgstr "" +"Estimación de Viaje:\n" +"%s" #: src/mission_companion.cpp msgid "departs to cut logs..." -msgstr "" +msgstr "se va a cortar troncos..." #: src/mission_companion.cpp #, c-format msgid "%s returns from working in the woods..." -msgstr "" +msgstr "%s vuelve de trabajar en el bosque..." #: src/mission_companion.cpp msgid "Forests, swamps, and fields are valid hide site locations." msgstr "" +"Los lugares válidos para escondites son los bosques, pantanos y campos." #: src/mission_companion.cpp msgid "departs to build a hide site..." -msgstr "" +msgstr "se va a construir un escondite..." #: src/mission_companion.cpp msgid "You need equipment to setup a hide site..." -msgstr "" +msgstr "Necesitás equipamiento para establecer un escondite..." #: src/mission_companion.cpp #, c-format msgid "%s returns from working on the hide site..." -msgstr "" +msgstr "%s vuelve de trabajar en el escondite..." #: src/mission_companion.cpp msgid "You must select an existing hide site." -msgstr "" +msgstr "Tenés que seleccionar un escondite ya existente." #: src/mission_companion.cpp msgid "Bring gear back?" -msgstr "" +msgstr "¿Querés traer de vuelta el equipo?" #: src/mission_companion.cpp msgid "departs for the hide site..." -msgstr "" +msgstr "se va al escondite..." #: src/mission_companion.cpp msgid "You need equipment to transport between the hide site..." -msgstr "" +msgstr "Necesitás equipamiento para trasladar al escondite..." #: src/mission_companion.cpp #, c-format msgid "%s returns from shuttling gear between the hide site..." -msgstr "" +msgstr "%s vuelve de transportar equipamiento al escondite..." #: src/mission_companion.cpp msgid "" @@ -144151,93 +144766,100 @@ msgid "" "swamps are valid fortification locations. In addition to existing " "fortification constructions." msgstr "" +"Elegí un punto de inicio y uno final. La línea tiene que ser derecho. " +"Campos, bosques y pantanos son lugares válidos para fortificaciones. Se " +"agregan a las fortificaciones existentes." #: src/mission_companion.cpp msgid "Select an end point." -msgstr "" +msgstr "Elegí un punto final." #: src/mission_companion.cpp msgid "Invalid terrain in construction path." -msgstr "" +msgstr "No es un terreno válido para construir un camino." #: src/mission_companion.cpp msgid "You don't have the material to build the fortification." -msgstr "" +msgstr "No tenés el material para construir la fortificación." #: src/mission_companion.cpp msgid "begins constructing fortifications..." -msgstr "" +msgstr "comienza a construir fortificaciones..." #: src/mission_companion.cpp #, c-format msgid "%s returns from constructing fortifications..." -msgstr "" +msgstr "%s vuelve de construir fortificaciones..." #: src/mission_companion.cpp msgid "departs to search for recruits..." -msgstr "" +msgstr "se va a buscar reclutas..." #: src/mission_companion.cpp msgid "" "Select checkpoints until you reach maximum range or select the last point " "again to end." msgstr "" +"Elegí los puntos hasta que alcances el rango máximo o elegí el último punto " +"otra vez para terminar." #: src/mission_companion.cpp msgid "departs on patrol..." -msgstr "" +msgstr "se va a patrullar..." #: src/mission_companion.cpp msgid "Your companion hit a river and didn't know how to swim..." -msgstr "" +msgstr "Tu compañera llega a un río y no sabe nadar..." #: src/mission_companion.cpp msgid "" "Your companion hit a river and didn't know how to swim well enough to " "cross..." msgstr "" +"Tu compañero llega a un río y no sabe nadar bien como para cruzarlo " +"nadando..." #: src/mission_companion.cpp #, c-format msgid "%s didn't return from patrol..." -msgstr "" +msgstr "%s no volvió de patrullar..." #: src/mission_companion.cpp #, c-format msgid "%s returns from patrol..." -msgstr "" +msgstr "%s vuelve de patrullar..." #: src/mission_companion.cpp msgid "You already have someone working in that garage." -msgstr "" +msgstr "Ya tenés a alguien trabajando en el garage." #: src/mission_companion.cpp msgid "begins plowing the field..." -msgstr "" +msgstr "empieza a arar el campo..." #: src/mission_companion.cpp msgid "You already have someone plowing that field." -msgstr "" +msgstr "Ya tenés a alguien arando ese campo." #: src/mission_companion.cpp msgid "You have no additional seeds to give your companions..." -msgstr "" +msgstr "No tenés más semillas para darle a tus compañeros..." #: src/mission_companion.cpp msgid "begins planting the field..." -msgstr "" +msgstr "empieza a plantar el campo..." #: src/mission_companion.cpp msgid "You already have someone planting that field." -msgstr "" +msgstr "Ya tenés a alguien plantando semillas en ese campo." #: src/mission_companion.cpp msgid "begins to harvest the field..." -msgstr "" +msgstr "empieza a cosechar el campo..." #: src/mission_companion.cpp msgid "You already have someone harvesting that field." -msgstr "" +msgstr "Ya tenés a alguien cosechando ese campo." #: src/mission_companion.cpp msgid "departs to work as a carpenter..." @@ -144249,7 +144871,7 @@ msgstr "se va a buscar comida..." #: src/mission_companion.cpp msgid "Done" -msgstr "" +msgstr "Listo" #: src/mission_companion.cpp #, c-format @@ -144477,6 +145099,14 @@ msgid "" "Risk: None\n" "Time: %s\n" msgstr "" +"Notas:\n" +"%s\n" +" \n" +"Habilidad usada: %s\n" +"Dificultad: %d\n" +"%s \n" +"Riesgo: Ninguno\n" +"Tiempo: %s\n" #: src/mission_companion.cpp #, c-format @@ -144486,6 +145116,10 @@ msgid "" "%s\n" "Time: %s\n" msgstr "" +"Habilidad usada: %s\n" +"Dificultad: %d\n" +"%s\n" +"Tiempo: %s\n" #: src/mission_companion.cpp msgid "" @@ -144496,6 +145130,12 @@ msgid "" "Difficulty: N/A \n" "Gathering Possibilities:\n" msgstr "" +"Notas: \n" +"Enviar compañero a recoger materiales para la próxima mejora del campamento.\n" +" \n" +"Habilidad usada: supervivencia\n" +"Dificultad: N/D \n" +"Posibilidad de Recolectar:\n" #: src/mission_companion.cpp msgid "" @@ -144504,28 +145144,36 @@ msgid "" "Time: 3 Hours, Repeated\n" "Positions: " msgstr "" +" \n" +"Riesgo: Muy Poco\n" +"Tiempo: 3 Horas, Repetir\n" +"Posiciones: " #: src/mission_companion.cpp #, c-format msgid "" "%s returns from upgrading the camp having earned a bit of experience..." msgstr "" +"%s vuelve de mejorar el campamento habiendo ganado un poco de experiencia..." #: src/mission_companion.cpp #, c-format msgid "While gathering supplies, a silent specter approaches %s..." msgstr "" +"Mientras recolectaba suministros, un espectador silencioso se acerca a %s..." #: src/mission_companion.cpp #, c-format msgid "" "%s notices the antlered horror and slips away before it gets too close." msgstr "" +"%s ve un horror con cuernos y se escabulle antes de que se le acerque " +"demasiado." #: src/mission_companion.cpp #, c-format msgid "The survivor approaches %s asking for directions." -msgstr "" +msgstr "El sobreviviente se acerca a %s preguntando direcciones." #: src/mission_companion.cpp #, c-format @@ -144533,20 +145181,22 @@ msgid "" "Fearful that he may be an agent of some hostile faction, %s doesn't mention " "the camp." msgstr "" +"Por temor a que pertenezca a un bando hostil, %s no menciona el campamento." #: src/mission_companion.cpp msgid "The two part on friendly terms and the survivor isn't seen again." msgstr "" +"Los dos se separan en buenos términos y el sobreviviente no es vuelto a ver." #: src/mission_companion.cpp #, c-format msgid "%s didn't detect the ambush until it was too late!" -msgstr "" +msgstr "¡%s no se dio cuenta de la emboscada hasta que fue demasiado tarde!" #: src/mission_companion.cpp #, c-format msgid "The bull moose charged %s from the tree line..." -msgstr "" +msgstr "El alce macho ataca a %s desde los árboles..." #: src/mission_companion.cpp #, c-format @@ -144554,11 +145204,13 @@ msgid "" "Despite being caught off guard %s was able to run away until the moose gave " "up pursuit." msgstr "" +"A pesar de ser agarrado/a por sorpresa, %s pudo escaparse del alce hasta " +"que dejó de perseguirlo/a." #: src/mission_companion.cpp #, c-format msgid "The jabberwock grabbed %s by the arm from behind and began to scream." -msgstr "" +msgstr "El jabberwock agarró a %s por el brazo desde atrás y empezó a gritar." #: src/mission_companion.cpp #, c-format @@ -144566,15 +145218,17 @@ msgid "" "Terrified, %s spun around and delivered a massive kick to the creature's " "torso..." msgstr "" +"Horrorizado/a, %s giró y le dió una tremenda patada a la criatura en el " +"torso..." #: src/mission_companion.cpp #, c-format msgid "Collapsing into a pile of gore, %s walked away unscathed..." -msgstr "" +msgstr "Cayendo en una pila de tripas, %s se retiró ileso/a..." #: src/mission_companion.cpp msgid "(Sounds like bullshit, you wonder what really happened.)" -msgstr "" +msgstr "(Parece todo mentira, te preguntás qué habrá pasado.)" #: src/mission_companion.cpp #, c-format @@ -144582,19 +145236,22 @@ msgid "" "%s turned to find the hideous black eyes of a giant wasp staring back from " "only a few feet away..." msgstr "" +"%s se dió vuelta y encontró los horribles ojos negros de una avispa gigante " +"mirandolo/a desde unos pocos metros..." #: src/mission_companion.cpp msgid "The screams were terrifying, there was nothing anyone could do." -msgstr "" +msgstr "Los gritos eran terroríficos, nadie podía hacer nada." #: src/mission_companion.cpp #, c-format msgid "Pieces of %s were found strewn across a few bushes." -msgstr "" +msgstr "Se encontraron pedazos de %s desparramados entre los arbustos." #: src/mission_companion.cpp msgid "(You wonder if your companions are fit to work on their own...)" msgstr "" +"(Te preguntás si tus compañeros están preparados para trabajar solos...)" #: src/mission_companion.cpp #, c-format @@ -144602,10 +145259,12 @@ msgid "" "%s returns from gathering materials carrying supplies and has a bit more " "experience..." msgstr "" +"%s vuelve de recolectar materiales cargando suministros, y tiene un poco más" +" de experiencia..." #: src/mission_companion.cpp msgid "Your companion seems disappointed that your pantry is empty..." -msgstr "" +msgstr "Tu compañero parece decepcionado porque tu despensa está vacía..." #: src/mission_companion.cpp #, c-format @@ -144613,94 +145272,98 @@ msgid "" " Chopping this vehicle:\n" "%s" msgstr "" +" Desarmando este vehículo:\n" +"%s" #: src/mission_companion.cpp msgid "begins working in the garage..." -msgstr "" +msgstr "empieza a trabajar en el garage..." #: src/mission_companion.cpp msgid "No seeds to plant!" -msgstr "" +msgstr "¡No hay semillas para plantar!" #: src/mission_companion.cpp #, c-format msgid "%s returns from working your fields..." -msgstr "" +msgstr "%s vuelve de trabajar en tus campos..." #: src/mission_companion.cpp #, c-format msgid "%s returns from doing the dirty work to keep the camp running..." msgstr "" +"%s vuelve de hacer el trabajo sucio para que el campamento siga " +"funcionando..." #: src/mission_companion.cpp msgid "Sorting points have changed, forcing reset." -msgstr "" +msgstr "Los puntos de orden fueron cambiados, forzando el reajuste." #: src/mission_companion.cpp msgid "Select an expansion:" -msgstr "" +msgstr "Elegí una expansión:" #: src/mission_companion.cpp msgid "You choose to wait..." -msgstr "" +msgstr "Elegís esperar..." #: src/mission_companion.cpp #, c-format msgid "%s returns from surveying for the expansion." -msgstr "" +msgstr "%s vuelve de inspeccionar la zona para una expansión." #: src/mission_companion.cpp msgid "No items are located at the drop point..." -msgstr "" +msgstr "No hay objetos ubicados en el punto de entrega..." #: src/mission_companion.cpp #, c-format msgid "You distribute %d kcal worth of food to your companions." -msgstr "" +msgstr "Distribuís los %d kcal de comida entre tus compañeros." #: src/mission_companion.cpp msgid "Harvestable: " -msgstr "" +msgstr "Cosechable: " #: src/mission_companion.cpp msgid "Ready for Planting: " -msgstr "" +msgstr "Listo para Plantar: " #: src/mission_companion.cpp msgid "Needs Plowing: " -msgstr "" +msgstr "Necesita Arar: " #: src/mission_companion.cpp #, c-format msgid "Name: %25s\n" -msgstr "" +msgstr "Nombre: %25s\n" #: src/mission_companion.cpp msgid "---- Engines ----\n" -msgstr "" +msgstr "---- Motores ----\n" #: src/mission_companion.cpp #, c-format msgid "Engine: %25s\n" -msgstr "" +msgstr "Motor: %25s\n" #: src/mission_companion.cpp #, c-format msgid ">Status: %24d%%\n" -msgstr "" +msgstr ">Estado: %24d%%\n" #: src/mission_companion.cpp #, c-format msgid ">Fuel: %25s\n" -msgstr "" +msgstr ">Combustible: %25s\n" #: src/mission_companion.cpp msgid "---- Fuel Storage & Battery ----\n" -msgstr "" +msgstr "---- Almacenamiento de combustible & Batería ----\n" #: src/mission_companion.cpp msgid "Estimated Chop Time: 5 Days\n" -msgstr "" +msgstr "Tiempo Estimado de Tala: 5 Días\n" #: src/mission_companion.cpp #, c-format @@ -144820,7 +145483,7 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "Engagement between %d members of %s %s and %d %s%s!" -msgstr "" +msgstr "¡Combate entre %d miembros de %s %s y %d %s%s!" #: src/mission_companion.cpp #, c-format @@ -144834,11 +145497,11 @@ msgstr "¡Las fuerzas de %s se retiran del combate!" #: src/mission_companion.cpp msgid "The monsters are destroyed!" -msgstr "" +msgstr "¡Los monstruos son destruídos!" #: src/mission_companion.cpp msgid "The monsters disengage!" -msgstr "" +msgstr "¡Los monstruos se retiran!" #: src/mission_companion.cpp #, c-format @@ -144853,14 +145516,16 @@ msgstr "No tenés ningún compañero para enviar..." msgid "" "Who do you want to send? [ COMBAT : SURVIVAL : INDUSTRY ]" msgstr "" +"¿A quién querés enviar? [ COMBATE : SUPERVIVENCIA : " +"INDUSTRIA ]" #: src/mission_companion.cpp msgid "You choose to send no one..." -msgstr "" +msgstr "Elegís no enviar a nadie..." #: src/mission_companion.cpp msgid "The companion you selected doesn't have the skills!" -msgstr "" +msgstr "¡El compañero que elegiste no tiene esas habilidades!" #: src/mission_companion.cpp msgid "You don't have any companions ready to return..." @@ -144876,128 +145541,130 @@ msgstr "Nadie regresa a tu grupo..." #: src/mission_companion.cpp msgid "MAIN" -msgstr "" +msgstr "PRINCIPAL" #: src/mission_companion.cpp msgid " [N] " -msgstr "" +msgstr " [N] " #: src/mission_companion.cpp msgid " [NE] " -msgstr "" +msgstr " [NE] " #: src/mission_companion.cpp msgid " [E] " -msgstr "" +msgstr " [E] " #: src/mission_companion.cpp msgid " [SE] " -msgstr "" +msgstr " [SE] " #: src/mission_companion.cpp msgid " [S] " -msgstr "" +msgstr " [S] " #: src/mission_companion.cpp msgid " [SW] " -msgstr "" +msgstr " [SO] " #: src/mission_companion.cpp msgid " [W] " -msgstr "" +msgstr " [O] " #: src/mission_companion.cpp msgid " [NW] " -msgstr "" +msgstr " [NO] " #: src/mission_companion.cpp msgid "Farm Expansion" -msgstr "" +msgstr "Expansión de Granja" #: src/mission_companion.cpp msgid "Garage Expansion" -msgstr "" +msgstr "Expansión de Garage" #: src/mission_companion.cpp msgid "Kitchen Expansion" -msgstr "" +msgstr "Expansión de Cocina" #: src/mission_companion.cpp msgid "Blacksmith Expansion" -msgstr "" +msgstr "Expansión de Herrería" #: src/mission_companion.cpp msgid "Empty Expansion" -msgstr "" +msgstr "Expansión Vacía" #: src/mission_companion.cpp #, c-format msgid "Select a location between %d and %d tiles away." -msgstr "" +msgstr "Elegí un lugar entre %d y %d espacios de distancia." #: src/mission_companion.cpp #, c-format msgid "" "You must select a target between %d and %d range from the base. Range: %d" msgstr "" +"Tenés que seleccionar un objetivo entre %d y %d de rango de la base. Rango: " +"%d" #: src/mission_companion.cpp msgid "You must be able to see the target that you select." -msgstr "" +msgstr "Tenés que poder ver el objetivo que seleccionaste." #: src/mission_companion.cpp msgid "Do you want to bounce off this location to extend range?" -msgstr "" +msgstr "¿Querés parar en este lugar para extender el alcance?" #: src/mission_companion.cpp #, c-format msgid ">Distance:%15.2f (km)\n" -msgstr "" +msgstr ">Distancia:%15.2f (km)\n" #: src/mission_companion.cpp #, c-format msgid ">One Way: %15d (trips)\n" -msgstr "" +msgstr ">Una Dirección: %15d (viajes)\n" #: src/mission_companion.cpp #, c-format msgid ">Covered: %15.2f (km)\n" -msgstr "" +msgstr ">Recorridos: %15.2f (km)\n" #: src/mission_companion.cpp #, c-format msgid ">Distance:%15d (m)\n" -msgstr "" +msgstr ">Distancia:%15d (m)\n" #: src/mission_companion.cpp #, c-format msgid ">Covered: %15d (m)\n" -msgstr "" +msgstr ">Recorridos: %15d (m)\n" #: src/mission_companion.cpp #, c-format msgid ">Travel: %15d (hours)\n" -msgstr "" +msgstr ">Viaje: %15d (horas)\n" #: src/mission_companion.cpp #, c-format msgid ">Working: %15d (hours)\n" -msgstr "" +msgstr ">Trabajo: %15d (horas)\n" #: src/mission_companion.cpp #, c-format msgid "Total: %15d (days)\n" -msgstr "" +msgstr "Total: %15d (días)\n" #: src/mission_companion.cpp #, c-format msgid "Total: %15d (hours)\n" -msgstr "" +msgstr "Total: %15d (horas)\n" #: src/mission_companion.cpp #, c-format msgid "Total: %15d (minutes)\n" -msgstr "" +msgstr "Total: %15d (minutos)\n" #: src/mission_companion.cpp #, c-format @@ -145005,14 +145672,16 @@ msgid "" "Food: %15d (kcal)\n" " \n" msgstr "" +"Comida: %15d (kcal)\n" +" \n" #: src/mission_companion.cpp msgid "food for you" -msgstr "" +msgstr "comida para vos" #: src/mission_companion.cpp msgid "food for companions" -msgstr "" +msgstr "comida para compañeros" #: src/mission_companion.cpp msgid "weapons" @@ -145028,15 +145697,15 @@ msgstr "biónicos" #: src/mission_companion.cpp msgid "all kinds of tools" -msgstr "" +msgstr "toda clase de herramientas" #: src/mission_companion.cpp msgid "wood of various sorts" -msgstr "" +msgstr "maderas de distintos tipos" #: src/mission_companion.cpp msgid "trash and rotting food" -msgstr "" +msgstr "basura y comida podrida" #: src/mission_companion.cpp msgid "books" @@ -145044,7 +145713,7 @@ msgstr "libros" #: src/mission_companion.cpp msgid "medication" -msgstr "" +msgstr "medicamentos" #: src/mission_companion.cpp msgid "ammo" @@ -157564,6 +158233,14 @@ msgstr "No podés chuparle el combustible a un vehículo en movimiento." msgid "Select part to siphon: " msgstr "" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "Acá no hay ninguna rueda para cambiar." @@ -157753,6 +158430,10 @@ msgstr "-sacar" msgid "iphon" msgstr "-chupar" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "" + #: src/veh_interact.cpp msgid "hange tire" msgstr "ambiar rueda" @@ -157903,6 +158584,10 @@ msgstr "¿Qué aparato usar?" msgid "Select tank to siphon:" msgstr "" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/es_ES.po b/lang/po/es_ES.po index 0fcdd2ebe31dc..2751fee35f3fe 100644 --- a/lang/po/es_ES.po +++ b/lang/po/es_ES.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Víctor Arias , 2018\n" "Language-Team: Spanish (Spain) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/es_ES/)\n" @@ -31729,6 +31729,10 @@ msgstr "motor diésel" msgid "base gasoline engine" msgstr "motor a gasolina" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "motor de 1 cilindro" @@ -31834,6 +31838,114 @@ msgid "" "trucks." msgstr "" +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -40332,6 +40444,15 @@ msgstr "" msgid "ARMOR" msgstr "ARMADURA" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "cinta cargadora" @@ -45524,7 +45645,7 @@ msgstr "" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" @@ -46571,12 +46692,8 @@ msgstr "serpiente de cascabel gigante" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" -"Es una serpiente de cascabel de la madera mutada, de unas tres veces más " -"grande que la común. Aunque no es lo suficientemente grande como para " -"considerar a los humanos su presa, es más agresiva y peligrosa comparada a " -"la cascabel normal." #: lang/json/MONSTER_from_json.py msgid "sewer snake" @@ -53826,9 +53943,9 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" -msgstr[0] "reloj de bolsillo" -msgstr[1] "relojes de bolsillo" +msgid_plural "pocket watches" +msgstr[0] "" +msgstr[1] "" #. ~ Description for pocket watch #: lang/json/TOOL_from_json.py @@ -70244,8 +70361,8 @@ msgstr "" #: lang/json/gunmod_from_json.py msgid ".45 caliber conversion kit" msgid_plural ".45 caliber conversion kits" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "kit de conversión del calibre .45" +msgstr[1] "kits de conversión del calibre .45" #: lang/json/gunmod_from_json.py msgid "" @@ -73257,6 +73374,10 @@ msgstr "Parte arreglada" msgid "Refill tank/battery" msgstr "Rellenar tanque/Cargar batería" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "Quitar parte" @@ -74228,7 +74349,7 @@ msgstr "" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CACTUS" -msgstr "" +msgstr "CACTUS" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -74243,7 +74364,7 @@ msgstr "" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "PEAR" -msgstr "" +msgstr "PERAL" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -74968,7 +75089,7 @@ msgstr "" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Laboratory Train Controls" -msgstr "" +msgstr "Controles del Tren del Laboratorio" #. ~ Computer option #: lang/json/mapgen_from_json.py @@ -77132,7 +77253,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "I don't think we got it yet." -msgstr "" +msgstr "No creo que lo hayamos conseguido todavía." #: lang/json/mission_def_from_json.py msgid "Kill Jabberwock" @@ -77575,7 +77696,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Do you have the stills?" -msgstr "" +msgstr "¿Tienes los alambiques?" #: lang/json/mission_def_from_json.py msgid "Thank you for the delivery." @@ -85824,7 +85945,7 @@ msgstr "" #: lang/json/npc_class_from_json.py msgid "Plant Mutant" -msgstr "" +msgstr "Planta Mutante" #: lang/json/npc_class_from_json.py msgid "" @@ -86742,6 +86863,10 @@ msgstr "baño público" msgid "roadside foodcart" msgstr "carrito de la compra al borde de la carretera" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "cementerio religioso" @@ -86885,7 +87010,7 @@ msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "kitchen" -msgstr "" +msgstr "cocina" #: lang/json/overmap_terrain_from_json.py msgid "hide site" @@ -87069,7 +87194,7 @@ msgid "stadium parking" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" +msgid "stadium" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -87137,7 +87262,7 @@ msgid "trailer park" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" +msgid "mass grave" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -87217,11 +87342,11 @@ msgid "Bankrupt Pizzeria" msgstr "Pizzería en bancarrota" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -87298,7 +87423,7 @@ msgstr "" #: lang/json/overmap_terrain_from_json.py msgid "barracks" -msgstr "" +msgstr "barracas" #: lang/json/overmap_terrain_from_json.py msgid "fuel point" @@ -87430,11 +87555,19 @@ msgid "animal clinic" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" +msgid "war memorial" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - barn" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" +msgid "ruined cabin - car corner" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" msgstr "" #: lang/json/professions_from_json.py @@ -93352,7 +93485,7 @@ msgstr "" #: lang/json/recipe_group_from_json.py msgid "Farm" -msgstr "" +msgstr "Granja" #: lang/json/recipe_group_from_json.py lang/json/start_location_from_json.py msgid "Garage" @@ -93360,7 +93493,7 @@ msgstr "Taller mecánico" #: lang/json/recipe_group_from_json.py msgid "Kitchen" -msgstr "" +msgstr "Cocina" #: lang/json/recipe_group_from_json.py msgid "Blacksmith Shop" @@ -93384,7 +93517,7 @@ msgstr "" #: lang/json/recipe_group_from_json.py msgid " Cook: Egg, Boiled" -msgstr "" +msgstr "Cocinar: Huevo, Cocido" #: lang/json/recipe_group_from_json.py msgid " Cook: Starch" @@ -93400,15 +93533,15 @@ msgstr "" #: lang/json/recipe_group_from_json.py msgid " Cook: Flour" -msgstr "" +msgstr "Cocinar: Harina" #: lang/json/recipe_group_from_json.py msgid " Cook: Salt" -msgstr "" +msgstr "Cocinar: Sal" #: lang/json/recipe_group_from_json.py msgid " Cook: Bread" -msgstr "" +msgstr "Cocinar: Pan" #: lang/json/recipe_group_from_json.py msgid " Cook: Fruit Leather" @@ -110721,6 +110854,10 @@ msgstr "" msgid "SWAT Truck" msgstr "Camión de SWAT" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "Tractor Automático" @@ -111953,15 +112090,21 @@ msgid "external cargo rack" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." msgstr "" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" #: lang/json/vehicle_part_from_json.py @@ -112272,6 +112415,14 @@ msgstr "tanque externo (200L)" msgid "barrel (100L)" msgstr "barril (100L)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "lanzallamas montado" @@ -113611,6 +113762,12 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -119548,7 +119705,8 @@ msgstr[1] "Necesitas un/a %s con %d cargas." #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "No importa." @@ -119863,6 +120021,42 @@ msgstr "Golpeaste %s causando %d de daño." msgid "%1$s shoots %2$s." msgstr "%1$s dispara a %2$s." +#: src/creature.cpp +msgid "Severe pain" +msgstr "" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "" + +#: src/creature.cpp +msgid "No pain" +msgstr "" + #: src/creature.cpp msgid "Hostile" msgstr "Hostil" @@ -123612,15 +123806,15 @@ msgstr "Mundo retenido. Personajes que quedan:%s" msgid "Wait till you wake up..." msgstr "" -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "(Y)-Sí, (N)o, (I)gnorar otras distracciones y terminar." - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s. Auto-moverse cancelado" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -125054,7 +125248,7 @@ msgstr "¡%s no tiene adonde ir!" msgid "Use which item?" msgstr "¿Qué objeto usar?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "No importa" @@ -129225,7 +129419,7 @@ msgstr "¿Qué semilla quieres usar?" #: src/iexamine.cpp #, c-format msgid "Planted %s." -msgstr "" +msgstr "Plantaste %s." #: src/iexamine.cpp msgid "You have no seeds to plant." @@ -153018,6 +153212,14 @@ msgstr "No puedes usar el sifón en un vehículo en movimiento." msgid "Select part to siphon: " msgstr "" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "Aquí no hay ninguna rueda para cambiar." @@ -153201,6 +153403,10 @@ msgstr "-sacar" msgid "iphon" msgstr "ifón" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "" + #: src/veh_interact.cpp msgid "hange tire" msgstr "ambiar rueda" @@ -153351,6 +153557,10 @@ msgstr "¿Qué aparato usar?" msgid "Select tank to siphon:" msgstr "" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/fr.po b/lang/po/fr.po index 83d246a96ac0f..5d048a87e014c 100644 --- a/lang/po/fr.po +++ b/lang/po/fr.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Pierre de Sahb , 2018\n" "Language-Team: French (https://www.transifex.com/cataclysm-dda-translators/teams/2217/fr/)\n" @@ -31675,6 +31675,10 @@ msgstr "moteur diesel" msgid "base gasoline engine" msgstr "moteur a gasoil" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "moteur 1 cylindre" @@ -31782,6 +31786,114 @@ msgstr "" "Un imposant et très puissant moteur V12, généralement monté sur de gros " "camions." +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -39982,6 +40094,15 @@ msgstr "ARTÉFACTS" msgid "ARMOR" msgstr "ARMURE" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "ceinture de munitions" @@ -44745,7 +44866,7 @@ msgstr "" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" @@ -45736,11 +45857,8 @@ msgstr "crotale géant" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" -"Un crotale des bois mutant, environ trois fois plus grand que la normale. " -"Bien qu'il ne soit pas assez grand pour voir les humains comme des proies " -"potentielles, il est plus agressif et dangereux qu'un crotale normal." #: lang/json/MONSTER_from_json.py msgid "sewer snake" @@ -52515,9 +52633,9 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" -msgstr[0] "montre à gousset" -msgstr[1] "montres à gousset" +msgid_plural "pocket watches" +msgstr[0] "" +msgstr[1] "" #. ~ Description for pocket watch #: lang/json/TOOL_from_json.py @@ -70666,6 +70784,10 @@ msgstr "" msgid "Refill tank/battery" msgstr "Remplir réservoir/batterie" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "Enlever une pièce" @@ -83729,6 +83851,10 @@ msgstr "toilettes publiques" msgid "roadside foodcart" msgstr "" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "" @@ -84056,7 +84182,7 @@ msgid "stadium parking" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" +msgid "stadium" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -84124,7 +84250,7 @@ msgid "trailer park" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" +msgid "mass grave" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -84204,11 +84330,11 @@ msgid "Bankrupt Pizzeria" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -84417,11 +84543,19 @@ msgid "animal clinic" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" +msgid "war memorial" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" +msgid "ruined cabin - barn" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" msgstr "" #: lang/json/professions_from_json.py @@ -106155,6 +106289,10 @@ msgstr "" msgid "SWAT Truck" msgstr "Fourgon SWAT" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "" @@ -107387,15 +107525,21 @@ msgid "external cargo rack" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." msgstr "" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" #: lang/json/vehicle_part_from_json.py @@ -107706,6 +107850,14 @@ msgstr "réservoir externe (200L)" msgid "barrel (100L)" msgstr "" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "lance-flammes installé" @@ -109045,6 +109197,12 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -114931,7 +115089,8 @@ msgstr[1] "" #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "Pas la peine." @@ -115243,6 +115402,42 @@ msgstr "Vous touchez %s pour %d dommages." msgid "%1$s shoots %2$s." msgstr "%1$s tire sur %2$s." +#: src/creature.cpp +msgid "Severe pain" +msgstr "" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "" + +#: src/creature.cpp +msgid "No pain" +msgstr "" + #: src/creature.cpp msgid "Hostile" msgstr "" @@ -118964,15 +119159,15 @@ msgstr "Monde conservé. Personnages restants:%s" msgid "Wait till you wake up..." msgstr "" -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "(Y)Oui, (N)Non, (I)Ignorer toutes distractions et terminer." - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s. Déplacement auto. annulé" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -120393,7 +120588,7 @@ msgstr "%s n'a nulle part où aller!" msgid "Use which item?" msgstr "Utiliser quel objet?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "Pas la peine" @@ -147703,6 +147898,14 @@ msgstr "Vous ne pouvez siphonner un véhicule en mouvement." msgid "Select part to siphon: " msgstr "" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "Il n'y a pas de roue à changer ici." @@ -147890,6 +148093,10 @@ msgstr "-enlever" msgid "iphon" msgstr "iphoner" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "" + #: src/veh_interact.cpp msgid "hange tire" msgstr "hanger le pneu" @@ -148040,6 +148247,10 @@ msgstr "Utiliser quel composant?" msgid "Select tank to siphon:" msgstr "" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/hu.po b/lang/po/hu.po index 14e5f66c685f6..33201b738076e 100644 --- a/lang/po/hu.po +++ b/lang/po/hu.po @@ -4,7 +4,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Daniel Szollosi-Nagy , 2018\n" "Language-Team: Hungarian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/hu/)\n" @@ -31311,6 +31311,10 @@ msgstr "alap dízelmotor" msgid "base gasoline engine" msgstr "alap benzinmotor" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "Egy egyhengeres, négyütemű belsőégésű motor." @@ -31418,6 +31422,114 @@ msgstr "" "Masszív és rendkívül nagy teljesítményű V12 motor, általában nehéz " "tehergépjárművekben található." +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -39795,6 +39907,15 @@ msgstr "MŰTÁRGYAK" msgid "ARMOR" msgstr "PÁNCÉL" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "lőszerheveder" @@ -44961,11 +45082,9 @@ msgstr "sáska lárva" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" -"Nyúlméretű sáska. Jobb inkább nem is belegondolni, hogy egy ebből egy raj " -"milyen pusztításra képes." #: lang/json/MONSTER_from_json.py msgid "bear cub" @@ -46007,11 +46126,8 @@ msgstr "óriás csörgőkígyó" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" -"Ez a mutáns erdei csörgőkígyó háromszor akkora, mint megszokott. Bár nem " -"elég nagy ahhoz, hogy az emberre potenciális zsákmányként tekintsen, a " -"szokványos csörgőkígyónál agresszívabb és veszélyesebb." #: lang/json/MONSTER_from_json.py msgid "sewer snake" @@ -53175,9 +53291,9 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" -msgstr[0] "zsebóra" -msgstr[1] "zsebóra" +msgid_plural "pocket watches" +msgstr[0] "" +msgstr[1] "" #. ~ Description for pocket watch #: lang/json/TOOL_from_json.py @@ -72218,6 +72334,10 @@ msgstr "Alkatrész megszerelése" msgid "Refill tank/battery" msgstr "Tartály/akkumulátor újratöltése" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "Alkatrész eltávolítása" @@ -85621,6 +85741,10 @@ msgstr "nyilvános mosdó" msgid "roadside foodcart" msgstr "útmenti étel stand" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "vallásos temető" @@ -85948,7 +86072,7 @@ msgid "stadium parking" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" +msgid "stadium" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -86016,7 +86140,7 @@ msgid "trailer park" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" +msgid "mass grave" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -86096,11 +86220,11 @@ msgid "Bankrupt Pizzeria" msgstr "csődbe ment pizzéria" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -86309,11 +86433,19 @@ msgid "animal clinic" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" +msgid "war memorial" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" +msgid "ruined cabin - barn" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" msgstr "" #: lang/json/professions_from_json.py @@ -108030,6 +108162,10 @@ msgstr "" msgid "SWAT Truck" msgstr "SWAT furgon" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "Automata traktor" @@ -109262,15 +109398,21 @@ msgid "external cargo rack" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." msgstr "" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" #: lang/json/vehicle_part_from_json.py @@ -109581,6 +109723,14 @@ msgstr "külső tartály (200L)" msgid "barrel (100L)" msgstr "hordó (100L)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "beépített lángszóró" @@ -110920,6 +111070,12 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -116835,7 +116991,8 @@ msgstr[1] "" #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "Mindegy." @@ -117150,6 +117307,42 @@ msgstr "A(z) %sn %d pont sebzést okoztál." msgid "%1$s shoots %2$s." msgstr "A(z) %1$s meglövi %2$st." +#: src/creature.cpp +msgid "Severe pain" +msgstr "" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "" + +#: src/creature.cpp +msgid "No pain" +msgstr "" + #: src/creature.cpp msgid "Hostile" msgstr "Ellenséges" @@ -120863,15 +121056,15 @@ msgstr "A világ megmaradt, az alábbi karakterek élnek még benne: %s" msgid "Wait till you wake up..." msgstr "Várd meg az ébredést..." -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "(Y) Igen, (N)em, A többi zavaró dolog f(I)gyelmen kívül hagyása." - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -122292,7 +122485,7 @@ msgstr "" msgid "Use which item?" msgstr "" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "" @@ -149201,6 +149394,14 @@ msgstr "Mozgó járműből nem lehet üzemanyagot leszívni." msgid "Select part to siphon: " msgstr "" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "Itt nincs olyan kerék, amit le lehetne cserélni." @@ -149390,6 +149591,10 @@ msgstr "eltáolít" msgid "iphon" msgstr "lezív" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "" + #: src/veh_interact.cpp msgid "hange tire" msgstr "keréksere" @@ -149540,6 +149745,10 @@ msgstr "Melyik kütyüt használod?" msgid "Select tank to siphon:" msgstr "" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/ja.po b/lang/po/ja.po index d070a91a5b673..de7d0725a86d3 100644 --- a/lang/po/ja.po +++ b/lang/po/ja.po @@ -8,6 +8,7 @@ # YueKaburagi, 2018 # Vault3024, 2018 # shinmuro , 2018 +# 1 1, 2018 # AkAset , 2018 # 関 真護, 2018 # nishizaki tadahito , 2018 @@ -15,7 +16,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: nishizaki tadahito , 2018\n" "Language-Team: Japanese (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ja/)\n" @@ -2574,7 +2575,7 @@ msgstr "無造作に尖らせた金属製の矢柄に、未加工の素材を矢 #: lang/json/AMMO_from_json.py msgid "metal broadhead arrow" -msgstr "矢(カーボン/矢尻)" +msgstr "矢(金属/矢尻)" #. ~ Description for metal broadhead arrow #: lang/json/AMMO_from_json.py @@ -13979,8 +13980,7 @@ msgid "" "powered, this system will prevent heat damage up to 2000 degrees Fahrenheit." " Note that this does not affect your internal temperature." msgstr "" -"強力な超耐熱合金で作られたヒートシンクがあなたの肉に織り込まれます。電源が入っている間、このシステムは摂氏で " -"約1000度の熱ダメージを防ぎます。この機能は体温には影響しません。" +"強力な超耐熱合金で作られたヒートシンクが肉体に織り込まれます。電源が入っている間、このシステムは摂氏約1000度の熱ダメージを防ぎます。この機能は体温には影響しません。" #: lang/json/BIONIC_ITEM_from_json.py msgid "Hydraulic Muscles CBM" @@ -26114,7 +26114,7 @@ msgstr "肉、野菜、チーズ、そして各種の調味料を挟んだ豪華 #: lang/json/COMESTIBLE_from_json.py msgid "gluten free cucumber sandwich" msgid_plural "gluten free cucumber sandwiches" -msgstr[0] "穀物不使用サンドイッチ(キュウリ)" +msgstr[0] "穀物不使用サンドイッチ(キュウリ)" #. ~ Description for gluten free cucumber sandwich #: lang/json/COMESTIBLE_from_json.py @@ -26146,7 +26146,7 @@ msgstr "蜂蜜を塗った美味しいグルテンフリーのサンドイッチ #: lang/json/COMESTIBLE_from_json.py msgid "gluten free boring sandwich" msgid_plural "gluten free boring sandwiches" -msgstr[0] "食物不使用サンドイッチ(ソース)" +msgstr[0] "穀物不使用サンドイッチ(ソース)" #. ~ Description for gluten free boring sandwich #: lang/json/COMESTIBLE_from_json.py @@ -26985,6 +26985,10 @@ msgstr "ディーゼルエンジン(ベース)" msgid "base gasoline engine" msgstr "ガソリンエンジン(ベース)" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "蒸気エンジン(ベース)" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "単気筒エンジン" @@ -27088,6 +27092,123 @@ msgid "" "trucks." msgstr "巨大で凄まじく強力なV型12気筒エンジンです。通常は大型トラックに使用されます。" +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "簡易蒸気エンジン" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" +"原始的な小型の蒸気機関です。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がシャフトに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "小型蒸気エンジン" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"小型の蒸気機関です。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がシャフトに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "中型蒸気エンジン" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" +"中型の蒸気機関です。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がシャフトに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "大型蒸気エンジン" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"大型の蒸気機関です。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がシャフトに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "超大型蒸気エンジン" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"超大型の蒸気機関です。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がシャフトに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "小型蒸気タービン" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"小型の蒸気タービンです。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がタービンに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "中型蒸気タービン" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"中型の蒸気タービンです。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がタービンに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "大型蒸気タービン" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"大型の蒸気タービンです。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がタービンに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "超大型蒸気タービン" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"超大型の蒸気タービンです。一体化したボイラーが石炭を燃焼させて水を加熱し、発生した水蒸気がタービンに動力を与え、その後凝縮器に水を集める密閉サイクルで動作しています。" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -34254,6 +34375,15 @@ msgstr "アーティファクト" msgid "ARMOR" msgstr "防具" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "燃料箱" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "固体燃料を貯蔵する容器です。" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "弾帯" @@ -38869,9 +38999,9 @@ msgstr "イナゴ(幼体)" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." -msgstr "ウサギ程の大きさのイナゴです。これが増殖したら何が起きるかは、あまり考えたくありませんね。" +msgstr "ウサギ程の大きさのイナゴです。これが増殖したら一体どうなるか、あまり考えたくありませんね。" #: lang/json/MONSTER_from_json.py msgid "bear cub" @@ -39809,7 +39939,7 @@ msgstr "巨大ガラガラヘビ" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" "変異したヨコシマガラガラヘビです。通常の三倍ほどの大きさになっています。人間を獲物と認識するには大きさが足りませんが、より攻撃的で危険な生物になっていることは間違いありません。" @@ -45917,7 +46047,7 @@ msgstr "基本的な機械整備作業に適した、スリップジョイント #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" +msgid_plural "pocket watches" msgstr[0] "懐中時計" #. ~ Description for pocket watch @@ -49859,8 +49989,7 @@ msgid "" " While powered, this system will prevent heat damage up to 2000 degrees " "Fahrenheit. Note that this does not affect your internal temperature." msgstr "" -"外科手術によって、強力な超耐熱合金で作られたヒートシンクを肉体に移植します。電源が入っている間、このシステムは摂氏 " -"約1000度までの熱によるダメージを防ぎます。体温の上昇に対しては機能しないため注意が必要です。" +"外科手術によって、強力な超耐熱合金で作られたヒートシンクを肉体に移植します。電源が入っている間、このシステムは摂氏約1000度までの熱によるダメージを防ぎます。体温の上昇に対しては機能しないため注意が必要です。" #: lang/json/bionic_from_json.py msgid "Hydraulic Muscles" @@ -52863,13 +52992,13 @@ msgstr "%sが凍傷になりました!細胞組織が凍り始めています #: lang/json/effects_from_json.py msgid "Defrosting" -msgstr "除霜" +msgstr "凍傷(解凍)" #. ~ Description of effect 'Defrosting'. #: lang/json/effects_from_json.py #, python-format msgid "Your %s is starting to feel the damage cold has wrought." -msgstr "%sが寒さによって、ダメージを受け始めています。" +msgstr "凍傷によって麻痺していた%sの痛みを感じるようになりました。" #: lang/json/effects_from_json.py msgid "Blisters" @@ -62197,7 +62326,7 @@ msgstr "木を切り倒す" #: lang/json/item_action_from_json.py msgid "Chop a Tree Trunk into logs" -msgstr "丸太を切り出す" +msgstr "木の幹を切り分ける" #: lang/json/item_action_from_json.py msgid "Break stick" @@ -63375,6 +63504,10 @@ msgstr "部品修理" msgid "Refill tank/battery" msgstr "補充/充電" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "燃料箱の内容物を取り出す" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "部品取外" @@ -70994,7 +71127,7 @@ msgid "" "Your eyes have mutated, now having a slitted pupil and glittering in light, " "much like those of cats. This is visually striking, but it isn't helping " "you see at night." -msgstr "瞳孔は縦溝状に変異し、光を受けると猫のように輝kぃます。人間離れした外見ですが、夜に周囲を見回す助けにはなりません。" +msgstr "瞳孔は縦溝状に変異し、光を受けると猫のように輝きます。人間離れした外見ですが、夜に周囲を見回す助けにはなりません。" #: lang/json/mutation_from_json.py msgid "Feline Vision" @@ -75670,7 +75803,7 @@ msgstr "モーテル" #: lang/json/overmap_terrain_from_json.py msgid "ruined cabin" -msgstr "山小屋(荒廃)" +msgstr "荒れ果てた小屋" #: lang/json/overmap_terrain_from_json.py msgid "barn" @@ -76091,7 +76224,7 @@ msgstr "山小屋(未完成)" #: lang/json/overmap_terrain_from_json.py msgid "field campsite" -msgstr "野営地" +msgstr "キャンプ地" #: lang/json/overmap_terrain_from_json.py msgid "roadstop" @@ -76105,6 +76238,10 @@ msgstr "公衆トイレ" msgid "roadside foodcart" msgstr "軽食店" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "ガソリンスタンド(車両修理工場)" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "墓地" @@ -76432,8 +76569,8 @@ msgid "stadium parking" msgstr "スタジアム(駐車場)" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" -msgstr "スタジアム(売店)" +msgid "stadium" +msgstr "スタジアム" #: lang/json/overmap_terrain_from_json.py msgid "stadium entrance" @@ -76500,7 +76637,7 @@ msgid "trailer park" msgstr "トレーラーパーク" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" +msgid "mass grave" msgstr "集団墓地" #: lang/json/overmap_terrain_from_json.py @@ -76580,11 +76717,11 @@ msgid "Bankrupt Pizzeria" msgstr "倒産したピザ屋" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "貸しボート屋" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "川岸の家屋" #: lang/json/overmap_terrain_from_json.py @@ -76793,12 +76930,20 @@ msgid "animal clinic" msgstr "動物病院" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" -msgstr "スタジアム" +msgid "war memorial" +msgstr "戦争記念碑" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" -msgstr "退役軍人クラブ" +msgid "ruined cabin - barn" +msgstr "荒れ果てた小屋(焼け跡)" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "荒れ果てた小屋(駐車区画)" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" +msgstr "荒れ果てた小屋(庭)" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -97833,6 +97978,10 @@ msgstr "警察犬輸送車" msgid "SWAT Truck" msgstr "SWATトラック" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "旧式トラクター" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "自動トラクター" @@ -99086,16 +99235,22 @@ msgid "external cargo rack" msgstr "外付積荷ラック" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." -msgstr "電気モーターの電源を入れると、車両に車輪が正常に取り付けられていれば、タンクに入った燃料を燃焼させて車両を運転できます。" +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "燃焼機関です。車両のタンクに入った燃料を燃焼させます。" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "燃焼機関です。車両のタンクに入った軽油を燃焼させます。" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." +msgstr "燃焼機関です。車両のタンクに入ったガソリンを燃焼させます。" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." -msgstr "燃焼機関です。車両に車輪が正常に取り付けられていれば、電気モーターの電源を入れるとタンクに入ったガソリンが燃焼し、車両が動きます。" +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." +msgstr "外燃機関の一種である、密閉サイクルで動作する蒸気機関です。車両の燃料箱に入った石炭を燃料にして蒸気を発生させます。" #: lang/json/vehicle_part_from_json.py msgid "boom crane" @@ -99421,6 +99576,14 @@ msgstr "外付タンク(200L)" msgid "barrel (100L)" msgstr "樽(100L)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "固体燃料を貯蔵するための容器です。車両のエンジンに対応した燃料が充填されていれば、エンジンが始動するとタンク内の燃料を自動で消費します。" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "車載/火炎放射器" @@ -100767,6 +100930,12 @@ msgstr "生きているブロブ車両の心臓と脳の役割を果たしてい msgid "A living blob turned into a heavy vehicle weapon." msgstr "生きているブロブが、車両用の大型銃器に変化したものです。" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "外燃機関の一種である、密閉サイクルで動作する蒸気タービンです。車両の燃料箱に入った石炭を燃料にして蒸気を発生させます。" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -106658,7 +106827,8 @@ msgstr[0] "%s(%d)が必要です。" #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "何でもない。" @@ -106987,6 +107157,42 @@ msgstr "%sに%dのダメージを与えました。" msgid "%1$s shoots %2$s." msgstr "%1$sは%2$sに向けてなにか発射しました。" +#: src/creature.cpp +msgid "Severe pain" +msgstr "耐え難い苦痛" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "酷い苦痛" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "辛い苦痛" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "かなりの苦痛" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "中程度の苦痛" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "軽度の苦痛" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "多少の苦痛" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "わずかな苦痛" + +#: src/creature.cpp +msgid "No pain" +msgstr "無痛" + #: src/creature.cpp msgid "Hostile" msgstr "敵対" @@ -110714,15 +110920,15 @@ msgstr "世界が保存されました。残っているキャラクター:%s" msgid "Wait till you wake up..." msgstr "睡眠中..." -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr " (Y)はい、(N)いいえ、(I)無視して続行。" - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s自動移動を取り消しました。" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr " (Y)はい、(N)いいえ、(I)同様の音を無視して続行。" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -112160,7 +112366,7 @@ msgstr "%sはどこにも行けない!" msgid "Use which item?" msgstr "使用するアイテムを選択" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "なんでもない" @@ -112858,7 +113064,7 @@ msgstr "装填するアイテムを持っていません。" #: src/game.cpp msgid "Unload item" -msgstr "抜き取るアイテムを選択" +msgstr "アイテムを抜き取る" #: src/game.cpp msgid "You have nothing to unload." @@ -112880,7 +113086,7 @@ msgstr "%sは既に空です!" #: src/game.cpp msgid "Unload what?" -msgstr "何から抜き取りますか?" +msgstr "装填物を抜き取るアイテムを選択" #: src/game.cpp #, c-format @@ -139410,6 +139616,14 @@ msgstr "動いている車両からは抜き取れません。" msgid "Select part to siphon: " msgstr "内容物を抜き取る部品を選択: " +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "車両には抜き取るだけの固体燃料が入っていません。" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "動いている車両からは取り出せません。" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "交換するホイールがありません。" @@ -139589,11 +139803,15 @@ msgstr "補充" #: src/veh_interact.cpp msgid "remve" -msgstr "取外" +msgstr "部品取外" #: src/veh_interact.cpp msgid "iphon" -msgstr "抜取" +msgstr "燃料抜取" + +#: src/veh_interact.cpp +msgid "unloa" +msgstr "燃料取出" #: src/veh_interact.cpp msgid "hange tire" @@ -139745,6 +139963,10 @@ msgstr "どれを使いますか?" msgid "Select tank to siphon:" msgstr "抜き取るタンクを選択: " +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "何を取り外しますか?" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/ko.po b/lang/po/ko.po index 10decb6ac5db3..e01bec63fc805 100644 --- a/lang/po/ko.po +++ b/lang/po/ko.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: T itan , 2018\n" "Language-Team: Korean (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ko/)\n" @@ -27399,6 +27399,10 @@ msgstr "베이스 경유 엔진" msgid "base gasoline engine" msgstr "베이스 휘발유 엔진" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "단기통 엔진" @@ -27502,6 +27506,114 @@ msgid "" "trucks." msgstr "육중하고 극도로 강력한 12기통 엔진. 일반적으로 대형 트럭에 사용된다." +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -34740,6 +34852,15 @@ msgstr "아티팩트" msgid "ARMOR" msgstr "보호구" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "탄약 벨트" @@ -39410,7 +39531,7 @@ msgstr "" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" @@ -40356,10 +40477,8 @@ msgstr "거대 방울뱀" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" -"일반적인 방울뱀보다 3배 정도 큰 변이체. 인간을 잠재적인 먹이로 여길만큼 커지지는 않았지만, 일반적인 방울뱀보다 더 공격적이고 " -"위험해졌습니다." #: lang/json/MONSTER_from_json.py msgid "sewer snake" @@ -46554,8 +46673,8 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" -msgstr[0] "포켓 시계" +msgid_plural "pocket watches" +msgstr[0] "" #. ~ Description for pocket watch #: lang/json/TOOL_from_json.py @@ -63972,6 +64091,10 @@ msgstr "부품 수리" msgid "Refill tank/battery" msgstr "연료 충전" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "부품 제거" @@ -76779,6 +76902,10 @@ msgstr "공중 세면장" msgid "roadside foodcart" msgstr "노점상" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "공동묘지" @@ -77106,7 +77233,7 @@ msgid "stadium parking" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" +msgid "stadium" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -77174,7 +77301,7 @@ msgid "trailer park" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" +msgid "mass grave" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -77254,11 +77381,11 @@ msgid "Bankrupt Pizzeria" msgstr "파산한 피자가게" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -77467,11 +77594,19 @@ msgid "animal clinic" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" +msgid "war memorial" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" +msgid "ruined cabin - barn" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" msgstr "" #: lang/json/professions_from_json.py @@ -98839,6 +98974,10 @@ msgstr "" msgid "SWAT Truck" msgstr "SWAT 수송차량" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "자동식 트랙터" @@ -100071,15 +100210,21 @@ msgid "external cargo rack" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." msgstr "" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" #: lang/json/vehicle_part_from_json.py @@ -100392,6 +100537,14 @@ msgstr "외부 탱크 (200L)" msgid "barrel (100L)" msgstr "나무통 (100L)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "장착된 화염방사기" @@ -101731,6 +101884,12 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -107524,7 +107683,8 @@ msgstr[0] "%d 이상 충전된 %s이(가) 필요하다." #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "아무것도 하지 않음." @@ -107854,6 +108014,42 @@ msgstr "%s을(를) 맞춰 %d 피해를 줬다." msgid "%1$s shoots %2$s." msgstr "%1$s이(가) %2$s을(를) 향해 쐈다." +#: src/creature.cpp +msgid "Severe pain" +msgstr "" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "" + +#: src/creature.cpp +msgid "No pain" +msgstr "" + #: src/creature.cpp msgid "Hostile" msgstr "적대적" @@ -111570,15 +111766,15 @@ msgstr "세계 유지됨. 캐릭터 남음:%s" msgid "Wait till you wake up..." msgstr "깨어날 때까지 기다립니다..." -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr " (Y)예, (N)아니오, (I)작업완료까지 무시" - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s. 자동이동 취소됨" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -112996,7 +113192,7 @@ msgstr "%s은(는) 움직일 자리가 없다!" msgid "Use which item?" msgstr "어떤 물품을 사용합니까?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "아무것도 아냐" @@ -117944,7 +118140,7 @@ msgstr "제작법" #: src/init.cpp msgid "Recipe groups" -msgstr "" +msgstr "제작법 그룹" #: src/init.cpp msgid "Martial arts" @@ -140087,6 +140283,14 @@ msgstr "이동중인 차량에선 흡인할 수 없다." msgid "Select part to siphon: " msgstr "" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "여기에는 교체할 바퀴가 없다." @@ -140272,6 +140476,10 @@ msgstr "제거" msgid "iphon" msgstr "연료 흡인" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "" + #: src/veh_interact.cpp msgid "hange tire" msgstr "타이어 교체" @@ -140422,6 +140630,10 @@ msgstr "어떤 도구를 사용합니까?" msgid "Select tank to siphon:" msgstr "" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/pl.po b/lang/po/pl.po index 0ea4cc89fb80b..00e7bafde41be 100644 --- a/lang/po/pl.po +++ b/lang/po/pl.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Przemek Orechwa , 2018\n" "Language-Team: Polish (https://www.transifex.com/cataclysm-dda-translators/teams/2217/pl/)\n" @@ -1096,8 +1096,8 @@ msgid "" " skill levels 2 - Int: Intelligence dependent - IntCap: Intelligence " "dependent, capped - Off: None at all." msgstr "" -"Ustawienie poziomu zapominania umiejętności. Standard: podstawa Kataklizmu, " -"Ograniczone: ograniczone na 2 poziomie umiejętności. Inteligencja: zależne " +"Ustawienie poziomu zapominania umiejętności. Standard: Oryginalny Cataclysm," +" Ograniczone: ograniczone na 2 poziomie umiejętności. Inteligencja: zależne " "od inteligencji. Ogranicz Inteligencją: zależne od inteligencji i " "ograniczone. Wyłączone: brak." @@ -1468,7 +1468,7 @@ msgstr "" #: lang/extra/android/options.cpp msgid "Morale penalty for filthy clothing." -msgstr "Kara morale za brudne ubrania." +msgstr "Kara do morale za brudne ubrania." #: lang/extra/android/options.cpp msgid "If true, wearing filthy clothing will cause morale penalties." @@ -1688,7 +1688,7 @@ msgid "" "is an exponent that controls the blend between the two repeat rates defined " "above. 1.0 = linear." msgstr "" -"Gdy wirtualny joystick wychyla się z centrum do krawędzi, ta wartość jest " +"Gdy wirtualny dżojstik wychyla się z centrum do krawędzi, ta wartość jest " "mnożnikiem średniej z dwóch powyższych wartości. 1.0 = zależność liniowa." #: lang/extra/android/options.cpp @@ -3448,8 +3448,8 @@ msgid "" msgstr "" "Skoncentrowany kwas octowy stosowany jest w przemyśle chemicznym oraz jako " "środek grzybobójczy. Pomimo okropnego zapachu, stosowany był w produkcji " -"perfum, ale czy ich wytwarzanie nie byłoby zbytkiem w postapokaliptycznej " -"Nowej Anglii?" +"kilku typów perfum, ale czy wytwarzanie perfum nie byłoby zbyt... wymyślne w" +" postapokaliptycznej Nowej Anglii?" #: lang/json/AMMO_from_json.py msgid "thermite" @@ -7596,10 +7596,10 @@ msgstr "Proste narzędzie do unieruchomienia złamanych kości." #: lang/json/ARMOR_from_json.py msgid "arm splint XL" msgid_plural "arm splint XLs" -msgstr[0] "szyna na ramię XL" -msgstr[1] "szyny na ramię XL" -msgstr[2] "szyn na ramię XL" -msgstr[3] "szyny na ramię XL" +msgstr[0] "szyna na rękę XL" +msgstr[1] "szyny na rękę XL" +msgstr[2] "szyn na rękę XL" +msgstr[3] "szyny na rękę XL" #. ~ Description for arm splint XL #: lang/json/ARMOR_from_json.py @@ -10634,8 +10634,8 @@ msgid "" "A fancy golden bracelet. You can wear it if you like, but it won't provide " "any effects." msgstr "" -"Modna bransoletka ze złota. Kto lubi niech nosi, ale korzyści z tego nie ma " -"żadnej." +"Szykowna bransoletka ze złota. Kto lubi niech nosi, ale korzyści z tego nie " +"ma żadnej." #: lang/json/ARMOR_from_json.py msgid "gold dental grill" @@ -13732,9 +13732,9 @@ msgstr "" msgid "fancy watch" msgid_plural "fancy watches" msgstr[0] "wymyślny zegarek" -msgstr[1] "wymyślny zegarek" -msgstr[2] "wymyślny zegarek" -msgstr[3] "wymyślny zegarek" +msgstr[1] "wymyślne zegarki" +msgstr[2] "wymyślnych zegarków" +msgstr[3] "wymyślnego zegarka" #. ~ Description for fancy watch #: lang/json/ARMOR_from_json.py @@ -19853,10 +19853,10 @@ msgstr "" #: lang/json/BOOK_from_json.py msgid "Top Gear magazine" msgid_plural "Top Gear magazines" -msgstr[0] "Magazyn Top Gear" -msgstr[1] "Magazyn Top Gear" -msgstr[2] "Magazyn Top Gear" -msgstr[3] "Magazyn Top Gear" +msgstr[0] "magazyn Top Gear" +msgstr[1] "magazyny Top Gear" +msgstr[2] "magazynów Top Gear" +msgstr[3] "magazynu Top Gear" #. ~ Description for Top Gear magazine #: lang/json/BOOK_from_json.py @@ -22706,9 +22706,9 @@ msgstr "" msgid "Principles of Postmortem Mind Control" msgid_plural "Principles of Postmortem Mind Controls" msgstr[0] "Zasady Kontroli Umysłów Post-mortem" -msgstr[1] "Zasady Kontroli Umysłów Post-mortem " -msgstr[2] "Zasady Kontroli Umysłów Post-mortem " -msgstr[3] "Zasady Kontroli Umysłów Post-mortem " +msgstr[1] "Zasady Kontroli Umysłów Post-mortem" +msgstr[2] "Zasad Kontroli Umysłów Post-mortem" +msgstr[3] "Zasady Kontroli Umysłów Post-mortem" #. ~ Description for Principles of Postmortem Mind Control #: lang/json/BOOK_from_json.py @@ -26446,7 +26446,7 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "mutated arm" -msgstr "zmutowane ramię" +msgstr "zmutowana ręka" #. ~ Description for mutated arm #: lang/json/COMESTIBLE_from_json.py @@ -26454,8 +26454,8 @@ msgid "" "A misshapen human arm, eating this would be incredibly disgusting and " "probably cause you to mutate." msgstr "" -"Zniekształcone ludzkie ramię, którego konsumpcja byłaby wyjątkowo obrzydliwa" -" i pewnie spowodowałaby mutację." +"Zniekształcona ludzka ręka, której konsumpcja byłaby wyjątkowo obrzydliwa i " +"pewnie spowodowałaby mutację." #: lang/json/COMESTIBLE_from_json.py msgid "mutated leg" @@ -26511,10 +26511,10 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "mycus fruit" msgid_plural "mycus fruits" -msgstr[0] "owoce mykus" -msgstr[1] "owoce mykus" -msgstr[2] "owoce mykus" -msgstr[3] "owoce mykus" +msgstr[0] "owoc grzybni" +msgstr[1] "owoce grzybni" +msgstr[2] "owoców grzybni" +msgstr[3] "owocu grzybni" #. ~ Description for mycus fruit #: lang/json/COMESTIBLE_from_json.py @@ -34776,6 +34776,10 @@ msgstr "podstawowy silnik diesla" msgid "base gasoline engine" msgstr "podstawowy silnik benzynowy" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "podstawowy silnik parowy" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "1-cylindrowy silnik" @@ -34886,6 +34890,141 @@ msgstr "" "Ogromny i bardzo mocny 12-cylindrowy silnik, w który zwykle zaopatrywane są " "ciężkie ciężarówki." +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "improwizowany silnik parowy" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" +"Mały, prymitywny silnik parowy. Zintegrowany kocioł spala węgiel by " +"podgrzewać wodę aż zacznie parować, napędzając tłok. Kondensor odzyskuje " +"wodę, tworząc zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "mały silnik parowy" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Mały silnik parowy. Zintegrowany kocioł spala węgiel by podgrzewać wodę aż " +"zacznie parować, napędzając tłok. Kondensor odzyskuje wodę, tworząc " +"zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "średni silnik parowy" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" +"Średnich rozmiarów silnik parowy. Zintegrowany kocioł spala węgiel by " +"podgrzewać wodę aż zacznie parować, napędzając tłok. Kondensor odzyskuje " +"wodę, tworząc zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "duży silnik parowy" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Duży silnik parowy. Zintegrowany kocioł spala węgiel by podgrzewać wodę aż " +"zacznie parować, napędzając tłok. Kondensor odzyskuje wodę, tworząc " +"zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "ogromny silnik parowy" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Ogromny silnik parowy. Zintegrowany kocioł spala węgiel by podgrzewać wodę " +"aż zacznie parować, napędzając tłok. Kondensor odzyskuje wodę, tworząc " +"zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "mała turbina parowa" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"Mała turbina parowa. Zintegrowany kocioł spala węgiel by podgrzewać wodę aż " +"zacznie parować, napędzając wibrującą turbinę. Kondensor odzyskuje wodę, " +"tworząc zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "średnia turbina parowa" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" +"Średnich rozmiarów turbina parowa. Zintegrowany kocioł spala węgiel by " +"podgrzewać wodę aż zacznie parować, napędzając wibrującą turbinę. Kondensor " +"odzyskuje wodę, tworząc zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "duża turbina parowa" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"Duża turbina parowa. Zintegrowany kocioł spala węgiel by podgrzewać wodę aż " +"zacznie parować, napędzając wibrującą turbinę. Kondensor odzyskuje wodę, " +"tworząc zamknięty system obiegu." + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "ogromna turbina parowa" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" +"Ogromna turbina parowa. Zintegrowany kocioł spala węgiel by podgrzewać wodę " +"aż zacznie parować, napędzając wibrującą turbinę. Kondensor odzyskuje wodę, " +"tworząc zamknięty system obiegu." + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -36328,7 +36467,7 @@ msgid "" "electronics recipes." msgstr "" "Bardzo mały elektryczny silnik jak te używane w zdalnie sterowanych " -"samochodzikach. Użyteczny w wielu projektach elektronicznych." +"samochodach. Użyteczny w wielu projektach elektronicznych." #: lang/json/GENERIC_from_json.py msgid "circuit board" @@ -40555,10 +40694,10 @@ msgstr "Miękkie siedzenie samochodowe pokryte skórą." #: lang/json/GENERIC_from_json.py msgid "fancy table" msgid_plural "fancy tables" -msgstr[0] "luksusowy stolik" -msgstr[1] "luksusowy stolik" -msgstr[2] "luksusowy stolik" -msgstr[3] "luksusowy stolik" +msgstr[0] "wymyślny stolik" +msgstr[1] "wymyślne stoliki" +msgstr[2] "wymyślnych stolików" +msgstr[3] "wymyślnego stoliku" #. ~ Description for fancy table #: lang/json/GENERIC_from_json.py @@ -40566,7 +40705,7 @@ msgid "" "A very fancy table from a very fancy RV. If times were better it might be " "useful for something more than firewood." msgstr "" -"Luksusowy wymyślny stolik z luksusowego kampera. W lepszych czasach byłby " +"Bardzo wymyślny stolik z luksusowego kampera. W lepszych czasach byłby " "bardziej użyteczny niż jako drewno na rozpałkę." #: lang/json/GENERIC_from_json.py @@ -40615,16 +40754,16 @@ msgstr "" #: lang/json/GENERIC_from_json.py msgid "vehicle controls" msgid_plural "sets of vehicle controls" -msgstr[0] "zestaw sterowania pojazdu" -msgstr[1] "zestaw sterowania pojazdu" -msgstr[2] "zestaw sterowania pojazdu" -msgstr[3] "zestaw sterowania pojazdu" +msgstr[0] "układ sterowania pojazdu" +msgstr[1] "zestawy układu sterowania pojazdu" +msgstr[2] "zestawów układu sterowania pojazdu" +msgstr[3] "układu sterowania pojazdu" #. ~ Description for vehicle controls #: lang/json/GENERIC_from_json.py msgid "A set of various vehicle controls. Useful for crafting." msgstr "" -"Zestaw różnych elementów do sterowania pojazdu. Użyteczny w produkcji " +"Zestaw różnych elementów do sterowania pojazdem. Użyteczny w produkcji " "rzeczy." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py @@ -41233,10 +41372,11 @@ msgid "" "compartments." msgstr "" "Stacja ładowania oparta na UPS, zunifikowanej stacji zasilania, opracowana " -"do działania na zasilaniu pojazdu. Raz zainstalowana w przestrzeni " -"ładunkowej pojazdu i uruchomiona z poziomu sterowania, będzie wolno ładować " -"wszystkie narzędzia z ładowalnymi bateriami umieszczonymi w tym miejscu. " -"System można instalować tylko w istniejących przestrzeniach ładunkowych." +"do działania na zasilaniu pojazdu. Po zainstalowaniu w przestrzeni " +"ładunkowej pojazdu i uruchomieniu z poziomu sterowania pojazdem, będzie " +"wolno ładować wszystkie narzędzia z ładowalnymi bateriami umieszczonymi w " +"tym miejscu. System można instalować tylko w istniejących przestrzeniach " +"ładunkowych." #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py #: lang/json/vehicle_part_from_json.py @@ -41317,10 +41457,10 @@ msgstr "Zestaw kościanego opancerzenia do pojazdów." #: lang/json/vehicle_part_from_json.py msgid "drive by wire controls" msgid_plural "sets of drive by wire controls" -msgstr[0] "zestaw zdalnego sterowania pojazdu" -msgstr[1] "zestaw zdalnego sterowania pojazdu" -msgstr[2] "zestaw zdalnego sterowania pojazdu" -msgstr[3] "zestaw zdalnego sterowania pojazdu" +msgstr[0] "elektroniczny układ sterowania" +msgstr[1] "zestawy elektronicznego układu sterowania" +msgstr[2] "zestawów elektronicznego układu sterowania" +msgstr[3] "elektronicznego układu sterowania" #. ~ Description for drive by wire controls #: lang/json/GENERIC_from_json.py @@ -42617,8 +42757,8 @@ msgid "" "A RC car, with radio-control and batteries included! Disassemble to unpack " "and enjoy." msgstr "" -"Zestaw sterowanego radiowo samochodu i kontrolera radiowego z bateriami. " -"Rozłóż i ciesz się." +"Zdalnie sterowany samochód, z kontrolerem radiowym i bateriami w zestawie! " +"Rozłóż by odpakować i cieszyć się." #: lang/json/GENERIC_from_json.py msgid "vehicle alternator" @@ -42914,9 +43054,9 @@ msgstr[3] "mobilny osprzęt produkcyjny" msgid "onboard chemistry lab" msgid_plural "onboard chemistry labs" msgstr[0] "pokładowe laboratorium chemiczne" -msgstr[1] "pokładowe laboratorium chemiczne" -msgstr[2] "pokładowe laboratorium chemiczne" -msgstr[3] "pokładowe laboratorium chemiczne" +msgstr[1] "pokładowe laboratoria chemiczne" +msgstr[2] "pokładowych laboratoriów chemicznych" +msgstr[3] "pokładowego laboratorium chemicznego" #. ~ Description for onboard chemistry lab #: lang/json/GENERIC_from_json.py @@ -44605,6 +44745,15 @@ msgstr "ARTEFAKTY" msgid "ARMOR" msgstr "ZBROJE" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "Bunkier na paliwo" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "Kosz na paliwo stałe." + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "pas amunicyjny" @@ -46859,7 +47008,7 @@ msgstr "Dark Days Ahead" #. ~ Description for Dark Days Ahead #: lang/json/MOD_INFO_from_json.py msgid "Core content for Cataclysm-DDA" -msgstr "Podstawowa zawartość dla Kataklizmu-DDA" +msgstr "Podstawowa zawartość dla Cataclysm-DDA" #: lang/json/MOD_INFO_from_json.py msgid "Makeshift Items Mod" @@ -49926,7 +50075,7 @@ msgstr "nimfa szarańczy" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" "Szarańcza wielkości królika. Wzdrygasz się na myśl co rój takich owadów " @@ -51056,7 +51205,7 @@ msgstr "gigantyczny grzechotnik" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" "Zmutowany grzechotnik, około trzykrotnie większy od oryginału. Choć nie na " "tyle duży by rozważał ludzi jako potencjalne ofiary, jest za to bardziej " @@ -53199,10 +53348,10 @@ msgstr "Prosta spinka do utrzymywania włosów w miejscu." #: lang/json/TOOL_ARMOR_from_json.py msgid "fancy hairpin" msgid_plural "fancy hairpins" -msgstr[0] "stylowa spinka do włosów" -msgstr[1] "stylowa spinka do włosów" -msgstr[2] "stylowa spinka do włosów" -msgstr[3] "stylowa spinka do włosów" +msgstr[0] "wymyślna spinka do włosów" +msgstr[1] "wymyślne spinki do włosów" +msgstr[2] "wymyślnych spinek do włosów" +msgstr[3] "wymyślnej spinki do włosów" #. ~ Description for fancy hairpin #: lang/json/TOOL_ARMOR_from_json.py @@ -53658,7 +53807,7 @@ msgid "" msgstr "" "Strój zakrywający całe ciało z cienką termiczną podszewką wyposażoną w " "elektryczne elementy grzewcze. Obecnie jest włączony i czerpie energię z " -"baterii. Użyj by wyłączyć." +"baterii. Użyj by wyłączyć." #: lang/json/TOOL_ARMOR_from_json.py msgid "ski mask" @@ -57495,7 +57644,7 @@ msgid "" " fuel from a vehicle." msgstr "" "Elastyczny gumowy wąż. Może się przydać do wytwarzania przedmiotów, lub do " -"wydobycia paliwa z baku pojazdu." +"spuszczenia paliwa z baku pojazdu." #: lang/json/TOOL_from_json.py msgid "hotplate" @@ -59006,8 +59155,9 @@ msgid "" "A radio-detonated pipe bomb, armed. Place it or attach to a RC car, then " "get away and use the radio-control to detonate." msgstr "" -"Detonowana radiowo bomba rurowa uzbrojona. Umieść go, lub zainstaluj na " -"zdalnie sterowanym aucie i użyj zdalnego detonatora." +"Detonowana radiowo bomba rurowa, uzbrojona. Umieść ją lub zainstaluj na " +"zdalnie sterowanym samochodzie, później odsuń się i użyj kontrolera " +"radiowego by zdetonować." #: lang/json/TOOL_from_json.py msgid "plastic chunk" @@ -59045,11 +59195,11 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" +msgid_plural "pocket watches" msgstr[0] "zegarek kieszonkowy" -msgstr[1] "zegarek kieszonkowy" -msgstr[2] "zegarek kieszonkowy" -msgstr[3] "zegarek kieszonkowy" +msgstr[1] "zegarki kieszonkowe" +msgstr[2] "zegarków kieszonkowych" +msgstr[3] "zegarka kieszonkowego" #. ~ Description for pocket watch #: lang/json/TOOL_from_json.py @@ -61775,10 +61925,10 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "RC control" msgid_plural "RC controls" -msgstr[0] "sterowanie radiowe" -msgstr[1] "sterowanie radiowe" -msgstr[2] "sterowanie radiowe" -msgstr[3] "sterowanie radiowe" +msgstr[0] "kontroler zdalnego sterowania" +msgstr[1] "kontrolery zdalnego sterowania" +msgstr[2] "kontrolerów zdalnego sterowania" +msgstr[3] "kontrolera zdalnego sterowania" #. ~ Description for RC control #: lang/json/TOOL_from_json.py @@ -61788,16 +61938,16 @@ msgid "" "model?" msgstr "" "Zdalne sterowanie do samochodów kontrolowanych radiowo, z joystickiem i " -"kolorowymi guzikami które chyba nic nie robią. Może przeznaczone do " +"kolorowymi guzikami które chyba nic nie robią. Może były przeznaczone do " "luksusowego modelu?" #: lang/json/TOOL_from_json.py msgid "RC car" msgid_plural "RC cars" -msgstr[0] "samochód zdalnie sterowany" -msgstr[1] "samochód zdalnie sterowany" -msgstr[2] "samochód zdalnie sterowany" -msgstr[3] "samochód zdalnie sterowany" +msgstr[0] "zdalnie sterowany samochód" +msgstr[1] "zdalnie sterowane samochody" +msgstr[2] "zdalnie sterowanych samochodów" +msgstr[3] "zdalnie sterowanego samochodu" #. ~ Description for RC car #: lang/json/TOOL_from_json.py @@ -61807,10 +61957,10 @@ msgstr "Samochód zdalnie sterowany. Dla młodych i starych, po równo." #: lang/json/TOOL_from_json.py msgid "RC car (on)" msgid_plural "RC cars (on)" -msgstr[0] "samochód zdalnie sterowany (wł.)" -msgstr[1] "samochód zdalnie sterowany (wł.)" -msgstr[2] "samochód zdalnie sterowany (wł.)" -msgstr[3] "samochód zdalnie sterowany (wł.)" +msgstr[0] "zdalnie sterowany samochód (wł.)" +msgstr[1] "zdalnie sterowane samochody (wł.)" +msgstr[2] "zdalnie sterowanych samochodów (wł.)" +msgstr[3] "zdalnie sterowanego samochodu (wł.)" #. ~ Description for RC car (on) #: lang/json/TOOL_from_json.py @@ -64736,35 +64886,35 @@ msgstr "Walka wręcz i dystansowa są utrudnione." #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "L. Arm" msgid_plural "Arms" -msgstr[0] "L.Ramię" -msgstr[1] "Ramiona" -msgstr[2] "Ramiona" -msgstr[3] "Ramiona" +msgstr[0] "L. Ręka" +msgstr[1] "Ręce" +msgstr[2] "Rąk" +msgstr[3] "Ręki" #: lang/json/bodypart_from_json.py msgid "L ARM" -msgstr "L RAMIĘ" +msgstr "L RĘKA" #: lang/json/bodypart_from_json.py msgid "right arm" -msgstr "prawe ramię" +msgstr "prawa ręka" #: lang/json/bodypart_from_json.py msgctxt "bodypart_accusative" msgid "right arm" -msgstr "prawe ramię" +msgstr "prawa ręka" #: lang/json/bodypart_from_json.py src/armor_layers.cpp msgid "R. Arm" msgid_plural "Arms" -msgstr[0] "P.Ramię" -msgstr[1] "Ramiona" -msgstr[2] "Ramiona" -msgstr[3] "Ramiona" +msgstr[0] "P. Ręka" +msgstr[1] "Ręce" +msgstr[2] "Rąk" +msgstr[3] "Ręki" #: lang/json/bodypart_from_json.py msgid "R ARM" -msgstr "P RAMIĘ" +msgstr "P RĘKA" #: lang/json/bodypart_from_json.py msgid "left hand" @@ -66189,7 +66339,7 @@ msgid "" "Non-Mycus sometimes reject the Marloss. Our colonial efforts flourish with " "broad-minded guidance." msgstr "" -"Nie-Mykusy czasami odrzucają Marloss. Nasze wysiłki kolonizacyjne kwitną " +"Nie-Grzybnie czasami odrzucają Marloss. Nasze wysiłki kolonizacyjne kwitną " "nakierowane na szerokie horyzonty." #: lang/json/dream_from_json.py @@ -66197,7 +66347,7 @@ msgid "" "The seething masses attempt to wall non-Mycus away from the Marloss. We " "will adapt and defeat them." msgstr "" -"Kipiące masy próbują odgrodzić nie-Mykusy z dala od Marloss. Zaadaptujemy " +"Kipiące masy próbują odgrodzić nie-Grzybnie z dala od Marloss. Zaadaptujemy " "się i ich pokonamy." #: lang/json/effects_from_json.py @@ -67495,7 +67645,7 @@ msgstr "Wpływ adrenaliny ustaje. Czujesz się PASKUDNIE!" #: lang/json/effects_from_json.py msgid "Mycus Respite" -msgstr "Wytchnienie Mycus" +msgstr "Grzybnicze Wytchnienie" #. ~ Description of effect 'Mycus Respite'. #: lang/json/effects_from_json.py @@ -67507,7 +67657,7 @@ msgstr "" #: lang/json/effects_from_json.py msgid "Mycus Wrath" -msgstr "Gniew Mycus" +msgstr "Grzybniczy Gniew" #. ~ Description of effect 'Mycus Wrath'. #: lang/json/effects_from_json.py @@ -77391,8 +77541,8 @@ msgid "" "A shoulder strap allows the rifle to be worn over your shoulders like a " "piece of clothing. However, it offers no protection." msgstr "" -"Pas na ramię pozwalający nosić karabin na ramieniu jak ubranie. Jednakże nie" -" zapewnia żadnej ochrony." +"Pas na ramię pozwalający nosić karabin na ramieniu jak element ubioru. " +"Jednakże nie zapewnia żadnej ochrony." #: lang/json/gunmod_from_json.py msgid "shortened barrel" @@ -78840,6 +78990,8 @@ msgid "" "You messily hack apart the colossal mass of fused, rancid flesh, taking note" " of anything that stands out." msgstr "" +"Niedbale rąbiesz olbrzymią masę złączonego zepsutego mięsa, zwracając uwagę " +"na wszystko, co się wyróżnia." #: lang/json/item_action_from_json.py msgid "Repair cotton/leather/wool/Nomex/fur" @@ -79148,7 +79300,7 @@ msgstr "..." #: lang/json/item_action_from_json.py msgid "Control an RC car" -msgstr "Kontroluj zdalnie auto" +msgstr "Kontroluj zdalnie sterowany samochód" #: lang/json/item_action_from_json.py msgid "Modify an item" @@ -79164,7 +79316,7 @@ msgstr "Ogól się" #: lang/json/item_action_from_json.py msgid "Siphon" -msgstr "Syfonuj" +msgstr "Spuść" #: lang/json/item_action_from_json.py msgid "Write something" @@ -79245,7 +79397,7 @@ msgstr "Otrzymaj zawartość" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This gear has an alarm clock feature." -msgstr "Ten sprzęt ma wbudowanybudzik." +msgstr "Ten sprzęt ma wbudowaną funkcję budzika." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79262,6 +79414,8 @@ msgid "" "This item can be activated or reloaded from adjacent tile without picking it" " up." msgstr "" +"Ten przedmiot może być aktywowany lub przeładowany z sąsiednich pól bez " +"podnoszenia go." #: lang/json/json_flag_from_json.py msgid "" @@ -79295,6 +79449,8 @@ msgid "" "A follower could make use of this CBM if installed" " properly." msgstr "" +"Towarzysz mógłby użyć tego CBM jeśli by go " +"poprawnie zainstalować." #: lang/json/json_flag_from_json.py msgid "" @@ -79308,12 +79464,13 @@ msgstr "" #: lang/json/json_flag_from_json.py msgid "This gear prevents you from seeing anything." msgstr "" -"Ten sprzęt uniemożliwa ciwidzenieczegokolwiek." +"Ten sprzęt uniemożliwia ci widzenie czegokolwiek." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can be used to block attacks when worn." -msgstr "Ta rzecz może być użyta do blokowania ataków gdy będzie założona." +msgstr "" +"Ten przedmiot może być użyty do blokowania ataków gdy będzie założony." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79321,6 +79478,9 @@ msgid "" "This item is a Compact Bionic Module. You'll need to use specialized " "machinery or ask a surgeon to install it into your body." msgstr "" +"Ten przedmiot to Kompaktowy Moduł Bioniczny. Będziesz potrzebować " +"specjalnej maszyny lub pomocy chirurga by " +"zainstalować go w swoim ciele." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79328,6 +79488,8 @@ msgid "" "This piece of clothing has built-in or attached climate " "control, keeping you at a comfortable temperature." msgstr "" +"Ten element ubioru ma wbudowaną lub dołączoną klimatyzację, " +"pozwalającą ci utrzymać komfortową temperaturę." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79335,8 +79497,8 @@ msgid "" "This piece of clothing has a wide collar that can keep your " "mouth warm if it is unencumbered." msgstr "" -"Ten ubiór ma szeroki kołnierz który może utrzymać w cieple " -"twoje usta jeżeli nie jest skępowany." +"Ten element ubioru ma szeroki kołnierz który może utrzymać w " +"cieple twoje usta jeżeli nie jest skrępowany." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79362,6 +79524,9 @@ msgid "" "obstacles by moving into tiles with them. Note that automatic mining option" " should be set to true for this to work." msgstr "" +"Gdy trzymany, ten przedmiot pozwala kopać przez kamienie i inne twarde " +"przeszkody poprzez wejście na pole z nimi. Pamiętaj, że opcja automatycznego" +" kopania musi być włączona żeby to działało." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79375,12 +79540,12 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This tastes better while cold." -msgstr "" +msgstr "Smakuje lepiej na zimno." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This tastes better while hot." -msgstr "" +msgstr "Smakuje lepiej na ciepło." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79406,32 +79571,33 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This piece of clothing is fancy." -msgstr "Ta cześć ubioru jest elegancka." +msgstr "Ten element ubioru jest wymyślny." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item counts as fire for crafting purposes." msgstr "" +"Ten przedmiot liczy się jako ogień na potrzeby recept." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can start fire." -msgstr "" +msgstr "Ten przedmiot może rozpalić ogień." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can serve as a firewood." -msgstr "" +msgstr "Ten przedmiot może służyć jako opał." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This gear corrects farsightedness." -msgstr "" +msgstr "Ten sprzęt koryguje dalekowzroczność." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This gear corrects nearsightedness." -msgstr "" +msgstr "Ten sprzęt koryguje krótkowzroczność." #: lang/json/json_flag_from_json.py msgid "" @@ -79443,7 +79609,7 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This piece of clothing is filthy." -msgstr "Ta cześć ubioru jest brudna." +msgstr "Ten element ubioru jest brudny." #: lang/json/json_flag_from_json.py msgid "Used for eyes protection from flashbang." @@ -79455,7 +79621,7 @@ msgid "" "This clothing prevents going underwater including both " "drowning and diving." msgstr "" -"Ten ubiór uniemożliwa zanurzenie pod wodę w tym zarówno " +"To ubranie uniemożliwia zanurzenie pod wodę w tym zarówno " "utonięcie jak i nurkowanie." #. ~ Please leave anything in unchanged. @@ -79488,8 +79654,8 @@ msgid "" "This piece of clothing has a hood to keep your head warm if " "your head is unencumbered." msgstr "" -"Ten ubiór ma kaptur który utrzymuje ciepłotę głowy jeżeli nic " -"innego jej nie krępuje." +"Ten element ubioru ma kaptur który utrzymuje ciepłotę głowy " +"jeżeli nic innego jej nie krępuje." #: lang/json/json_flag_from_json.py msgid "" @@ -79531,6 +79697,9 @@ msgid "" "This food melts when not in a very cold climate, and " "tastes much better when frozen." msgstr "" +"Ta żywność roztapia się jak nie jest w bardzo zimnym " +"klimacie i smakuje o wiele lepiej gdy jest " +"zamrożona." #: lang/json/json_flag_from_json.py msgid "Outer garment layer." @@ -79555,12 +79724,16 @@ msgid "" "This clothing is large enough to accommodate abnormally large mutated " "anatomy." msgstr "" +"To ubranie jest na tyle duże by pomieścić nienaturalnie dużą zmutowaną" +" anatomię." #: lang/json/json_flag_from_json.py msgid "" "Can be worn comfortably by mutants with Tiny or Unassuming. Too small for " "anyone else." msgstr "" +"Może być noszony wygodnie przez mutantów z Malutki lub Skromny. Zbyt małe " +"dla kogokolwiek innego." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79568,6 +79741,8 @@ msgid "" "This clothing is undersized and can accommodate abnormally small " "mutated anatomy." msgstr "" +"To ubranie jest małego rozmiaru i może pomieścić nienaturalnie małą " +"zmutowaną anatomię." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79592,7 +79767,7 @@ msgid "" "This clothing has pockets to warm your hands when you are " "wielding nothing." msgstr "" -"Ten ubiór ma kieszenie ogrzewające dłonie gdy nic w nich nie " +"To ubranie ma kieszenie ogrzewające dłonie gdy nic w nich nie " "trzymasz." #: lang/json/json_flag_from_json.py @@ -79600,16 +79775,20 @@ msgid "" "If turned ON, it uses its own source of power, instead of relying on power " "of the user." msgstr "" +"Gdy WŁĄCZONE, używa swojego własnego źródła energii zamiast polegać na " +"energii od użytkownika." #: lang/json/json_flag_from_json.py #, no-python-format msgid "25% chance to protect against fear_paralyze monster attack." -msgstr "" +msgstr "25% szansy na ochronę przeciwko atakowi fear_paralyze potwora." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This gear keeps out the mind control rays." msgstr "" +"Ten sprzęt chroni przed promieniami kontroli " +"umysłu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79617,7 +79796,7 @@ msgid "" "This clothing completely protects you from " "radiation." msgstr "" -"Ten sprzęt całkowicie chroni cię przed " +"To ubranie całkowicie chroni cię przed " "promieniowaniem." #. ~ Please leave anything in unchanged. @@ -79626,7 +79805,8 @@ msgid "" "This clothing partially protects you from " "radiation." msgstr "" -"Ten sprzęt częściowo chroni cię przed promieniowaniem." +"To ubranie częściowo chroni cię przed " +"promieniowaniem." #: lang/json/json_flag_from_json.py msgid "Prevents the covered body-part(s) from getting wet in the rain." @@ -79637,7 +79817,7 @@ msgstr "Chroni zakryte części ciała przed przemoczeniem w deszczu." msgid "" "This piece of clothing is designed to keep you dry in the rain." msgstr "" -"Ten element ubioru opracowano aby użytkownik pozostał suchy w " +"To ubranie zaprojektowano by utrzymać cię suchym w czasie " "deszczu." #: lang/json/json_flag_from_json.py @@ -79650,20 +79830,23 @@ msgstr "" #: lang/json/json_flag_from_json.py msgid "This item can be stored in a sheath of the appropriate size." -msgstr "Ten przedmiot możesz przechowywać w pochwie odpowiedniego rozmiaru." +msgstr "" +"Ten przedmiot może być przechowywany w pochwie odpowiedniego rozmiaru." #: lang/json/json_flag_from_json.py msgid "This item can be stored in a scabbard of the appropriate size." msgstr "" -"Ten przedmiot możesz przechowywać w pochwie na miecz odpowiedniego rozmiaru." +"Ten przedmiot może być przechowywany w pochwie na miecz odpowiedniego " +"rozmiaru." #: lang/json/json_flag_from_json.py msgid "This item can be stored in a sling of the appropriate size." msgstr "" +"Ten przedmiot może być przechowywany w temblaku odpowiedniego rozmiaru." #: lang/json/json_flag_from_json.py msgid "This item can be stored in a bag of the appropriate size." -msgstr "" +msgstr "Ten przedmiot może być przechowywany w torbie odpowiedniego rozmiaru." #: lang/json/json_flag_from_json.py msgid "Undergarment layer." @@ -79672,18 +79855,22 @@ msgstr "Warstwa bielizny." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing lies close to the skin." -msgstr "Ten ubiór nosisz bezpośrednio na skórze." +msgstr "To ubranie leży bezpośrednio przy skórze." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is restrictive and slows your movement speed." msgstr "" +"To ubranie jest ograniczające i spowalnia twoją szybkość poruszania " +"się." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "" "This clothing slows your thirst by reducing moisture loss." msgstr "" +"To ubranie spowalnia twoje pragnienie ograniczając stratę " +"wilgoci." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79691,8 +79878,8 @@ msgid "" "This clothing will protect you from harm and withstand a " "lot of abuse." msgstr "" -"Ten ubiór ochroni cię przed obrażeniami i samwiele " -"wytrzyma." +"To ubranie ochroni cię przed obrażeniami i jest w stanie " +"wytrzymać wiele nadużyć." #: lang/json/json_flag_from_json.py msgid "Prevents glaring when in sunlight." @@ -79701,19 +79888,20 @@ msgstr "Zapobiega oślepieniu w świetle słońca." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing keeps the glare out of your eyes." -msgstr "Ten ubiór chroni twoje oczy przed oślepieniem." +msgstr "To ubranie chroni twoje oczy przed oślepieniem." #: lang/json/json_flag_from_json.py msgid "" "Gives an additional moral bonus over FANCY if the player has the Stylish " "trait." msgstr "" -"Daje dodatkowy bonus ponad ELEGANCKI jeżeli postać ma zdolność Stylowy." +"Daje dodatkowy bonus do morale ponad WYMYŚLNE jeżeli postać ma zdolność " +"Stylowy." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This clothing is very fancy." -msgstr "Ta cześć ubioru jest bardzo elegancka." +msgstr "To ubranie jest bardzo wymyślne." #: lang/json/json_flag_from_json.py msgid "Allows you to see much further under water." @@ -79725,7 +79913,7 @@ msgid "" "This clothing allows you to see much further under " "water." msgstr "" -"Ten ubiór pozwala ci widzieć znacznie dalej pod " +"To ubranie pozwala ci widzieć znacznie dalej pod " "wodą." #: lang/json/json_flag_from_json.py @@ -79775,8 +79963,8 @@ msgid "" "This clothing won't let water through. Unless you jump in the " "river or something like that." msgstr "" -"Ten ubiór nie przepuszcza wody. Chyba że wskoczysz do rzeki lub" -" coś w tym stylu." +"To ubranie nie przepuszcza wody. Chyba że wskoczysz do rzeki " +"lub coś w tym stylu." #: lang/json/json_flag_from_json.py msgid "" @@ -79792,8 +79980,8 @@ msgid "" "This clothing performs well even when soaking wet." " This can feel good." msgstr "" -"Ten ubiór sprawuje się świetnie nawet gdy " -"przemoczony. To może być przyjemne." +"To ubranie sprawuje się świetnie nawet gdy jest " +"przemoczone. To może być przyjemne." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79801,7 +79989,7 @@ msgid "" "This clothing has a fur lining sewn into it to increase its " "overall warmth." msgstr "" -"Ten ubiór jest podszyty futrem by zwiększyć jego " +"To ubranie jest podszyte futrem by zwiększyć jego " "ciepłotę." #. ~ Please leave anything in unchanged. @@ -79828,7 +80016,7 @@ msgid "" "This clothing has a wool lining sewn into it to increase its " "overall warmth." msgstr "" -"Ten ubiór ma wełnianą podszewkę by zwiększyć jego " +"To ubranie ma wełnianą podszewkę by zwiększyć jego " "ciepłotę." #: lang/json/json_flag_from_json.py @@ -79860,6 +80048,8 @@ msgid "" "This bionic only has a function when activated, else it causes its effect " "every turn." msgstr "" +"Ta bionika działa tylko jak jest aktywowana, w przeciwnym wypadku powoduje " +"swój efekt co turę." #: lang/json/json_flag_from_json.py msgid "" @@ -79888,16 +80078,19 @@ msgid "" "An alternator. When mounted on a gasoline or diesel engine and the engine " "is on, will produce electrical power that can be stored in a battery." msgstr "" +"Alternator. Po zamontowaniu na silniku spalinowym lub dieslowym i włączeniu " +"silnika, będzie on wytwarzać energię elektryczną, którą można przechowywać w" +" akumulatorze." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "You can move through this vehicle frame without being slowed down." -msgstr "" +msgstr "Możesz poruszać się przez tę ramę pojazdu bez spowalniania." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "A bright light that illuminates several squares inside the vehicle." -msgstr "" +msgstr "Jasne światło, które oświetla kilka pól wewnątrz pojazdu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79911,7 +80104,7 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "You can sleep here comfortably." -msgstr "" +msgstr "Możesz tutaj spać komfortowo." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79919,11 +80112,13 @@ msgid "" "You can install a seat belt or five part harness here to help keep you in " "your seat during a collision." msgstr "" +"Możesz zainstalować pasy bezpieczeństwa lub 5-punktową uprząż, by zatrzymać " +"cię w siedzeniu w czasie kolizji." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "You can store items here." -msgstr "" +msgstr "Możesz tutaj składować przedmioty." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79931,6 +80126,9 @@ msgid "" "You can 'e'xamine the tile or attempt to pick-up items (default ',') to " "access the controls, or use the vehicle control key (default '^')." msgstr "" +"Możesz zbadać pole (domyślnie 'e') lub spróbować podnieść przedmiot " +"(domyślnie ',') by uzyskać dostęp do sterowania, albo użyć przycisku " +"kontrolującego pojazd (domyślne '^')." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79939,11 +80137,16 @@ msgid "" "attempt to pick-up items (default ',') to access the controls, or use the " "vehicle control key (default '^')." msgstr "" +"Z siedzeniem lub siodłem, możesz stąd kierować. Możesz zbadać pole " +"(domyślnie 'e') lub spróbować podnieść przedmiot (domyślnie ',') by uzyskać " +"dostęp do sterowania, albo użyć przycisku kontrolującego pojazd (domyślne " +"'^')." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "Illuminated items in this space will not illuminate nearby squares." msgstr "" +"Oświetlone przedmioty w tym miejscu nie będą oświetlać pobliskich pól." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79951,6 +80154,8 @@ msgid "" "Closed, it prevents people from seeing through the curtain. A door motor " "allows you to remotely open or close it from the vehicle controls." msgstr "" +"Zamknięta, zapobiega zaglądaniu przez zasłonę. Silnik drzwi pozwala zdalnie " +"ją zasunąć lub odsłonić z poziomu sterowania pojazdem." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79959,11 +80164,13 @@ msgid "" "vice versa. When closed, it prevents people from entering or leaving the " "vehicle." msgstr "" +"Gdy są otwarte, ta część pozwala ci nie dostać się do, lub wyjść z pojazdu. " +"Zamknięte zapobiegają wchodzeniu i wychodzeniu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "When turned on, this device drains power from the vehicle's batteries." -msgstr "" +msgstr "Po włączeniu to urządzenie zużywa prąd z akumulatorów pojazdu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79972,6 +80179,9 @@ msgid "" "wheels. Requires controls to turn on. If it drains power, also requires a " "charged battery to start." msgstr "" +"Zapewnia moc napędową do poruszania pojazdu jeśli posiada on wystarczającą " +"liczbę kół. Wymaga układu sterowania by włączyć. Jeśli zużywa energię, " +"wymaga również naładowanego akumulatora" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79979,12 +80189,14 @@ msgid "" "An alternator can be attached, and it will generate electrical power while " "the engine is on at the cost of some motive power." msgstr "" +"Alternator może być podłączony i będzie generować energię elektryczną w " +"czasie gdy silnik jest włączony, kosztem jakiejś mocy napędowej." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "" "When turned on, it will stop the vehicle unless it has a strong engine." -msgstr "" +msgstr "Po włączeniu zatrzyma pojazd, jeśli nie ma mocnego silnika." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -79994,6 +80206,10 @@ msgid "" "provided it has an active engine or motor with enough power to move the " "vehicle." msgstr "" +"Jeśli środek ciężkości pojazdu znajduje się pomiędzy wszystkimi deskami " +"łodzi, a nie masz kół, pojazd będzie mógł unosić się nad wodą, pod " +"warunkiem, że ma aktywny silnik lub motor o mocy wystarczającej do " +"poruszenia pojazdu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -80001,16 +80217,18 @@ msgid "" "There's no place to attach a seat belt, so you get thrown from the vehicle " "in a crash." msgstr "" +"Nie ma miejsca by przeczepić pasy bezpieczeństwa, więc wypadek spowoduje " +"wyrzucenie cię z pojazdu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "Keeps the rain out of the interior of the vehicle." -msgstr "" +msgstr "Zapobiega dostaniu się deszczu do środka pojazdu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "You need to be in a seat or saddle to operate vehicle controls." -msgstr "" +msgstr "Musisz być na siedzeniu lub siodle by sterować układami pojazdu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -80019,6 +80237,8 @@ msgid "" "collision. You will automaticlly enable this part when you move into a tile" " with it." msgstr "" +"Ta część pomoże ci uniknąć wyrzucenia z pojazdu podczas kolizji. " +"Automatycznie włączysz tę część, gdy wkroczysz na pole z nią." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -80026,11 +80246,15 @@ msgid "" "If your vehicle consists of a single tile, this wheel is enough to allow it " "to move." msgstr "" +"Jeśli twój pojazd składa się z pojedynczego pola, to koło jest wystarczające" +" by mógł się poruszać." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "Your vehicle needs at least one set of steerable wheels to turn." msgstr "" +"Twój pojazd potrzebuje przynajmniej jednego zestawu sterowalnych kół by " +"skręcać." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -80038,6 +80262,8 @@ msgid "" "A heavy weapon mounted in a turret. It can be fired from the vehicle " "controls." msgstr "" +"Ciężka broń montowana w wieżyczce. Może być wystrzelona z poziomu elementów " +"sterujących pojazdu." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -80046,6 +80272,9 @@ msgid "" "vehicle will be able to move, provided it has an active engine or motor with" " enough power to move the vehicle." msgstr "" +"Jeśli środek ciężkości pojazdu znajduje się pomiędzy wszystkimi kołami, " +"pojazd będzie mógł się poruszać, pod warunkiem, że ma aktywny silnik lub " +"motor o mocy wystarczającej do poruszenia pojazdu." #: lang/json/keybinding_from_json.py lang/json/keybinding_from_json.py #: src/input.cpp src/messages.cpp @@ -80493,13 +80722,17 @@ msgstr "Załataj część" msgid "Refill tank/battery" msgstr "Uzupełnij zbiornik/akumulator" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "Rozładuj bunkier na paliwo" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "Usuń część" #: lang/json/keybinding_from_json.py msgid "Rename vehicle" -msgstr "Przemianuj pojazd" +msgstr "Zmień nazwę pojazdu" #: lang/json/keybinding_from_json.py msgid "Siphon from tank" @@ -80515,31 +80748,31 @@ msgstr "Przypisz załogę" #: lang/json/keybinding_from_json.py msgid "Relabel a portion of a vehicle" -msgstr "Przemianuj część pojazdu" +msgstr "Oznacz inaczej kawałek pojazdu" #: lang/json/keybinding_from_json.py msgid "Scroll up through fuel list" -msgstr "" +msgstr "Przewiń listę paliw w górę" #: lang/json/keybinding_from_json.py msgid "Scroll down through fuel list" -msgstr "" +msgstr "Przewiń listę paliw w dół" #: lang/json/keybinding_from_json.py msgid "Scroll up through vehicle part descriptions" -msgstr "" +msgstr "Przewiń opisy części pojazdów w górę" #: lang/json/keybinding_from_json.py msgid "Scroll down through vehicle part descriptions" -msgstr "" +msgstr "Przewiń opisy części pojazdów w dół" #: lang/json/keybinding_from_json.py msgid "Scroll up through vehicle overview" -msgstr "" +msgstr "Przewiń przegląd pojazdów w górę" #: lang/json/keybinding_from_json.py msgid "Scroll down through vehicle overview" -msgstr "" +msgstr "Przewiń przegląd pojazdów w dół" #: lang/json/keybinding_from_json.py msgid "Toggle unavailable constructions" @@ -80691,7 +80924,7 @@ msgstr "Chwyć coś w pobliżu" #: lang/json/keybinding_from_json.py msgid "Zone activities" -msgstr "" +msgstr "Aktywności strefy" #: lang/json/keybinding_from_json.py src/options.cpp msgid "Butcher" @@ -81202,7 +81435,7 @@ msgstr "Złóż pojazd" #: lang/json/keybinding_from_json.py msgid "Release controls" -msgstr "Uwolnij kontrolę" +msgstr "Puść sterowanie" #: lang/json/keybinding_from_json.py msgid "Sound horn" @@ -81250,7 +81483,7 @@ msgstr "Przełącz lodówkę" #: lang/json/keybinding_from_json.py msgid "Toggle freezer" -msgstr "" +msgstr "Przełącz zamrażarkę" #: lang/json/keybinding_from_json.py msgid "Toggle headlights" @@ -81339,27 +81572,27 @@ msgstr "Utrzymywane przez kościół z ." #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Cemetery" -msgstr "" +msgstr "Cmentarz Miasta " #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Cemetery" -msgstr "" +msgstr "Cmentarz Rodziny " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Please respect the cemetery" -msgstr "" +msgstr "Proszę, szanuj cmentarz." #. ~ Sign #: lang/json/mapgen_from_json.py msgid "May and thier family rest in peace" -msgstr "" +msgstr "Niech z rodziną spoczywają w pokoju" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Family Cemetery" -msgstr "" +msgstr "Rodzinny Cmentarz Rodziny " #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -81384,272 +81617,273 @@ msgstr "Dzwony na Pogrzeb" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Dollar Store" -msgstr "" +msgstr "Sklep \"Wszystko Za Dolara\"" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "OPEN 24/7!" -msgstr "" +msgstr "OTWARTE 24/7!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Dump" -msgstr "" +msgstr "Wysypisko Miasta " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DUMP" -msgstr "" +msgstr "WYSYP" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Area Dump" -msgstr "" +msgstr "Wysyp Obszaru Miasta " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "'s Tree Farm, call us at 555-8758!" -msgstr "" +msgstr "Szkółka Leśna , zadzwoń do nas pod 555-8758!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Christmas trees available early winter!" -msgstr "" +msgstr "Choinki dostępne wczesną zimą!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Welcome to Botanical Garden! Please stay on the path!" msgstr "" +"Witamy w Ogrodzie Botanicznym Miasta ! Proszę nie schodzić z drogi!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "WILLOW" -msgstr "" +msgstr "WIERZBA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "PINE" -msgstr "" +msgstr "SOSNA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HICKORY" -msgstr "" +msgstr "ORZESZNIK" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "MAPLE" -msgstr "" +msgstr "KLON" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "BIRCH" -msgstr "" +msgstr "BRZOZA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "OAK" -msgstr "" +msgstr "DĄB" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CHAMOMILE" -msgstr "" +msgstr "RUMIANEK" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "POPPY" -msgstr "" +msgstr "MAK" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CACTUS" -msgstr "" +msgstr "KAKTUS" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DANDELION" -msgstr "" +msgstr "MNISZEK" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "KENTUCKY COFFEE" -msgstr "" +msgstr "KŁĘK AMERYKAŃSKI" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "PEAR" -msgstr "" +msgstr "GRUSZA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CHERRY" -msgstr "" +msgstr "WIŚNIA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "APPLE" -msgstr "" +msgstr "JABŁOŃ" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "PEACH" -msgstr "" +msgstr "BRZOSKWINIA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "APRICOT" -msgstr "" +msgstr "MORELA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "PLUM" -msgstr "" +msgstr "ŚLIWA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "BLUEBELL" -msgstr "" +msgstr "HIACYNTOWIEC" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DAHLIA" -msgstr "" +msgstr "DALIA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CATTAIL" -msgstr "" +msgstr "PAŁKA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DATURA" -msgstr "" +msgstr "BIELUŃ" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "STRAWBERRY" -msgstr "" +msgstr "TRUSKAWKA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "BLUEBERRY" -msgstr "" +msgstr "BORÓWKA WYSOKA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden" -msgstr "" +msgstr "Ogrody Działkowe Miasta " #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden. Grow your own food!" -msgstr "" +msgstr "Ogrody Działkowe Miasta . Hoduj własne jedzenie!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden, sign up for your own plot!" -msgstr "" +msgstr "Ogrody Działkowe Miasta . Zapisz się by mieć własną działkę!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Community Garden, grow your own vegtable!" -msgstr "" +msgstr "Ogrody Działkowe Miasta . Hoduj własne warzywa!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Public Garden" -msgstr "" +msgstr "Publiczne Ogrody Działkowe Miasta " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #16" -msgstr "" +msgstr "DOŁEK #16" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #14" -msgstr "" +msgstr "DOŁEK #14" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #15" -msgstr "" +msgstr "DOŁEK #15" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #10" -msgstr "" +msgstr "DOŁEK #10" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #17" -msgstr "" +msgstr "DOŁEK #17" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #12" -msgstr "" +msgstr "DOŁEK #12" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #8" -msgstr "" +msgstr "DOŁEK #8" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #11" -msgstr "" +msgstr "DOŁEK #11" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #9" -msgstr "" +msgstr "DOŁEK #9" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #4" -msgstr "" +msgstr "DOŁEK #4" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #18" -msgstr "" +msgstr "DOŁEK #18" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #13" -msgstr "" +msgstr "DOŁEK #13" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #7" -msgstr "" +msgstr "DOŁEK #7" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #5" -msgstr "" +msgstr "DOŁEK #5" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #6" -msgstr "" +msgstr "DOŁEK #6" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #2" -msgstr "" +msgstr "DOŁEK #2" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #1" -msgstr "" +msgstr "DOŁEK #1" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HOLE #3" -msgstr "" +msgstr "DOŁEK #3" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -81674,143 +81908,151 @@ msgstr "Terapia Komórkami Macierzystymi" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Landfill" -msgstr "" +msgstr "Składowisko Odpadów Miasta " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "SAND" -msgstr "" +msgstr "PIASEK" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "WOODCHIPS" -msgstr "" +msgstr "ZRĘBKI" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "LOGS" -msgstr "" +msgstr "KŁODY" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "STICKS" -msgstr "" +msgstr "PATYKI" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CLAY" -msgstr "" +msgstr "GLINA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "HAY" -msgstr "" +msgstr "SIANO" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "DIRT" -msgstr "" +msgstr "ZIEMIA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "GRAVEL" -msgstr "" +msgstr "ŻWIR" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "CEMENT" -msgstr "" +msgstr "CEMENT" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "FERTILIZER" -msgstr "" +msgstr "NAWÓZ" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "ROCKS" -msgstr "" +msgstr "KAMIENIE" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "BOULDERS and SLABS" -msgstr "" +msgstr "GŁAZY i PŁYTY" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "" "Empty lot, great for your small business! Call at 555-2117!" msgstr "" +"Pusta działka, świetna na twój mały biznes! Zadzwoń do: pod " +"numer 555-2117!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Empty lot for sale!" -msgstr "" +msgstr "Pusta działka na sprzedaż!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Call Family Realty at 555-3130!" -msgstr "" +msgstr "Zadzwoń do: Nieruchomości Rodziny pod 555-3130!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "SOLD!" -msgstr "" +msgstr "SPRZEDANE!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "East Realty!" -msgstr "" +msgstr "Nieruchomości Wschodnie !" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Lot for sale!" -msgstr "" +msgstr "Działka na sprzedaż!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Call for more info. 555-7723" -msgstr "" +msgstr "Zadzwoń po więcej info. pod nr 555-7723" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Private Property!" -msgstr "" +msgstr "Własność Prywatna!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO Dumping!" -msgstr "" +msgstr "ZAKAZ Wysypywania!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Cheap lot for sale! Call at 555-5151!" msgstr "" +"Tania działka na sprzedaż! Zadzwoń do: pod numer 555-5151!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Property for sale!" -msgstr "" +msgstr "Nieruchomość na sprzedaż!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Call with Realty at 555-6288!" msgstr "" +"Zadzwoń do: Nieruchomości i pod numer 555-6288!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Beautiful lot with some natural privacy! Call at 555-3927!" msgstr "" +"Bardzo ładny grunt z kawałkiem naturalnej prywatności! Zadzwoń do: " +" pod numer 555-3927!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Property for sale, call Realestate at 555-8255!" msgstr "" +"Nieruchomość na sprzedaż, zadzwoń do: Nieruchomości pod numer " +"555-8255!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Lot SOLD!" -msgstr "" +msgstr "Działa SPRZEDANA!" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -81875,37 +82117,37 @@ msgstr "Używasz parku na własne ryzyko." #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO lifeguard on duty, swim at own risk!" -msgstr "" +msgstr "BRAK ratownika na służbie, pływanie na własne ryzyko!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO lifeguard on duty!" -msgstr "" +msgstr "BRAK ratownika na służbie!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO running!" -msgstr "" +msgstr "ZAKAZ biegania!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "MEN" -msgstr "" +msgstr "MĘSKI" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "WOMEN" -msgstr "" +msgstr "DAMSKI" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO diving in the shallow end!" -msgstr "" +msgstr "ZAKAZ nurkowania na płyciźnie!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Women" -msgstr "" +msgstr "Kobiety" #. ~ Sign #: lang/json/mapgen_from_json.py src/faction.cpp @@ -81915,77 +82157,77 @@ msgstr "Mężczyźni" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO Running!" -msgstr "" +msgstr "ZAKAZ Biegania!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "NO Diving!" -msgstr "" +msgstr "ZAKAZ Nurkowania!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "GLASS" -msgstr "" +msgstr "SZKŁO" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "ALUMINUM" -msgstr "" +msgstr "ALUMINIUM" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "PAPER" -msgstr "" +msgstr "PAPIER" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "PLASTIC" -msgstr "" +msgstr "TWORZYWA SZTUCZNE" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "ELECTRONICS" -msgstr "" +msgstr "ELEKTRONIKA" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "COPPER" -msgstr "" +msgstr "MIEDŹ" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "IRON" -msgstr "" +msgstr "ŻELAZO" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "BATTERIES" -msgstr "" +msgstr "BATERIE" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "STEEL" -msgstr "" +msgstr "STAL" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "'s Recycling" -msgstr "" +msgstr " Recykling" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Drop off 7am to 6pm Monday thru Friday" -msgstr "" +msgstr "Przyjmujemy od poniedziałku do piątku od 7:00 do 18:00" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Recycling" -msgstr "" +msgstr "Recykling Miasta " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Drop off 8am to 8pm, weekdays." -msgstr "" +msgstr "Przyjmujemy od 8:00 do 20:00 w dni robocze." #. ~ Sign #: lang/json/mapgen_from_json.py @@ -82005,7 +82247,7 @@ msgstr "Niebezpieczeństwo! Nie pal! Ryzyko eksplozji!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Wide selection of storage batteries! Discounts!" -msgstr "" +msgstr "Szeroki wybór akumulatorów! Rabaty!" #. ~ Sign #: lang/json/mapgen_from_json.py @@ -82035,42 +82277,42 @@ msgstr "Kontakt z nami" #. ~ Sign #: lang/json/mapgen_from_json.py msgid " Family Shooting Range" -msgstr "" +msgstr "Strzelnica Rodziny " #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Open sunrise to sunset, everday besides Sundays" -msgstr "" +msgstr "Otwarte od świtu do zmierzchu, poza niedzielami" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "5 YARDS" -msgstr "" +msgstr "5 JARDÓW" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "10 YARDS" -msgstr "" +msgstr "10 JARDÓW" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "15 YARDS" -msgstr "" +msgstr "15 JARDÓW" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "20 YARDS" -msgstr "" +msgstr "20 JARDÓW" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "25 YARDS" -msgstr "" +msgstr "25 JARDÓW" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "30 YARDS" -msgstr "" +msgstr "30 JARDÓW" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -82096,32 +82338,32 @@ msgstr "Herbaciarnia Czerwony Smok" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Please don't litter, keep the trail nice!" -msgstr "" +msgstr "Prosimy o nieśmiecenie, utrzymaj szlak w ładzie!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Moving away sale!" -msgstr "" +msgstr "Wyprzedaż przeprowadzkowa!" #. ~ Sign #: lang/json/mapgen_from_json.py msgid "Estate sale!" -msgstr "" +msgstr "Sprzedaż nieruchomości!" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Operating Theatre Access Control" -msgstr "" +msgstr "Kontrola Dostępu Teatru Działań Wojennych" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "EMERGENCY EVAC - OPEN ALL DOORS" -msgstr "" +msgstr "NAGŁA EWAKUACJA - OTWÓRZ WSZYSTKIE DRZWI" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "UNLOCK AUTODOC DOOR" -msgstr "" +msgstr "ODBLOKUJ DRZWI AUTODOKA" #. ~ Computer name #: lang/json/mapgen_from_json.py @@ -82166,7 +82408,7 @@ msgstr "Dostęp do Melchiora" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Library Entrance" -msgstr "" +msgstr "Wejście Biblioteki" #. ~ Computer option #: lang/json/mapgen_from_json.py @@ -82196,27 +82438,27 @@ msgstr "AWARYJNE OPRÓŻNIENIE STREFY PRZETRZYMYWANIA" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "PE012 Storage" -msgstr "" +msgstr "Magazyn PE012" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "UNLOCK STORAGE" -msgstr "" +msgstr "OTWÓRZ MAGAZYN" #. ~ Computer name #: lang/json/mapgen_from_json.py msgid "Laboratory Train Controls" -msgstr "" +msgstr "Kontrola Pociągu Laboratorium" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Request Subway Train" -msgstr "" +msgstr "Poproś o Pociąg Metra" #. ~ Computer option #: lang/json/mapgen_from_json.py msgid "Download Subway Routes" -msgstr "" +msgstr "Pobierz Trasy Metra" #: lang/json/martial_art_from_json.py msgid "No style" @@ -83158,7 +83400,7 @@ msgstr "poznaczony" #: lang/json/material_from_json.py msgid "Budget Steel" -msgstr "" +msgstr "Budżetowa Stal" #: lang/json/material_from_json.py msgid "Ceramic" @@ -85300,6 +85542,13 @@ msgid "" " could bring in 6 full kits I'm sure we could supplement them to make them " "last a bit longer." msgstr "" +"Planujemy stworzyć klinikę medyczną, ale potrzebujemy dużo więcej " +"zaopatrzenia jeżeli mamy mieć nadzieję na gwarancję wysłania z centrum " +"uchodźców do naszej placówki jednej z nielicznych osób z doświadczeniem " +"lekarskim. Wiem, że zestawy pierwszej pomocy są rzadkie, ale zawierają " +"wszystkie brakujące nam elementy wyposażenia. Jeżeli zgromadzisz 6 pełnych " +"zestawów, jestem pewien, że będziemy w stanie je uzupełniać by wystarczyły " +"na dłużej." #: lang/json/mission_def_from_json.py msgid "We'll do our best to make them last..." @@ -86640,7 +86889,7 @@ msgstr "Alergia na Pszenicę" #: lang/json/morale_type_from_json.py msgid "Enjoyed sugary food" -msgstr "" +msgstr "Smakowało ci słodkie jedzenie" #: lang/json/morale_type_from_json.py msgid "Ate Indigestible Food" @@ -86745,15 +86994,15 @@ msgstr "Żygałeś" #: lang/json/morale_type_from_json.py msgid "Lit a fire" -msgstr "" +msgstr "Rozpalono ogień" #: lang/json/morale_type_from_json.py msgid "Spent time close to fire" -msgstr "" +msgstr "Spędzono chwilę blisko ognia" #: lang/json/morale_type_from_json.py msgid "Craving fire" -msgstr "" +msgstr "Pożądasz ognia" #: lang/json/morale_type_from_json.py msgid "Filthy Gear" @@ -86761,7 +87010,7 @@ msgstr "Brudny Ubiór" #: lang/json/morale_type_from_json.py msgid "Anguished by memories of butchering human corpse" -msgstr "" +msgstr "Zdenerwowanie wspomnieniami o zmasakrowaniu ludzkiego ciała" #: lang/json/morale_type_from_json.py msgid "Debug Morale" @@ -86770,7 +87019,7 @@ msgstr "Debuguj Morale" #. ~ Mutation class: Any mutagen_message #: lang/json/mutation_category_from_json.py msgid "You feel strange." -msgstr "" +msgstr "Dziwnie się czujesz." #. ~ Mutation class: Any iv_message #: lang/json/mutation_category_from_json.py @@ -86785,7 +87034,7 @@ msgstr "Wijesz się i padasz na ziemię." #. ~ Mutation class: Any iv_sound_message #: lang/json/mutation_category_from_json.py msgid "yourself scream in agony!" -msgstr "" +msgstr "swój krzyk w agonii!" #. ~ Mutation class: Any junkie_message #: lang/json/mutation_category_from_json.py src/iuse_actor.cpp @@ -86832,7 +87081,7 @@ msgstr "Słyszysz bzyczenie, i czujesz jak twoje ciało twardnieje." #. ~ Mutation class: Insect iv_message #: lang/json/mutation_category_from_json.py msgid "You sting yourself... for the Queen." -msgstr "" +msgstr "Dźgasz siebie... dla Królowej." #. ~ Mutation class: Insect Male memorial messsage #: lang/json/mutation_category_from_json.py @@ -86859,7 +87108,7 @@ msgstr "Czujesz się podstępny." #. ~ Mutation class: Spider iv_message #: lang/json/mutation_category_from_json.py msgid "Mmm... the *special* venom." -msgstr "" +msgstr "Mmm... *specjalny* jad." #. ~ Mutation class: Spider Male memorial messsage #: lang/json/mutation_category_from_json.py @@ -86945,7 +87194,7 @@ msgstr "Piszczysz gdy zastrzyk wypełnia twoje żyły." #. ~ Mutation class: Rat iv_sound_message #: lang/json/mutation_category_from_json.py msgid "eep!" -msgstr "" +msgstr "pip!" #. ~ Mutation class: Rat Male memorial messsage #: lang/json/mutation_category_from_json.py @@ -86994,7 +87243,7 @@ msgstr "Niedźwiedź" #. ~ Mutation class: Bear mutagen_message #: lang/json/mutation_category_from_json.py msgid "You feel an urge to... patrol? the forests?" -msgstr "" +msgstr "Czujesz nagłą potrzebę... patrolowania? Lasów?" #. ~ Mutation class: Bear iv_message #: lang/json/mutation_category_from_json.py @@ -87285,7 +87534,7 @@ msgstr "Musisz ryczeć, gryźć, tarzać się i machać skrzydłami. Teraz!" #. ~ Mutation class: Chimera iv_message #: lang/json/mutation_category_from_json.py msgid "everyanimalthateverlived.bursting.from.YOU!" -msgstr "" +msgstr "każdezwierzektórekiedykolwiekżyło.wychodzi.z.CIEBIE!" #. ~ Mutation class: Chimera iv_sleep_message #: lang/json/mutation_category_from_json.py @@ -87295,7 +87544,7 @@ msgstr "Z finalnym *pop* gaśniesz jak świeca." #. ~ Mutation class: Chimera iv_sound_message #: lang/json/mutation_category_from_json.py msgid "yourself roar in agony!" -msgstr "" +msgstr "swój ryk w agonii!" #. ~ Mutation class: Chimera Male memorial messsage #: lang/json/mutation_category_from_json.py @@ -87374,30 +87623,31 @@ msgstr "Wylęg." #. ~ Mutation class name #: lang/json/mutation_category_from_json.py msgid "Mouse" -msgstr "" +msgstr "Mysz" #. ~ Mutation class: Mouse mutagen_message #: lang/json/mutation_category_from_json.py msgid "" "You feel a desire to curl up in a nice, warm pile of... shredded paper." msgstr "" +"Czujesz chęć, by zwinąć się w ładnym, ciepłym stosie... pociętego papieru." #. ~ Mutation class: Mouse iv_message #: lang/json/mutation_category_from_json.py msgid "You feel... small. But comfortable." -msgstr "" +msgstr "Czujesz się... mało. Ale komfortowo." #. ~ Mutation class: Mouse Male memorial messsage #: lang/json/mutation_category_from_json.py msgctxt "memorial_male" msgid "Found the cheese." -msgstr "" +msgstr "Znalazłeś ser." #. ~ Mutation class: Mouse Female memorial messsage #: lang/json/mutation_category_from_json.py msgctxt "memorial_female" msgid "Found the cheese." -msgstr "" +msgstr "Znalazłaś ser." #: lang/json/mutation_from_json.py msgid "Fleet-Footed" @@ -87468,7 +87718,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Hyperactive" -msgstr "" +msgstr "Nadpobudliwość" #. ~ Description for Hyperactive #: lang/json/mutation_from_json.py @@ -87477,6 +87727,8 @@ msgid "" "Your body's efficiency is like that of a tiny furnace, increasing your " "maximum stamina by 40%." msgstr "" +"Wydajność twojego ciała jest taka jak małego pieca, zwiększając twoją " +"maksymalną staminę o 40%." #: lang/json/mutation_from_json.py msgid "Quick" @@ -87533,7 +87785,7 @@ msgstr "Zawsze łatwo zasypiałeś, nawet w mniej niż idealnych warunkach." #: lang/json/mutation_from_json.py msgid "Practiced Sleeper" -msgstr "" +msgstr "Wyszkolony Spacz" #. ~ Description for Practiced Sleeper #: lang/json/mutation_from_json.py @@ -87541,6 +87793,8 @@ msgid "" "Your body's demanding energy needs mean you can fall asleep just about " "anywhere." msgstr "" +"Wymagające potrzeby energetyczne twojego ciała oznaczają, że możesz zasnąć " +"niemal wszędzie." #: lang/json/mutation_from_json.py msgid "Pain Resistant" @@ -87789,7 +88043,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Bookworm" -msgstr "" +msgstr "Mól Książkowy" #. ~ Description for Bookworm #: lang/json/mutation_from_json.py @@ -87797,6 +88051,8 @@ msgid "" "There's nothing quite like the smell of a good book! Books are more fun (or" " less boring) for you!" msgstr "" +"Nie ma nic lepszego niż zapach dobrej książki! Książki dostarczają ci więcej" +" zabawy (lub są mniej nudne)!" #: lang/json/mutation_from_json.py msgid "Addiction Resistant" @@ -88349,7 +88605,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Hates Books" -msgstr "" +msgstr "Nienawidzi Książek" #. ~ Description for Hates Books #: lang/json/mutation_from_json.py @@ -88357,6 +88613,8 @@ msgid "" "Reading is for nerds! Boring books are more boring, and you can't have fun " "by reading books." msgstr "" +"Czytanie jest dla frajerów! Nudne książki są nudniejsze i nie dostarczają ci" +" tyle zabawy z czytania." #: lang/json/mutation_from_json.py msgid "Hates Fruit" @@ -88412,7 +88670,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Sweet Tooth" -msgstr "" +msgstr "Amator Słodyczy" #. ~ Description for Sweet Tooth #: lang/json/mutation_from_json.py @@ -88420,10 +88678,12 @@ msgid "" "You have a soft spot for processed foods, and gain a morale bonus from " "eating it." msgstr "" +"Masz słabość do przetworzonej żywności i zyskujesz premię do morale od jej " +"jedzenia." #: lang/json/mutation_from_json.py msgid "Sugar-Loving" -msgstr "" +msgstr "Kocha Słodycze" #. ~ Description for Sugar-Loving #: lang/json/mutation_from_json.py @@ -88431,6 +88691,8 @@ msgid "" "You *adore* the taste of junk food, and find it preferable to everything " "else!" msgstr "" +"*Uwielbiasz* smak niezdrowego jedzenia i uważasz, że jest lepszy od " +"wszystkiego innego!" #: lang/json/mutation_from_json.py msgid "Glass Jaw" @@ -88541,7 +88803,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Prey Animal" -msgstr "" +msgstr "Zwierzyna Łowna" #. ~ Description for Prey Animal #: lang/json/mutation_from_json.py @@ -88549,6 +88811,8 @@ msgid "" "Natural animals like dogs and wolves see you as prey, and are liable to " "attack you on sight." msgstr "" +"Naturalne zwierzęta, takie jak psy i wilki, postrzegają cię jako ofiarę i są" +" skłonne do atakowania cię od razu po zobaczeniu." #: lang/json/mutation_from_json.py msgid "Slow Reader" @@ -88577,12 +88841,12 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Narcoleptic" -msgstr "" +msgstr "Narkolepsja" #. ~ Description for Narcoleptic #: lang/json/mutation_from_json.py msgid "You randomly fall asleep without any reason." -msgstr "" +msgstr "Przypadkowo zasypiasz bez żadnego powodu." #: lang/json/mutation_from_json.py msgid "Clumsy" @@ -89107,7 +89371,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Mycus Flesh" -msgstr "Grzybicze Ciało" +msgstr "Grzybnicze Ciało" #. ~ Description for Mycus Flesh #: lang/json/mutation_from_json.py @@ -89115,10 +89379,12 @@ msgid "" "We have begun adapting local physiology to Mycus physical structure, greatly" " reducing wet effects." msgstr "" +"Zaadaptowaliśmy lokalną fizjologię do fizycznej struktury Grzybni, znacznie " +"redukując efekty przemoczenia." #: lang/json/mutation_from_json.py msgid "Mycus Fireproofing" -msgstr "Grzybicza Odporność na Ogień" +msgstr "Grzybnicza Odporność na Ogień" #. ~ Description for Mycus Fireproofing #: lang/json/mutation_from_json.py @@ -89128,10 +89394,14 @@ msgid "" "moderate amount, but provides powerful armor across our body, nullifies wet " "effects, and provides complete protection from fire." msgstr "" +"Połączyliśmy gęste, amfibolowe włókna z głównych wież Gryzbni ze sprężystym," +" adaptacyjnym ciałem lokalnej fizjologii. Zmniejsza to naszą prędkość o " +"umiarkowaną ilość, ale zapewnia potężny pancerz na całym ciele, anuluje " +"efekty przemoczenia i zapewnia całkowitą ochronę przed ogniem." #: lang/json/mutation_from_json.py msgid "Mycogenesis" -msgstr "" +msgstr "Grzybniogeneza" #. ~ Description for Mycogenesis #: lang/json/mutation_from_json.py @@ -89142,6 +89412,11 @@ msgid "" "us into a dormant state, which spreads spores around us as we sleep and " "revitalizes our body much more quickly than regular sleep." msgstr "" +"Lokalna fizjologia została w pełni włączona do fizjologii włókien Grzybni. " +"Oprócz korzyści wynikających z wcześniejszych osiągnięć, możemy połączyć się" +" z włóknami Grzybni pod nami - spanie na obszarach grzybowych wprowadza nas " +"w stan odpoczynku, który rozprzestrzenia zarodku wokół nas gdy śpimy i " +"ożywia nasze ciało znacznie szybciej niż zwykły sen." #: lang/json/mutation_from_json.py msgid "Scales" @@ -89508,7 +89783,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Mycus Spores" -msgstr "Grzybicze Zarodniki" +msgstr "Zarodniki Grzybni" #. ~ Description for Mycus Spores #: lang/json/mutation_from_json.py @@ -89527,6 +89802,11 @@ msgid "" "guidance determines that it is safe to germinate. Rapid development taxes " "local nutrient reserves but ensures swift and effective growth." msgstr "" +"Miejscowe organizmy uważają otwarte rozsiewanie zarodników jako zagrożenie i" +" atakują Grzybnię. Dostosowanie do tych warunków sprawia że torebki " +"zarodnikowe pozostają bierne, dopóki rozpoznanie terenu pozwoli na " +"stwierdzenie że posiew będzie bezpieczny. Gwałtowny rozwój osłabia lokalne " +"rezerwy składników odżywczych, ale zapewnia szybki i efektywny wzrost." #: lang/json/mutation_from_json.py msgid "Mycus Blossoms" @@ -89549,10 +89829,15 @@ msgid "" "guidance determines that it is safe to germinate. Rapid development taxes " "local nutrient reserves but ensures swift and effective growth." msgstr "" +"Miejscowe organizmy uważają otwarte rozsiewanie zarodników jako zagrożenie i" +" atakują Grzybnię. Dostosowanie do tych warunków sprawia że grzybicze kwiaty" +" pozostają bierne, dopóki rozpoznanie terenu pozwoli na stwierdzenie że " +"posiew będzie bezpieczny. Gwałtowny rozwój osłabia lokalne rezerwy " +"składników odżywczych, ale zapewnia szybki i efektywny wzrost." #: lang/json/mutation_from_json.py msgid "Mycus Provenance" -msgstr "" +msgstr "Grzybnicze Pochodzenie" #. ~ Description for Mycus Provenance #: lang/json/mutation_from_json.py @@ -89561,6 +89846,9 @@ msgid "" "Acting as one, they germinate together to cement rapid growth across a large" " area according to local guidance. The Mycus must grow." msgstr "" +"Lokalne worki zarodnikowe i kwiaty połączyły się w jedną symbiotyczną formę." +" Działając jako jeden, kiełkują razem, aby cementować szybki wzrost na dużym" +" obszarze zgodnie z lokalnymi wskazówkami. Grzybnia musi rosnąć." #: lang/json/mutation_from_json.py msgid "Long Fingernails" @@ -89801,7 +90089,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Mycus Identity" -msgstr "Tożsamość Mykus" +msgstr "Grzybnicza Tożsamość" #. ~ Description for Mycus Identity #: lang/json/mutation_from_json.py @@ -89811,6 +90099,10 @@ msgid "" "system, and we may traverse Mycus biospheres easily, as native bioforms " "shift shape to accommodate us." msgstr "" +"Zsynchronizowaliśmy naszą lokalną fizjologię z tą z Grzybni. Zarodniki które" +" napotkamy nie będą próbować namnażać się wewnątrz lokalnego systemu i " +"możemy przemierzać biosfery Grzybni z łatwością, ponieważ rodzime bioformy " +"zmieniają kształt by nas pomieścić. " #: lang/json/mutation_from_json.py msgid "Parasite Immune" @@ -89888,7 +90180,7 @@ msgid "" "Your limbs are significantly more flexible than any pathetic human arm or " "leg. +3 Dexterity, -2 Strength." msgstr "" -"Twoje kończyny są znacznie bardziej elastyczne niż każde żałosne ramię czy " +"Twoje kończyny są znacznie bardziej elastyczne niż każda żałosna ręka czy " "noga przeciętnego człowieka. Zręczność +3; Siła -2." #: lang/json/mutation_from_json.py @@ -90063,7 +90355,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Mycus Feeder" -msgstr "Żywiciel Mykus" +msgstr "Żywiciel Grzybni" #. ~ Description for Mycus Feeder #: lang/json/mutation_from_json.py @@ -90073,6 +90365,10 @@ msgid "" "the close proximity of Mycus core towers, and in forested areas that the " "Mycus has grown into." msgstr "" +"Poprawiliśmy nasze zapotrzebowanie na składniki odżywcze. Opieramy się na " +"Grzybni dla wyżywienia, tak jak ona opiera się na nas. Możemy zlokalizować " +"źródła utrzymania w bliskiej odległości od głównych wież Grzybni, a także w " +"obszarach leśnych, w których rozwinęła się Grzybnia." #: lang/json/mutation_from_json.py msgid "Ruminant" @@ -90359,7 +90655,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Rodent Tail" -msgstr "" +msgstr "Ogon Gryzonia" #. ~ Description for Rodent Tail #: lang/json/mutation_from_json.py @@ -90707,7 +91003,7 @@ msgstr "Bezwłose małpy są tak samo dobrym żarciem jak każde inne mięso." #: lang/json/mutation_from_json.py msgid "Mycus Defender" -msgstr "Obrońca Mykus" +msgstr "Obrońca Grzybni" #. ~ Description for Mycus Defender #: lang/json/mutation_from_json.py @@ -90717,6 +91013,10 @@ msgid "" " - our fibers will grow strong and resilient when such threats present " "themselves to us." msgstr "" +"Od czasu do czasu Grzybnie potrzebują obrońcy od nie-Grzybni, którzy z nie " +"ważne jakich powodów źle im życzą. Zaadaptowaliśmy się by lepiej wypełniać " +"to zadanie - nasze włókna będą silnie i odporne, gdy pojawią się takie " +"zagrożenia." #: lang/json/mutation_from_json.py msgid "Bird Wings" @@ -90868,7 +91168,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Rodent Ears" -msgstr "" +msgstr "Uszy Gryzonia" #. ~ Description for Rodent Ears #: lang/json/mutation_from_json.py @@ -90876,6 +91176,8 @@ msgid "" "Your ears are huge, round, and gray! They're rather fascinating, and help " "you hear from a much greater distance." msgstr "" +"Twoje uszy są duże, okrągłe i szare! Są dość fascynujące i pomagają ci " +"słyszeć z o wiele większej odległości" #: lang/json/mutation_from_json.py msgid "Web Walker" @@ -91273,7 +91575,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Little" -msgstr "" +msgstr "Mały" #. ~ Description for Little #: lang/json/mutation_from_json.py @@ -91281,10 +91583,12 @@ msgid "" "You've noticeably shrunk in size. You're able to move with increased " "litheness, but your smaller stature prevents you from carrying as much." msgstr "" +"Masz znacząco mniejszy rozmiar. Jesteś w stanie poruszać się ze zwiększoną " +"giętkością, ale twoja mniejsza postawa uniemożliwia ci dźwiganie tyle." #: lang/json/mutation_from_json.py msgid "Tiny" -msgstr "" +msgstr "Malutki" #. ~ Description for Tiny #: lang/json/mutation_from_json.py @@ -91295,10 +91599,15 @@ msgid "" "reduced. However, your movement is silent, and your dodge skill is a little " "higher." msgstr "" +"Masz tylko połowę wysokości niż wcześniej! Ciężar rzeczy, które kiedyś można" +" było łatwo nosić, jest teraz nie do zniesienia, ubrania są teraz dwa razy " +"bardziej obciążające (ponieważ jesteś w połowie wielkości), a twoje punkty " +"żywotności są znacznie zmniejszone. Jednak twój ruch jest cichy, a twoja " +"umiejętność unikania jest trochę wyższa." #: lang/json/mutation_from_json.py msgid "Unassuming" -msgstr "" +msgstr "Skromny" #. ~ Description for Unassuming #: lang/json/mutation_from_json.py @@ -91307,10 +91616,14 @@ msgid "" " are reduced, and you've learned to use your increased nimbleness to offset " "your reduced capacity to absorb damage." msgstr "" +"Udało ci się opanować swoją maleńką formę! Zmniejszają się obciążenia i kary" +" związane z obciążeniem przedmiotów, a także uczysz się wykorzystywać swoją " +"zwiększoną zwrotność, aby zrównoważyć zmniejszoną zdolność do absorbowania " +"obrażeń." #: lang/json/mutation_from_json.py msgid "Crafty" -msgstr "" +msgstr "Podstępny" #. ~ Description for Crafty #: lang/json/mutation_from_json.py @@ -91318,6 +91631,9 @@ msgid "" "By making the most of your small stature, you can avoid the notice of all " "but the most perceptive creatures, and your speed is greatly increased." msgstr "" +"Wykorzystując w pełni swój mały wzrost, możesz uniknąć zwracania uwagi " +"wszystkich, poza najbardziej spostrzegawczych stworzeń, a twoja szybkość " +"jest znacznie większa." #: lang/json/mutation_from_json.py msgid "Metallassomaiphile" @@ -91617,7 +91933,7 @@ msgstr "%1$s gryzie %2$s" #: lang/json/mutation_from_json.py msgid "Rodent Muzzle" -msgstr "" +msgstr "Gryzoni Pysk" #. ~ Description for Rodent Muzzle #: lang/json/mutation_from_json.py @@ -91797,7 +92113,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Metabolic Rehydration" -msgstr "" +msgstr "Metaboliczne nawodnienie" #. ~ Description for Metabolic Rehydration #: lang/json/mutation_from_json.py @@ -91805,6 +92121,8 @@ msgid "" "Your body gets all the hydration it needs from the food that you eat! You " "no longer need to drink water." msgstr "" +"Twoje ciało otrzymuje całe nawodnienie jakie potrzebuje z jedzenia które " +"jesz! Nie musisz już pić wody." #: lang/json/mutation_from_json.py msgid "Very Heavy Sleeper" @@ -92848,14 +93166,14 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Diminutive" -msgstr "" +msgstr "Lilipuci" #. ~ Description for Diminutive #: lang/json/mutation_from_json.py msgid "" "So much food, everywhere! And nobody's even guarding it anymore! These are" " good times." -msgstr "" +msgstr "Tyle jedzenia, wszędzie! I nikt już go nie strzeże! To dobre czasy." #: lang/json/mutation_from_json.py msgid "Marloss Gateway" @@ -92872,12 +93190,12 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Mycus" -msgstr "Mykus" +msgstr "Grzybnia" #. ~ Description for Mycus #: lang/json/mutation_from_json.py src/iuse.cpp msgid "We are the Mycus." -msgstr "Jesteśmy Mykus." +msgstr "Jesteśmy Grzybnią." #: lang/json/mutation_from_json.py msgid "Acidproof" @@ -92905,7 +93223,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Pyromaniac" -msgstr "" +msgstr "Piromaniak" #. ~ Description for Pyromaniac #: lang/json/mutation_from_json.py @@ -92914,6 +93232,9 @@ msgid "" "light them every now and then or stand near them often. However, you gain a" " mood bonus from doing so." msgstr "" +"Masz niezdrową obsesję na punkcie ognia i denerwujesz się, jeśli nie " +"zapalasz ich od czasu do czasu lub często się do nich nie zbliżasz. " +"Zyskujesz jednak premię do nastroju jeśli będziesz to robić." #: lang/json/mutation_from_json.py msgid "Police Officer" @@ -93073,7 +93394,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Autodoc Specialist" -msgstr "" +msgstr "Specjalista Autodoka" #. ~ Description for Autodoc Specialist #: lang/json/mutation_from_json.py @@ -93082,10 +93403,13 @@ msgid "" "for surgical procedures. Operations involving it will be moderately more " "likely to succeed." msgstr "" +"Posiadasz szkolenie z prawidłowego działania Autodoka, zaawansowanej maszyny" +" stosowanej do zabiegów chirurgicznych. Operacje z nim związane będą miały " +"umiarkowanie większą szansę na powodzenie." #: lang/json/mutation_from_json.py msgid "Dungeon Master" -msgstr "" +msgstr "Mistrz Lochów" #. ~ Description for Dungeon Master #: lang/json/mutation_from_json.py @@ -93095,6 +93419,10 @@ msgid "" "slightly faster, and suffer no reading time penalty for books too complex " "for you to easily understand." msgstr "" +"Tygodnie spędzone na przeglądaniu podręczników i badaniu tematów na których " +"się nie znasz nauczyły cię szybszego znajdywania tego, czego potrzebujesz. " +"Czytasz nieco szybciej i nie ponosisz kary za czytanie książek zbyt " +"skompilowanych dla ciebie by je zrozumieć." #: lang/json/mutation_from_json.py msgid "Carries Brandy" @@ -93257,16 +93585,16 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Debug Bionic Installation" -msgstr "" +msgstr "Debugowanie Instalacji Bionicznej" #. ~ Description for Debug Bionic Installation #: lang/json/mutation_from_json.py msgid "Lets you instantly install torsion ratchets for your eight legs." -msgstr "" +msgstr "Pozwala ci natychmiast zainstalować przekładnie zębate dla ośmiu nóg." #: lang/json/mutation_from_json.py msgid "Debug Bionic Power" -msgstr "" +msgstr "Debugowanie Mocy Bionicznej" #. ~ Description for Debug Bionic Power #: lang/json/mutation_from_json.py @@ -93274,6 +93602,8 @@ msgid "" "For fueling your inner cybug. Activate to increase power capacity by 100 " "(can be repeated.)" msgstr "" +"Do napędzania twojego wewnętrznego cybuga. Aktywuj, aby zwiększyć moc o 100 " +"(może być powtórzone)." #: lang/json/mutation_from_json.py msgid "Squeamish" @@ -93807,7 +94137,7 @@ msgstr "Bandyta" #: lang/json/npc_from_json.py msgid "Psycho" -msgstr "" +msgstr "Psycho" #: lang/json/npc_from_json.py msgid "Raider" @@ -93886,7 +94216,7 @@ msgstr "dom" #: lang/json/overmap_terrain_from_json.py msgid "duplex" -msgstr "" +msgstr "bliźniak" #: lang/json/overmap_terrain_from_json.py msgid "parking lot" @@ -94549,6 +94879,10 @@ msgstr "łaźnia publiczna" msgid "roadside foodcart" msgstr "przydrożne stoisko z żywnością" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "garaż - stacja paliw" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "cmentarz wyznaniowy" @@ -94716,116 +95050,116 @@ msgstr "kuźnia z warsztatem" #: lang/json/overmap_terrain_from_json.py msgid "dumpsite" -msgstr "" +msgstr "wysypisko" #: lang/json/overmap_terrain_from_json.py msgid "dump" -msgstr "" +msgstr "wysyp" #: lang/json/overmap_terrain_from_json.py msgid "recycle center" -msgstr "" +msgstr "centrum recyklingu" #: lang/json/overmap_terrain_from_json.py msgid "landfill" -msgstr "" +msgstr "składowisko odpadów" #: lang/json/overmap_terrain_from_json.py msgid "junkyard" -msgstr "" +msgstr "złomowisko" #: lang/json/overmap_terrain_from_json.py msgid "nature trail" -msgstr "" +msgstr "naturalny szlak" #: lang/json/overmap_terrain_from_json.py msgid "public pond" -msgstr "" +msgstr "publiczny staw" #: lang/json/overmap_terrain_from_json.py msgid "cemetery" -msgstr "" +msgstr "cmentarz" #: lang/json/overmap_terrain_from_json.py msgid "community garden" -msgstr "" +msgstr "ogrody działkowe" #: lang/json/overmap_terrain_from_json.py msgid "public garden" -msgstr "" +msgstr "publiczny ogród" #: lang/json/overmap_terrain_from_json.py msgid "botanical garden" -msgstr "" +msgstr "ogród botaniczny" #: lang/json/overmap_terrain_from_json.py msgid "tree farm" -msgstr "" +msgstr "szkółka leśna" #: lang/json/overmap_terrain_from_json.py msgid "dirt road" -msgstr "" +msgstr "droga polna" #: lang/json/overmap_terrain_from_json.py msgid "rural house" -msgstr "" +msgstr "dom wiejski" #: lang/json/overmap_terrain_from_json.py msgid "moonshine still" -msgstr "" +msgstr "bimbrownia" #: lang/json/overmap_terrain_from_json.py msgid "shooting range" -msgstr "" +msgstr "strzelnica" #: lang/json/overmap_terrain_from_json.py #: lang/json/start_location_from_json.py msgid "campground" -msgstr "" +msgstr "obozowisko" #: lang/json/overmap_terrain_from_json.py msgid "desolate barn" -msgstr "" +msgstr "opuszczona stodoła" #: lang/json/overmap_terrain_from_json.py msgid "empty commercial lot" -msgstr "" +msgstr "pusta działka handlowa" #: lang/json/overmap_terrain_from_json.py msgid "empty residential lot" -msgstr "" +msgstr "pusta działka mieszkalna" #: lang/json/overmap_terrain_from_json.py msgid "abandoned warehouse" -msgstr "" +msgstr "opuszczony magazyn" #: lang/json/overmap_terrain_from_json.py msgid "dollar store" -msgstr "" +msgstr "sklep \"wszystko za dolara\"" #: lang/json/overmap_terrain_from_json.py msgid "LAN center" -msgstr "" +msgstr "Centrum LAN" #: lang/json/overmap_terrain_from_json.py msgid "landscaping supply co" -msgstr "" +msgstr "spółka zaopatrzenia krajobrazu" #: lang/json/overmap_terrain_from_json.py msgid "golf course" -msgstr "" +msgstr "pole golfowe" #: lang/json/overmap_terrain_from_json.py msgid "golf course parking lot" -msgstr "" +msgstr "parking pola golfowego" #: lang/json/overmap_terrain_from_json.py msgid "golf course service building" -msgstr "" +msgstr "budynek serwisowy pola golfowego" #: lang/json/overmap_terrain_from_json.py msgid "veterans of foreign wars" -msgstr "" +msgstr "weteranie wojen zagranicznych" #: lang/json/overmap_terrain_from_json.py msgid "thrift store" @@ -94861,91 +95195,91 @@ msgstr "parking w strefie wypoczynku" #: lang/json/overmap_terrain_from_json.py msgid "zoo parking" -msgstr "" +msgstr "parking zoo" #: lang/json/overmap_terrain_from_json.py msgid "zoo pavilion" -msgstr "" +msgstr "pawilon zoo" #: lang/json/overmap_terrain_from_json.py msgid "zoo" -msgstr "" +msgstr "zoo" #: lang/json/overmap_terrain_from_json.py msgid "stadium parking" -msgstr "" +msgstr "parking stadionu" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" -msgstr "" +msgid "stadium" +msgstr "stadion" #: lang/json/overmap_terrain_from_json.py msgid "stadium entrance" -msgstr "" +msgstr "wejście stadionu" #: lang/json/overmap_terrain_from_json.py msgid "stadium field" -msgstr "" +msgstr "pole stadionu" #: lang/json/overmap_terrain_from_json.py msgid "stadium garage" -msgstr "" +msgstr "garaż stadionu" #: lang/json/overmap_terrain_from_json.py msgid "stadium bar" -msgstr "" +msgstr "bar stadionu" #: lang/json/overmap_terrain_from_json.py msgid "Head Shop" -msgstr "" +msgstr "Sklep z Używkami" #: lang/json/overmap_terrain_from_json.py msgid "Natural Spring" -msgstr "" +msgstr "Naturalne Źródełko" #: lang/json/overmap_terrain_from_json.py msgid "movie theater" -msgstr "" +msgstr "kino" #: lang/json/overmap_terrain_from_json.py msgid "movie theater entrance" -msgstr "" +msgstr "wejście do kina" #: lang/json/overmap_terrain_from_json.py msgid "paintball field" -msgstr "" +msgstr "pole do paintballa" #: lang/json/overmap_terrain_from_json.py msgid "smoking lounge" -msgstr "" +msgstr "palarnia" #: lang/json/overmap_terrain_from_json.py msgid "music venue" -msgstr "" +msgstr "miejsce muzyczne" #: lang/json/overmap_terrain_from_json.py msgid "gambling hall" -msgstr "" +msgstr "sala gier hazardowych" #: lang/json/overmap_terrain_from_json.py msgid "homeless camp" -msgstr "" +msgstr "obozowisko bezdomnych" #: lang/json/overmap_terrain_from_json.py msgid "small scrap yard" -msgstr "" +msgstr "małe złomowisko" #: lang/json/overmap_terrain_from_json.py msgid "strip club" -msgstr "" +msgstr "klub ze striptizem" #: lang/json/overmap_terrain_from_json.py msgid "trailer park" -msgstr "" +msgstr "park przyczep" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" -msgstr "" +msgid "mass grave" +msgstr "masowy grób" #: lang/json/overmap_terrain_from_json.py msgid "abandoned drive-through" @@ -94953,11 +95287,11 @@ msgstr "opuszczony bar dla zmotoryzowanych" #: lang/json/overmap_terrain_from_json.py msgid "animal pound" -msgstr "" +msgstr "staw zwierzęcy" #: lang/json/overmap_terrain_from_json.py msgid "animal shelter" -msgstr "" +msgstr "schronisko dla zwierząt" #: lang/json/overmap_terrain_from_json.py msgid "antique store" @@ -95024,12 +95358,12 @@ msgid "Bankrupt Pizzeria" msgstr "Zbankrutowana Pizzeria" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" -msgstr "" +msgid "boat rental" +msgstr "wypożyczalnia łodzi" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" -msgstr "" +msgid "riverside dwelling" +msgstr "mieszkanie nad rzeką" #: lang/json/overmap_terrain_from_json.py msgid "municipal reactor" @@ -95234,15 +95568,23 @@ msgstr "podstacja elektryczna" #: lang/json/overmap_terrain_from_json.py msgid "animal clinic" -msgstr "" +msgstr "przychodnia dla zwierząt" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" -msgstr "" +msgid "war memorial" +msgstr "pomnik wojenny" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" -msgstr "" +msgid "ruined cabin - barn" +msgstr "zrujnowana chatka - stodoła" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "zrujnowana chatka - kącik samochodowy" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" +msgstr "ruined cabin - plac polny" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -96605,7 +96947,7 @@ msgid "" " meaning of \"fast\" food by running for your life." msgstr "" "Jeszcze przed tygodniem pracowałeś w wymyślnej sieciówce z szybkim żarciem, " -"a teraz znaczenie 'szybkiego żarcia' pokazujesz uciekając przed śmiercią." +"a teraz znaczenie \"szybkiego\" żarcia pokazujesz uciekając przed śmiercią." #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -96620,7 +96962,7 @@ msgid "" " meaning of \"fast\" food by running for your life." msgstr "" "Jeszcze przed tygodniem pracowałaś w wymyślnej sieciówce z szybkim żarciem, " -"a teraz znaczenie 'szybkiego żarcia' pokazujesz uciekając przed śmiercią." +"a teraz znaczenie \"szybkiego\" żarcia pokazujesz uciekając przed śmiercią." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -99540,7 +99882,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Game Master" -msgstr "" +msgstr "Mistrz Gry" #. ~ Profession (male Game Master) description #: lang/json/professions_from_json.py @@ -99551,11 +99893,16 @@ msgid "" "that reason, when you had two no-shows and the other two tried to eat you, " "you ditched. Maybe you can find some new players in the ruins of the world." msgstr "" +"Próbując zaganiać koty do jednego miejsca każdego tygodnia nauczyło cię " +"czegoś: zazwyczaj lepiej jest ograniczać straty i ufać swoim zmysłom. " +"Dlatego, jeśli dwa razy nikt nie przyszedł a kolejnych dwóch chciało cię " +"zjeść, dałeś sobie siana. Może znajdziesz nowych graczy w zgliszczach nowego" +" świata." #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Game Master" -msgstr "" +msgstr "Mistrz Gry" #. ~ Profession (female Game Master) description #: lang/json/professions_from_json.py @@ -99566,11 +99913,16 @@ msgid "" "that reason, when you had two no-shows and the other two tried to eat you, " "you ditched. Maybe you can find some new players in the ruins of the world." msgstr "" +"Próbując zaganiać koty do jednego miejsca każdego tygodnia nauczyło cię " +"czegoś: zazwyczaj lepiej jest ograniczać straty i ufać swoim zmysłom. " +"Dlatego, jeśli dwa razy nikt nie przyszedł a kolejnych dwóch chciało cię " +"zjeść, dałaś sobie siana. Może znajdziesz nowych graczy w zgliszczach nowego" +" świata." #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Bionic Game Master" -msgstr "" +msgstr "Bioniczny Mistrz Gry" #. ~ Profession (male Bionic Game Master) description #: lang/json/professions_from_json.py @@ -99582,11 +99934,16 @@ msgid "" "smarter, and memorized the entire handbook. Let's hope that knowledge helps " "you now." msgstr "" +"Doszedłeś do dużego majątku, poprzez szczęście lub spadek, i prowadziłeś gry" +" dla ludzi którzy większość świata znali tylko z widzenia. Mogłeś sobie " +"pozwolić żeby rozpieścić twoich graczy i to właśnie zrobiłeś. Zainwestowałeś" +" w bionikę żeby uczynić cię bystrzejszym i zapamiętałeś cały podręcznik. " +"Miejmy nadzieję, że wiedza teraz ci się przyda." #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Bionic Game Master" -msgstr "" +msgstr "Bioniczny Mistrz Gry" #. ~ Profession (female Bionic Game Master) description #: lang/json/professions_from_json.py @@ -99598,11 +99955,16 @@ msgid "" "smarter, and memorized the entire handbook. Let's hope that knowledge helps " "you now." msgstr "" +"Doszłaś do dużego majątku, poprzez szczęście lub spadek, i prowadziłaś gry " +"dla ludzi którzy większość świata znali tylko z widzenia. Mogłaś sobie " +"pozwolić żeby rozpieścić twoich graczy i to właśnie zrobiłaś. Zainwestowałaś" +" w bionikę żeby uczynić cię bystrzejszym i zapamiętałaś cały podręcznik. " +"Miejmy nadzieję, że wiedza teraz ci się przyda." #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Zoo Keeper" -msgstr "" +msgstr "Opiekun Zoo" #. ~ Profession (male Zoo Keeper) description #: lang/json/professions_from_json.py @@ -99611,11 +99973,14 @@ msgid "" "You were called in on your day off to feed the animals at the zoo because " "none of your coworkers showed up for work for one reason or another." msgstr "" +"Byłeś wezwany jak miałeś dzień wolny by nakarmić zwierzęta w zoo, ponieważ " +"żaden z twoich współpracowników nie pojawił w pracy się z tych czy innych " +"powodów." #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Zoo Keeper" -msgstr "" +msgstr "Opiekunka Zoo" #. ~ Profession (female Zoo Keeper) description #: lang/json/professions_from_json.py @@ -99624,6 +99989,9 @@ msgid "" "You were called in on your day off to feed the animals at the zoo because " "none of your coworkers showed up for work for one reason or another." msgstr "" +"Byłaś wezwana jak miałaś dzień wolny by nakarmić zwierzęta w zoo, ponieważ " +"żaden z twoich współpracowników nie pojawił w pracy się z tych czy innych " +"powodów." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -99637,6 +100005,8 @@ msgid "" "You decided to get away from the family for the day to do a little golfing " "by yourself." msgstr "" +"Zdecydowałeś, by wyjechać od rodziny na cały dzień by samemu pograć trochę w" +" golfa." #: lang/json/professions_from_json.py msgctxt "profession_female" @@ -99650,6 +100020,8 @@ msgid "" "You decided to get away from the family for the day to do a little golfing " "by yourself." msgstr "" +"Zdecydowałaś, by wyjechać od rodziny na cały dzień by samej pograć trochę w " +"golfa." #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -100640,7 +101012,7 @@ msgstr "" #: lang/json/professions_from_json.py msgctxt "profession_male" msgid "Bionic Gangster" -msgstr "" +msgstr "Bioniczny Gangster" #. ~ Profession (male Bionic Gangster) description #: lang/json/professions_from_json.py @@ -100652,11 +101024,16 @@ msgid "" " job. After enjoying some period of freedom to do as you wanted, now you " "find yourself needing those skills to survive. " msgstr "" +"Byłeś ulubieńcem szefa, ich protegowanym; zawsze liczyli na ciebie przy " +"najtrudniejszych robotach. Widząc twój potencjał zainwestowali w " +"\"podstawowe\" ulepszenia i najlepszy sprzęt na rynku by lepiej wspomagał " +"cię w robocie. Po tym jak cieszyłeś się pewnym okresem swobody robiąc to co " +"chcesz, teraz będziesz potrzebować tych umiejętności by przetrwać." #: lang/json/professions_from_json.py msgctxt "profession_female" msgid "Bionic Gangster" -msgstr "" +msgstr "Bioniczny Gangster" #. ~ Profession (female Bionic Gangster) description #: lang/json/professions_from_json.py @@ -100668,6 +101045,11 @@ msgid "" " job. After enjoying some period of freedom to do as you wanted, now you " "find yourself needing those skills to survive. " msgstr "" +"Byłaś ulubieńcem szefa, ich protegowaną; zawsze liczyli na ciebie przy " +"najtrudniejszych robotach. Widząc twój potencjał zainwestowali w " +"\"podstawowe\" ulepszenia i najlepszy sprzęt na rynku by lepiej wspomagał " +"cię w robocie. Po tym jak cieszyłaś się pewnym okresem swobody robiąc to co " +"chcesz, teraz będziesz potrzebować tych umiejętności by przetrwać." #. ~ Crafting recipes category name #: lang/json/recipe_category_from_json.py @@ -100870,17 +101252,17 @@ msgstr "POJAZDY" #. ~ Crafting recipes category name #: lang/json/recipe_category_from_json.py msgid "BUILDING" -msgstr "" +msgstr "BUDOWLA" #. ~ Crafting recipes subcategory of 'BUILDING' category #: lang/json/recipe_category_from_json.py msgid "BASES" -msgstr "" +msgstr "BAZY" #. ~ Crafting recipes subcategory of 'BUILDING' category #: lang/json/recipe_category_from_json.py msgid "EXPANSIONS" -msgstr "" +msgstr "ROZBUDOWY" #: lang/json/recipe_from_json.py msgid "Stuff THE MAN doesn't want you to know" @@ -101144,7 +101526,7 @@ msgstr "" #: lang/json/recipe_group_from_json.py msgid "Farm" -msgstr "" +msgstr "Farma" #: lang/json/recipe_group_from_json.py lang/json/start_location_from_json.py msgid "Garage" @@ -101152,11 +101534,11 @@ msgstr "Garaż" #: lang/json/recipe_group_from_json.py msgid "Kitchen" -msgstr "" +msgstr "Kuchnia" #: lang/json/recipe_group_from_json.py msgid "Blacksmith Shop" -msgstr "" +msgstr "Kuźnia z Warsztatem" #: lang/json/recipe_group_from_json.py msgid " Cook: Meat, Cooked" @@ -106187,7 +106569,7 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "\"mycus must grow\"" -msgstr "" +msgstr "\"grzybnia musi rosnąć\"" #: lang/json/snippet_from_json.py msgid "" @@ -106208,6 +106590,8 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "\"red blue yellow berry seed sap bloom flowers tower mycus mycus mycus.\"" msgstr "" +"\"czerwona niebieska żółta jagoda nasiona sok rozkwit kwiaty grzybnia " +"grzybnia grzybnia\"" #: lang/json/snippet_from_json.py msgid "" @@ -106994,27 +107378,27 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "You feel cold. You need the warmth of a fire." -msgstr "" +msgstr "Zimno ci. Potrzebujesz ciepła ognia." #: lang/json/snippet_from_json.py msgid "Maybe a fire could calm your nerves?" -msgstr "" +msgstr "Może ogień mógłby cię uspokoić?" #: lang/json/snippet_from_json.py msgid "You need to ignite something." -msgstr "" +msgstr "Musisz coś podpalić." #: lang/json/snippet_from_json.py msgid "You daydream of crackling fire..." -msgstr "" +msgstr "Marzysz o iskrzącym ogniu..." #: lang/json/snippet_from_json.py msgid "You shiver. A fire would be great right now." -msgstr "" +msgstr "Drżysz. Ogień byłby teraz świetny." #: lang/json/snippet_from_json.py msgid "You think of randomly lighting a fire, but decide against it." -msgstr "" +msgstr "Myślisz, żeby coś losowo podpalić, ale decydujesz się tego nie robić." #: lang/json/snippet_from_json.py msgid "This is a test of the sign snippet system" @@ -107046,7 +107430,7 @@ msgid "" "Ever run into those big worm things? If you see trails of churned-up dirt, " "you can be sure they're around." msgstr "" -"Wpadłeś kiedyś na takiego wielkiego robala? Jak widzisz ścieżkę wzruszonej " +"Wpadłeś kiedyś na takiego wielkiego robala? Jak widzisz ścieżkę rozrytej " "ziemi, to bądź pewien że są w pobliżu." #: lang/json/snippet_from_json.py @@ -107799,155 +108183,155 @@ msgstr " " #: lang/json/snippet_from_json.py msgid "asshat" -msgstr "" +msgstr "matole" #: lang/json/snippet_from_json.py msgid "asswipe" -msgstr "" +msgstr "przygłupie" #: lang/json/snippet_from_json.py msgid "bag of shit" -msgstr "" +msgstr "kupo gówna" #: lang/json/snippet_from_json.py msgid "bastard" -msgstr "" +msgstr "draniu" #: lang/json/snippet_from_json.py msgid "blockhead" -msgstr "" +msgstr "bałwanie" #: lang/json/snippet_from_json.py msgid "chump" -msgstr "" +msgstr "pało" #: lang/json/snippet_from_json.py msgid "clown" -msgstr "" +msgstr "klaunie" #: lang/json/snippet_from_json.py msgid "cretin" -msgstr "" +msgstr "kretynie" #: lang/json/snippet_from_json.py msgid "degenerate" -msgstr "" +msgstr "degenracie" #: lang/json/snippet_from_json.py msgid "dick" -msgstr "" +msgstr "fiucie" #: lang/json/snippet_from_json.py msgid "dipshit" -msgstr "" +msgstr "łajzo" #: lang/json/snippet_from_json.py msgid "douchebag" -msgstr "" +msgstr "sukinkocie" #: lang/json/snippet_from_json.py msgid "dumbass" -msgstr "" +msgstr "gnoju" #: lang/json/snippet_from_json.py msgid "dumb " -msgstr "" +msgstr "durny " #: lang/json/snippet_from_json.py msgid "fool" -msgstr "" +msgstr "głupcze" #: lang/json/snippet_from_json.py msgid "freak" -msgstr "" +msgstr "dziwolągu" #: lang/json/snippet_from_json.py msgid "goon" -msgstr "" +msgstr "dziwko" #: lang/json/snippet_from_json.py msgid "half-eaten " -msgstr "" +msgstr "wpół zjedzony " #: lang/json/snippet_from_json.py msgid "idiot" -msgstr "" +msgstr "idioto" #: lang/json/snippet_from_json.py msgid "imbecile" -msgstr "" +msgstr "imbecylu" #: lang/json/snippet_from_json.py msgid "jackass" -msgstr "" +msgstr "kutasie" #: lang/json/snippet_from_json.py msgid "moron" -msgstr "" +msgstr "debilu" #: lang/json/snippet_from_json.py msgid "nitwit" -msgstr "" +msgstr "przygłupie" #: lang/json/snippet_from_json.py msgid "piece of an ass" -msgstr "" +msgstr "pierdoło" #: lang/json/snippet_from_json.py msgid "piece of shit" -msgstr "" +msgstr "gnoju" #: lang/json/snippet_from_json.py msgid "punk" -msgstr "punku" +msgstr "mendo" #: lang/json/snippet_from_json.py msgid "scumbag" -msgstr "" +msgstr "śmieciu" #: lang/json/snippet_from_json.py msgid "shit-brained " -msgstr "" +msgstr "debilny " #: lang/json/snippet_from_json.py msgid "shit-eater" -msgstr "" +msgstr "gównojadzie" #: lang/json/snippet_from_json.py msgid "shitass" -msgstr "" +msgstr "dupo wołowa" #: lang/json/snippet_from_json.py msgid "shitbag" -msgstr "" +msgstr "cipo" #: lang/json/snippet_from_json.py msgid "shitface" -msgstr "" +msgstr "pizdo" #: lang/json/snippet_from_json.py msgid "son of a " -msgstr "" +msgstr "skurwysynu" #: lang/json/snippet_from_json.py msgid "stinky " -msgstr "" +msgstr "śmierdzący " #: lang/json/snippet_from_json.py msgid "stupidass" -msgstr "" +msgstr "padalcu" #: lang/json/snippet_from_json.py msgid "stupid " -msgstr "" +msgstr "głupi " #: lang/json/snippet_from_json.py msgid "swine" -msgstr "" +msgstr "świnio" #: lang/json/snippet_from_json.py msgid "zombie food" -msgstr "" +msgstr "karmo dla zombie" #: lang/json/snippet_from_json.py msgid "loser" @@ -107983,27 +108367,27 @@ msgstr "skurwysynu" #: lang/json/snippet_from_json.py msgid "shithead" -msgstr "idioto" +msgstr "kurwo" #: lang/json/snippet_from_json.py msgid " if I won't get some water soon." -msgstr "" +msgstr " jeśli nie dostanę zaraz wody." #: lang/json/snippet_from_json.py msgid "Can you get me some water, ?" -msgstr "" +msgstr "Możesz dać mi trochę wody ?" #: lang/json/snippet_from_json.py msgid "Do you have something to drink, ?" -msgstr "" +msgstr "Masz coś do picia, ?" #: lang/json/snippet_from_json.py msgid "I need some water!" -msgstr "" +msgstr "Potrzebuję trochę wody!" #: lang/json/snippet_from_json.py msgid "My mouth is dry." -msgstr "" +msgstr "Moje usta są suche." #: lang/json/snippet_from_json.py msgid "When we drinkin'?" @@ -108051,7 +108435,7 @@ msgstr "Wiesz że brak wody zabija szybciej niż czegokolwiek innego?" #: lang/json/snippet_from_json.py msgid "darn" -msgstr "" +msgstr "kurde" #: lang/json/snippet_from_json.py msgid "fuck" @@ -108063,7 +108447,7 @@ msgstr "cholerną" #: lang/json/snippet_from_json.py msgid "goddamnit" -msgstr "" +msgstr "cholera" #: lang/json/snippet_from_json.py msgid "damn" @@ -108175,7 +108559,7 @@ msgstr "Cześć " #: lang/json/snippet_from_json.py msgid "never" -msgstr "" +msgstr "nigdy" #: lang/json/snippet_from_json.py msgid "no" @@ -108183,23 +108567,23 @@ msgstr "nie" #: lang/json/snippet_from_json.py msgid "not gonna happen" -msgstr "" +msgstr "nie licz na to" #: lang/json/snippet_from_json.py msgid "not happening" -msgstr "" +msgstr "nie ma mowy" #: lang/json/snippet_from_json.py msgid "over my dead body" -msgstr "" +msgstr "po moim trupie" #: lang/json/snippet_from_json.py msgid "when pigs fly" -msgstr "" +msgstr "jak świnie będą latać" #: lang/json/snippet_from_json.py msgid "won't happen" -msgstr "" +msgstr "nie ma mowy" #: lang/json/snippet_from_json.py msgid "fuck no" @@ -108207,7 +108591,7 @@ msgstr "kurwa nie" #: lang/json/snippet_from_json.py msgid "hell no" -msgstr "nie do diabła" +msgstr "nie, do diabła" #: lang/json/snippet_from_json.py msgid "no way" @@ -108239,11 +108623,11 @@ msgstr "akurat" #: lang/json/snippet_from_json.py msgid "Goodbye, !" -msgstr "" +msgstr "Żegnaj, !" #: lang/json/snippet_from_json.py msgid "I'm leaving." -msgstr "" +msgstr "Idę sobie." #: lang/json/snippet_from_json.py msgid "So long, !" @@ -108263,15 +108647,15 @@ msgstr "Baj baj, !" #: lang/json/snippet_from_json.py msgid "consider yourself dead" -msgstr "" +msgstr "już nie żyjesz" #: lang/json/snippet_from_json.py msgid "I'll destroy you" -msgstr "" +msgstr "zniszczę cię" #: lang/json/snippet_from_json.py msgid "I'll kick your ass" -msgstr "" +msgstr "skopię twój tyłek" #: lang/json/snippet_from_json.py msgid "I'll kill you" @@ -108279,15 +108663,15 @@ msgstr "zabiję cię" #: lang/json/snippet_from_json.py msgid "I'll send you to hell" -msgstr "" +msgstr "poślę cię do diabła" #: lang/json/snippet_from_json.py msgid "I'm gonna kick your ass" -msgstr "" +msgstr "skopię ci tyłek" #: lang/json/snippet_from_json.py msgid "you won't make it out alive" -msgstr "" +msgstr "nie wyjdziesz stąd żywo" #: lang/json/snippet_from_json.py msgid "you're dead" @@ -108363,7 +108747,7 @@ msgstr "moje dni są policzone" #: lang/json/snippet_from_json.py msgid "Can you wait?" -msgstr "" +msgstr "Możesz poczekać?" #: lang/json/snippet_from_json.py msgid "Hey, where are you?" @@ -108371,7 +108755,7 @@ msgstr "Hej, gdzie jesteś?" #: lang/json/snippet_from_json.py msgid "Wait!" -msgstr "" +msgstr "Czekaj!" #: lang/json/snippet_from_json.py msgid "Wait up, !" @@ -108455,15 +108839,15 @@ msgstr "amigo" #: lang/json/snippet_from_json.py msgid "comrade" -msgstr "" +msgstr "kamracie" #: lang/json/snippet_from_json.py msgid "fellow" -msgstr "" +msgstr "towarzyszu" #: lang/json/snippet_from_json.py msgid "lad" -msgstr "" +msgstr "chłopie" #: lang/json/snippet_from_json.py msgid "mate" @@ -108471,11 +108855,11 @@ msgstr "koleżko" #: lang/json/snippet_from_json.py msgid "nomad" -msgstr "" +msgstr "nomadzie" #: lang/json/snippet_from_json.py msgid "partner" -msgstr "" +msgstr "partnerze" #: lang/json/snippet_from_json.py msgid "stranger" @@ -108483,7 +108867,7 @@ msgstr "nieznajomy" #: lang/json/snippet_from_json.py msgid "survivor" -msgstr "" +msgstr "ocalony" #: lang/json/snippet_from_json.py msgid "friend" @@ -108531,39 +108915,39 @@ msgstr "Chodź tu!" #: lang/json/snippet_from_json.py msgid "Get over here, !" -msgstr "" +msgstr "Chodź tu, !" #: lang/json/snippet_from_json.py msgid "Keep close, !" -msgstr "" +msgstr "Trzymaj się blisko, !" #: lang/json/snippet_from_json.py msgid "Keep it moving, !" -msgstr "" +msgstr "Ruchy, !" #: lang/json/snippet_from_json.py msgid "Keep up, !" -msgstr "" +msgstr "Chodź za mną, !" #: lang/json/snippet_from_json.py msgid "Let's keep going, !" -msgstr "" +msgstr "Chodźmy, !" #: lang/json/snippet_from_json.py msgid "Over here!" -msgstr "" +msgstr "Tutaj!" #: lang/json/snippet_from_json.py msgid "Over here, !" -msgstr "" +msgstr "Tutaj, !" #: lang/json/snippet_from_json.py msgid "Stay close, !" -msgstr "" +msgstr "Trzymaj się blisko, !" #: lang/json/snippet_from_json.py msgid "Stay with me, !" -msgstr "" +msgstr "Trzymaj się mnie, !" #: lang/json/snippet_from_json.py msgid "Catch up, !" @@ -108599,7 +108983,7 @@ msgstr "Ruszajmy dalej!" #: lang/json/snippet_from_json.py msgid "I can barely keep my eyes open." -msgstr "" +msgstr "Ledwo mogę trzymać oczy otwarte." #: lang/json/snippet_from_json.py msgid "When we sleepin'?" @@ -108607,7 +108991,7 @@ msgstr "Kiedy idziemy spać?" #: lang/json/snippet_from_json.py msgid "*Yawn*" -msgstr "*ziew*" +msgstr "*Ziew*" #: lang/json/snippet_from_json.py msgid "What time is it?" @@ -108647,23 +109031,23 @@ msgstr "Po prostu pójdę spać, ?" #: lang/json/snippet_from_json.py msgid "extremely" -msgstr "" +msgstr "ekstremalnie" #: lang/json/snippet_from_json.py msgid "greatly" -msgstr "" +msgstr "wielce" #: lang/json/snippet_from_json.py msgid "highly" -msgstr "" +msgstr "mocno" #: lang/json/snippet_from_json.py msgid "incredibly" -msgstr "" +msgstr "niewiarygodnie" #: lang/json/snippet_from_json.py msgid "quite" -msgstr "" +msgstr "dość" #: lang/json/snippet_from_json.py msgid "really" @@ -108671,7 +109055,7 @@ msgstr "naprawdę" #: lang/json/snippet_from_json.py msgid "utterly" -msgstr "" +msgstr "całkiem" #: lang/json/snippet_from_json.py msgid "fucking" @@ -108751,7 +109135,7 @@ msgstr "to jasne" #: lang/json/snippet_from_json.py msgid "seriously" -msgstr "" +msgstr "seryjnie" #: lang/json/snippet_from_json.py msgid "absolutely" @@ -108803,7 +109187,7 @@ msgstr "Przepuść mnie, ?" #: lang/json/snippet_from_json.py msgid "Step aside, !" -msgstr "" +msgstr "Odsuń się, !" #: lang/json/snippet_from_json.py msgid "Can I get past you, ?" @@ -108859,11 +109243,11 @@ msgstr "Dzięki, !" #: lang/json/snippet_from_json.py msgid "content" -msgstr "" +msgstr "radosny" #: lang/json/snippet_from_json.py msgid "glad" -msgstr "Zzadowolony" +msgstr "zadowolony" #: lang/json/snippet_from_json.py msgid "happy" @@ -108875,7 +109259,7 @@ msgstr "rozradowany" #: lang/json/snippet_from_json.py msgid "pleased" -msgstr "" +msgstr "uszczęśliwiony" #: lang/json/snippet_from_json.py msgid "ecstatic" @@ -109091,7 +109475,7 @@ msgstr "Zejdź mi z linii ognia" #: lang/json/snippet_from_json.py msgid "I almost want to eat my now." -msgstr "" +msgstr "Zaraz zjem moją ." #: lang/json/snippet_from_json.py msgid "When we eatin'?" @@ -109139,11 +109523,11 @@ msgstr "Wiesz że brak pożywienia zabija szybciej niż nałogowe palenie?" #: lang/json/snippet_from_json.py msgid "fuck you" -msgstr "pieprz się" +msgstr "pierdol się" #: lang/json/snippet_from_json.py msgid "fuck off" -msgstr "odpieprz się" +msgstr "odpierdol się" #: lang/json/snippet_from_json.py msgid "go fuck yourself" @@ -109163,19 +109547,19 @@ msgstr "" #: lang/json/snippet_from_json.py msgid "Fire in the hole!" -msgstr "" +msgstr "Granat!" #: lang/json/snippet_from_json.py msgid "Get cover!" -msgstr "" +msgstr "Schowaj się!" #: lang/json/snippet_from_json.py msgid "Get down!" -msgstr "" +msgstr "Padnij!" #: lang/json/snippet_from_json.py msgid "Hit the dirt!" -msgstr "" +msgstr "Na ziemię!" #: lang/json/snippet_from_json.py msgid "This shit is gonna blow!" @@ -109249,40 +109633,42 @@ msgstr "\" noga zjedzona przez zombie robot futrzany pomóc\"" #: lang/json/snippet_from_json.py msgid "KEVIN SACRIFICING GAMEPLAY FOR REALISM? THE SHOCKING TRUTH REVEALED" -msgstr "" +msgstr "KEVIN POŚWIĘCA GAMEPLAY DLA REALIZMU? SZOKUJĄCA PRAWDA WYSZŁA NA JAW" #: lang/json/snippet_from_json.py msgid "TEN FACTS ABOUT THE NEW BIONIC SYSTEM THAT WILL SHOCK YOU" -msgstr "" +msgstr "DZIESIĘĆ FAKTÓW O NOWYM SYSTEMIE BIONICZNYM KTÓRE CIĘ ZASKOCZĄ" #: lang/json/snippet_from_json.py msgid "YOU WON'T BELIEVE WHO JUST ADDED A NEW PROFESSION" -msgstr "" +msgstr "NIE UWIERZYSZ KTO WŁAŚNIE DODAŁ NOWY ZAWÓD" #: lang/json/snippet_from_json.py msgid "" "TRIVIALIZE THE EARLY GAME WITH THIS ONE SIMPLE SPEAR WEAPON! CONTRIBUTORS " "HATE HIM" msgstr "" +"ZBAGATELIZUJ WCZESNĄ GRĘ TĄ JEDNĄ WŁÓCZNIĄ! KONTRYBUTORZY GO NIENAWIDZĄ" #: lang/json/snippet_from_json.py msgid "" "A MEDICAL MUTANT SET THEMSELVES ON FIRE - YOU WON'T BELIEVE WHAT HAPPENED " "NEXT" -msgstr "" +msgstr "MEDYCZNY MUTANT PODPALIŁ SIĘ - NIE UWIERZYSZ CO BYŁO PÓŹNIEJ" #: lang/json/snippet_from_json.py msgid "THE TRUTH ABOUT CATACLYSM'S DEVELOPMENT - AND ITS DISGUSTING SECRET" -msgstr "" +msgstr "CAŁA PRAWDA O TWORZENIU CATALYSMU I JEJ OBRZYDLIWY SEKRET" #: lang/json/snippet_from_json.py #, no-python-format msgid "IT'S TRUE - MUTAGEN IS 40% BLEACH, AND HERE'S WHY" -msgstr "" +msgstr "TO PRAWDA - MUTAGEN TO W 40% WYBIELACZ, I TU JEST DOWÓD" #: lang/json/snippet_from_json.py msgid "20 EASY WAYS TO ESCAPE A LAB - #4 WILL BLOW YOUR MIND" msgstr "" +"20 ŁATWYCH SPOSOBÓW NA UCIECZKĘ Z LABORATORIUM - #4 WPRAWI CIĘ W OSŁUPIENIE" #: lang/json/snippet_from_json.py msgid "" @@ -111219,226 +111605,228 @@ msgstr "Czy ty w ogóle mnie słuchasz?" #: lang/json/speech_from_json.py msgid "\"I've got a feeling we're not in Kansas anymore.\"" -msgstr "" +msgstr "\"Mam wrażenie, że nie jesteśmy już w Kansas.\"" #: lang/json/speech_from_json.py msgid "\"Go ahead, make my day.\"" -msgstr "" +msgstr "\"Śmiało, zrób mi frajdę.\"" #: lang/json/speech_from_json.py msgid "\"You talkin' to me?\"" -msgstr "" +msgstr "\"Do mnie mówisz?\"" #: lang/json/speech_from_json.py msgid "\"Then who the hell else are you talkin' to?\"" -msgstr "" +msgstr "\"Do kogo więc mówisz?\"" #: lang/json/speech_from_json.py msgid "\"Well I'm the only one here.\"" -msgstr "" +msgstr "\"Nikogo tu nie widzę.\"" #: lang/json/speech_from_json.py msgid "\"Who the fuck do you think you're talking to?\"" -msgstr "" +msgstr "\"Do kogo ty, kurwa, mówisz?\"" #: lang/json/speech_from_json.py msgid "\"What we've got here is failure to communicate.\"" -msgstr "" +msgstr "\"Oglądacie skutek braku porozumienia.\"" #: lang/json/speech_from_json.py msgid "\"E.T. phone home.\"" -msgstr "" +msgstr "\"E.T. dzwoni dom.\"" #: lang/json/speech_from_json.py msgid "\"I'm as mad as hell, and I'm not going to take this anymore!\"" -msgstr "" +msgstr "\"Jestem wściekły jak diabli i nie wytrzymam tego dłużej!\"" #: lang/json/speech_from_json.py msgid "\"There's no place like home.\"" -msgstr "" +msgstr "\"Wszędzie dobrze ale w domu najlepiej.\"" #: lang/json/speech_from_json.py msgid "\"Badges? We ain't got no badges!\"" -msgstr "" +msgstr "\"Odznaki? Nie nosimy odznak.\"" #: lang/json/speech_from_json.py msgid "" "\"We don't need no badges! I don't have to show you any stinking badges!\"" -msgstr "" +msgstr "\"Nie potrzebujemy ich. Nie muszę ci pokazywać żadnych odznak.\"" #: lang/json/speech_from_json.py msgid "\"I'll be back.\"" -msgstr "" +msgstr "\"Wrócę tu.\"" #: lang/json/speech_from_json.py msgid "\"I see dead people.\"" -msgstr "" +msgstr "\"Widzę martwych ludzi.\"" #: lang/json/speech_from_json.py msgid "\"It's alive! It's alive!\"" -msgstr "" +msgstr "\"To żyje! To żyje!\"" #: lang/json/speech_from_json.py msgid "\"Say hello to my little friend!\"" -msgstr "" +msgstr "\"Przywitaj się z moim małym przyjacielem!\"" #: lang/json/speech_from_json.py msgid "\"Here's Johnny!\"" -msgstr "" +msgstr "\"Oto Johnny!\"" #: lang/json/speech_from_json.py msgid "\"Open the pod bay doors, HAL.\"" -msgstr "" +msgstr "\"Otwórz właz, Hal.\"" #: lang/json/speech_from_json.py msgid "\"They may take our lives, but they'll never take our freedom!\"" -msgstr "" +msgstr "\"Mogą odebrać nam życie, ale nigdy nie odbiorą nam wolności!\"" #: lang/json/speech_from_json.py msgid "" "\"If you let my daughter go now, that'll be the end of it. I will not look " "for you, I will not pursue you.\"" msgstr "" +"\"Jeśli w tej chwili wypuścisz moją córkę, nic ci nie grozi. Nie będę cię " +"szukać. Nie będę cię ścigać.\"" #: lang/json/speech_from_json.py msgid "" "\"If you don't, I will look for you, I will find you, and I will kill you.\"" -msgstr "" +msgstr "\"Jeśli tego nie zrobisz, zacznę cię szukać. A gdy cię znajdę, zabiję.\"" #: lang/json/speech_from_json.py msgid "\"Roads? Where we're going, we don't need roads.\"" -msgstr "" +msgstr "\"Drogi? Tam, gdzie się udajemy, nie potrzebujemy dróg.\"" #: lang/json/speech_from_json.py msgid "\"Fasten your seatbelts. It's going to be a bumpy night.\"" -msgstr "" +msgstr "\"Zapnijcie pasy. Zanosi się na ciężką noc.\"" #: lang/json/speech_from_json.py msgid "" "\"You've got to ask yourself one question: 'Do I feel lucky?' Well, do ya " "punk?\"" -msgstr "" +msgstr "\"Zadaj sobie pytanie: 'Mam farta?' Więc jak, śmieciu?\"" #: lang/json/speech_from_json.py msgid "\"You had me at hello.\"" -msgstr "" +msgstr "\"Wystarczyło mi twoje 'cześć'.\"" #: lang/json/speech_from_json.py msgid "\"Houston, we have a problem.\"" -msgstr "" +msgstr "\"Houston, mamy problem.\"" #: lang/json/speech_from_json.py msgid "\"Yippie-ki-yay, motherfucker!\"" -msgstr "" +msgstr "\"Jupikajej, skurwysynu.\"" #: lang/json/speech_from_json.py msgid "\"The first rule of The Lab is: You do not talk about The Lab.\"" -msgstr "" +msgstr "\"Pierwsza zasada Laboratorium: nie rozmawiajcie o Laboratorium.\"" #: lang/json/speech_from_json.py msgid "\"Don't be afraid. It's just a big, big lap dog.\"" -msgstr "" +msgstr "\"Nie bój się, to jest tylko duży, wielki piesek salonowy.\"" #: lang/json/speech_from_json.py msgid "\"Bring me everyone.\"" -msgstr "" +msgstr "\"Ściągnij wszystkich.\"" #: lang/json/speech_from_json.py msgid "\"What do you mean everyone?\"" -msgstr "" +msgstr "\"Jak to wszystkich?\"" #: lang/json/speech_from_json.py msgid "\"EVERYONE!\"" -msgstr "" +msgstr "\"WSZYSTKICH!\"" #: lang/json/speech_from_json.py msgid "\"I'm going to make him an offer he can't refuse.\"" -msgstr "" +msgstr "\"Zamierzam złożyć mu propozycję nie do odrzucenia.\"" #: lang/json/speech_from_json.py msgid "\"This is the beginning of a beautiful friendship.\"" -msgstr "" +msgstr "\"To początek pięknej przyjaźni.\"" #: lang/json/speech_from_json.py msgid "\"You can’t handle the truth!\"" -msgstr "" +msgstr "\"Nie zniósłbyś prawdy!\"" #: lang/json/speech_from_json.py msgid "\"If you built it, he will come.\"" -msgstr "" +msgstr "\"Jeśli zbudujesz, on przyjdzie.\"" #: lang/json/speech_from_json.py msgid "\"Hasta la vista, baby.\"" -msgstr "" +msgstr "\"Hasta la vista, mały.\"" #: lang/json/speech_from_json.py msgid "\"They’re here!\"" -msgstr "" +msgstr "\"Są tutaj.\"" #: lang/json/speech_from_json.py msgid "\"Tis but a scratch!\"" -msgstr "" +msgstr "\"To tylko draśnięcie.\"" #: lang/json/speech_from_json.py msgid "\"Frankly, my dear, I don't give a damn.\"" -msgstr "" +msgstr "\"Szczerze mówiąc, moja droga, nic mnie to nie obchodzi.\"" #: lang/json/speech_from_json.py msgid "\"All work and no play makes Jack a dull boy.\"" -msgstr "" +msgstr "\"Wkurzają Jacka takie sprawy - ciągła praca, brak zabawy.\"" #: lang/json/speech_from_json.py msgid "\"Remember: all I'm offering is the truth. Nothing more.\"" -msgstr "" +msgstr "\"Pamiętaj, że mogę zaoferować ci prawdę i nic ponadto.\"" #: lang/json/speech_from_json.py msgid "\"Don't call me Shirley.\"" -msgstr "" +msgstr "\"I nie jestem Chyba.\"" #: lang/json/speech_from_json.py msgid "\"I have had it with these motherfucking snakes!\"" -msgstr "" +msgstr "\"Starczy mi pierdolonych węży w pierdolonym samolocie!\"" #: lang/json/speech_from_json.py msgid "" "\"Back up, put down the gun, and gimme some tropical flavored bubblicious.\"" -msgstr "" +msgstr "\"Cofnij się, odłóż spluwę i podaj mi paczkę gum owocowych.\"" #: lang/json/speech_from_json.py msgid "\"And some skittles.\"" -msgstr "" +msgstr "\"I landrynki.\"" #: lang/json/speech_from_json.py msgid "\"You'll shoot your eye out, kid.\"" -msgstr "" +msgstr "\"Wystrzelisz sobie oko, dzieciaku.\"" #: lang/json/speech_from_json.py msgid "\"Cocainum!\"" -msgstr "" +msgstr "\"Cocainum!\"" #: lang/json/speech_from_json.py msgid "\"I am your father.\"" -msgstr "" +msgstr "\"To ja jestem twoim Ojcem\"" #: lang/json/speech_from_json.py msgid "\"Who said that?\"" -msgstr "" +msgstr "\"Kto to powiedział?\"" #: lang/json/speech_from_json.py msgid "\"WHO THE FUCK SAID THAT?!\"" -msgstr "" +msgstr "\"Kto się odważył?\"" #: lang/json/speech_from_json.py msgid "\"Bullshit! You didn't conviced me! Show me your real war face!\"" -msgstr "" +msgstr "\"Nie przekonałeś mnie, pokaż swoją prawdziwą straszną minę!\"" #: lang/json/speech_from_json.py msgid "\"What is your major malfunction, numbnut?\"" -msgstr "" +msgstr "\"Główka nie pracuje kretynie?\"" #: lang/json/speech_from_json.py msgid "\"Leeeeeeeeeeeeeroy! Jenkins rebuild!\"" -msgstr "" +msgstr "\"Leeeeeeeeeeeeeroy! Jenkins rebuild!\"" #: lang/json/speech_from_json.py msgid "\"Activated!\"" @@ -116464,7 +116852,7 @@ msgid "" "A window with fancy curtains on the inside. This one has been blocked out " "with duct tape. You could remove the duct tape by cutting it off." msgstr "" -"Okno z gustownymi zasłonami od środka.To jest zalepione taśmą klejącą, " +"Okno z gustownymi zasłonami od środka. To jest zalepione taśmą klejącą, " "blokującą światło i widoczność. Możesz usunąć taśmę odcinając ją." #: lang/json/terrain_from_json.py @@ -117385,7 +117773,7 @@ msgstr "sterowanie windą" #: lang/json/terrain_from_json.py msgid "powerless controls" -msgstr "układ sterowniczy pozbawiony prądu" +msgstr "sterowanie niewymagające zasilania" #: lang/json/terrain_from_json.py msgid "elevator" @@ -118100,8 +118488,8 @@ msgid "" "can use the numpad, the vikeys (hjklyubn), or the arrow keys. To have your " "character wait in place, press '.'" msgstr "" -"Znak @ w centrum reprezentuje Ciebie. By się poruszać użyj klawiszy " -"numerycznych, lub (hjklyubn), lub strzałek. By zaczekać nie ruszając się z " +"Znak '@' w centrum reprezentuje ciebie. By się poruszać, użyj klawiszy " +"numerycznych, klawiszy vi, lub strzałek. By zaczekać nie ruszając się z " "miejsca naciśnij '.'" #: lang/json/tutorial_messages_from_json.py @@ -118166,7 +118554,7 @@ msgid "" " are items there. If you examine the square by pressing 'e', you can pick " "up items without moving to the square." msgstr "" -"Pobliski [ to gablota, a niebieskie tło wskazuje że są tam przedmioty. " +"Pobliski { to gablota, a niebieskie tło wskazuje że są tam przedmioty. " "Jeżeli zbadasz to miejsce naciskając 'e', możesz wziąć przedmioty nie " "wchodząc w tą przestrzeń." @@ -118547,6 +118935,9 @@ msgid "" "press 'c' to fill a container, then select a watertight container to put the" " water into." msgstr "" +"~ to teren symbolizujący wodę. Ze źródła takiego jak to możesz napełnić " +"dowolne posiadane pojemniki. Zbadaj wodę ('e') i naciśnij 'c' by napełnić " +"pojemnik, następnie wybierz szczelny pojemnik by nalać do niego wody." #: lang/json/vehicle_from_json.py msgid "Bicycle" @@ -118740,6 +119131,10 @@ msgstr "" msgid "SWAT Truck" msgstr "Furgonetka SWAT" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "Traktor Automatyczny" @@ -119199,6 +119594,8 @@ msgid "" "A small fridge. When turned on, it will cool the food inside, extended the " "time until the food spoils." msgstr "" +"Mała lodówka. Po włączeniu schładza żywność w niej umieszczoną, wydłużając " +"jej zdatność do spożycia." #. ~ Description for washing machine #: lang/json/vehicle_part_from_json.py @@ -119207,6 +119604,9 @@ msgid "" " power, you could clean a lot of clothes. 'e'xamine the tile with the " "washing machine to use it." msgstr "" +"Mała pralka. Używając detergentu lub mydła, oraz wody i nieco prądu " +"elektrycznego, możesz w niej wyprać wiele ubrań. Zbadaj ('e') pole z pralką " +"by jej użyć." #: lang/json/vehicle_part_from_json.py msgid "trunk" @@ -119250,7 +119650,7 @@ msgstr "drewniany stół" #: lang/json/vehicle_part_from_json.py msgid "controls" -msgstr "układ sterowania" +msgstr "sterowanie" #. ~ Description for controls #: lang/json/vehicle_part_from_json.py @@ -119260,7 +119660,7 @@ msgstr "" #. ~ Description for dashboard #: lang/json/vehicle_part_from_json.py msgid "A frame containing some lights and controls." -msgstr "" +msgstr "Ramka zawierająca kilka światełek i sterowanie." #. ~ Description for electronics control unit #: lang/json/vehicle_part_from_json.py @@ -119275,7 +119675,7 @@ msgstr "Metalowa rura, która redukuje nieco hałas silnika." #: lang/json/vehicle_part_from_json.py msgid "seatbelt" -msgstr "pas bezpieczeństwa" +msgstr "pasy bezpieczeństwa" #. ~ Description for seatbelt #: lang/json/vehicle_part_from_json.py @@ -119419,6 +119819,13 @@ msgid "" "your inventory. If you attempt craft an item that needs one of the kitchen " "buddy's functions, it will automically be selected as a tool." msgstr "" +"Wielofunkcyjna stacja wytwórcza z oczyszczaczem wody, suszarką do żywności, " +"zamykaczem próżniowym, i prasą ręczną do produkcji amunicji. Czerpie prąd z " +"akumulatorów pojazdu. Zbadaj ('e') pole z pomocnikiem kuchennym by uzyskać " +"dostęp do kranu z wodą lub by oczyścić wodę w zbiorniku pojazdu lub " +"pojemniku w twoim ekwipunku. Jeśli spróbujesz wytworzyć przedmiot który " +"potrzebuje jednej z funkcji kuchennego pomocnika, zostanie on automatycznie " +"wybrany jako narzędzie." #. ~ Description for onboard chemistry lab #: lang/json/vehicle_part_from_json.py @@ -119429,6 +119836,11 @@ msgid "" "that needs one of the chemistry lab's functions, it will automically be " "selected as a tool." msgstr "" +"Mała stacja chemiczna zawierający płytę grzewczą zasilaną akumulatorami " +"pojazdu. Zbadaj ('e') pole z laboratorium chemicznym by uzyskać dostęp do " +"kranu z wodą lub podgrzać jedzenie na płycie grzewczej. Jeśli spróbujesz " +"wytworzyć przedmiot który potrzebuje jednej z funkcji laboratorium " +"chemicznego, zostanie ono automatycznie wybrane jako narzędzie." #: lang/json/vehicle_part_from_json.py msgid "mounted electric forge" @@ -119490,12 +119902,16 @@ msgid "" "A small horn. Use the vehicle controls and select the honk option to make " "noise." msgstr "" +"Mały klakson. Użyj elementów sterujących pojazdem i wybierz opcję trąbienia " +"by wydać dźwięk." #. ~ Description for car horn #: lang/json/vehicle_part_from_json.py msgid "" "A horn. Use the vehicle controls and select the honk option to make noise." msgstr "" +"Klakson. Użyj elementów sterujących pojazdem i wybierz opcję trąbienia by " +"wydać dźwięk." #. ~ Description for truck horn #: lang/json/vehicle_part_from_json.py @@ -119503,6 +119919,8 @@ msgid "" "A powerful truck horn. Use the vehicle controls and select the honk option " "to make noise." msgstr "" +"Potężny klakson ciężarówki. Użyj elementów sterujących pojazdem i wybierz " +"opcję trąbienia by wydać dźwięk." #. ~ Description for back-up beeper #: lang/json/vehicle_part_from_json.py @@ -119579,6 +119997,8 @@ msgid "" "A recharger for UPS devices. When turned on, it charges any UPS devices in " "the cargo space." msgstr "" +"Ładowarka do urządzeń UPS. Włączona ładuje urządzenia typu UPS umieszczone w" +" przestrzeni ładunkowej." #: lang/json/vehicle_part_from_json.py msgid "wing mirror" @@ -119609,7 +120029,7 @@ msgstr "" #. ~ Description for stereo system #: lang/json/vehicle_part_from_json.py msgid "A stereo system. When turned on, it plays music, improving your mood." -msgstr "" +msgstr "System stereo. Włączony gra muzykę poprawiając twój nastrój." #: lang/json/vehicle_part_from_json.py src/vehicle_use.cpp msgid "chimes" @@ -119621,6 +120041,9 @@ msgid "" "A collection of electronic bells. Use the vehicle's controls to turn it on " "or off. When turned on, it makes noise, attracting neighborhood children." msgstr "" +"Zbiór elektronicznych dzwonków. Użyj elementów sterujących pojazdem by " +"włączać je i wyłączać. Po włączeniu wydają dźwięk, który przyciąga okoliczne" +" dzieci." #. ~ Description for jumper cable #: lang/json/vehicle_part_from_json.py @@ -119710,6 +120133,10 @@ msgid "" "the tile or attempt to pick-up items (default ',') to access the controls, " "or use the vehicle control key (default '^')." msgstr "" +"Złożony elektroniczny zestaw sterujący pozwalający na zdalną kontrolę " +"pojazdu gdy jesteś poza nim. Możesz zbadać pole (domyślnie 'e') lub " +"spróbować podnieść przedmiot (domyślnie ',') by uzyskać dostęp do " +"sterowania, albo użyć przycisku kontrolującego pojazd (domyślne '^')." #: lang/json/vehicle_part_from_json.py msgid "camera control system" @@ -119723,6 +120150,11 @@ msgid "" "can 'e'xamine the tile or attempt to pick-up items (default ',') to access " "the controls, or use the vehicle control key (default '^')." msgstr "" +"Wyświetlacz LCD podłączony do jednego lub więcej kamer Po włączeniu pozwala " +"ci obserwować obraz z kamery, ale zużywa prąd z akumulatorów pojazdu. Możesz" +" zbadać pole (domyślnie 'e') lub spróbować podnieść przedmiot (domyślnie " +"',') by uzyskać dostęp do sterowania, albo użyć przycisku kontrolującego " +"pojazd (domyślne '^')." #. ~ Description for security camera #: lang/json/vehicle_part_from_json.py @@ -119767,6 +120199,9 @@ msgid "" " will scoop up any loose items that it travels over, putting them into the " "vehicle's storage." msgstr "" +"Zbierak. Użyj elementów sterujących pojazdem by go włączyć lub wyłączyć. " +"Włączony zbiera luźne przedmioty nad którymi się znajdzie umieszczając je w " +"przestrzeni bagażowej pojazdu." #. ~ Description for water purifier #: lang/json/vehicle_part_from_json.py @@ -119775,6 +120210,9 @@ msgid "" "purify water in a container or in the vehicle's tanks. 'e'xamine the tile " "with the purifier to use it." msgstr "" +"Oczyszczacz wody, zasilany elektryką pojazdu. Możesz go użyć do oczyszczenia" +" wody w pojemniku lub zbiornikach pojazdu. Zbadaj ('e') pole z oczyszczaczem" +" by go użyć." #. ~ Description for plow #: lang/json/vehicle_part_from_json.py @@ -119784,6 +120222,10 @@ msgid "" "planting seeds. It should be placed in front of any seed drills on the " "vehicle." msgstr "" +"Pług. Użyj elementów sterujących pojazdem by go włączyć lub wyłączyć. Po " +"włączeniu tworzy bruzdę w dowolnej ziemi nad którą przejdzie, sprawiając, że" +" nadaje się ona do sadzenia nasion. Powinien być umieszczony przed wszelkimi" +" sadzarkami w pojeździe." #. ~ Description for seed drill #. ~ Description for advanced seed drill @@ -119795,6 +120237,11 @@ msgid "" "any plows on the vehicle, and any wheels should be placed so they won't run " "over the plants." msgstr "" +"Sadzarka. Użyj elementów sterujących pojazdem by go włączyć lub wyłączyć. " +"Możesz ją załadować nasionami badając ją. Po włączeniu będzie wysypywać " +"nasiona w miarę poruszania się pojazdu lub sadzić je w bruzdowatej ziemi. " +"Powinna być umieszczona za pługami w pojeździe, a koła powinny być " +"umieszczone tak, aby nie przejeżdżały roślin." #. ~ Description for reaper #: lang/json/vehicle_part_from_json.py @@ -119805,6 +120252,11 @@ msgid "" "include cargo space of its own so you need install a cargo space of some " "kind elsewhere in the vehicle." msgstr "" +"Automatyczna żniwiarka. Użyj elementów sterujących pojazdem by ją włączyć " +"lub wyłączyć. Po włączeniu będzie ścinać rośliny po których przejedzie. " +"Powinna być umieszczona przed jakimikolwiek pługami w pojeździe do sprawnego" +" działania. Nie posiada własnej przestrzeni ładunkowej, więc musisz " +"zainstalować jakąś przestrzeń ładunkową gdzieś w pojeździe." #. ~ Description for advanced reaper #: lang/json/vehicle_part_from_json.py @@ -119815,6 +120267,11 @@ msgid "" "be placed in front of any plows in the vehicle for efficient operation. It " "has internal cargo space for collecting the harvest." msgstr "" +"Automatyczna żniwiarka. Użyj elementów sterujących pojazdem by ją włączyć " +"lub wyłączyć. Po włączeniu zatrzyma pojazd, jeśli nie ma mocnego silnika. " +"Włączone, będzie ścinać rośliny i trzymać przechowywać je w ładunku pojazdu." +" Powinna być umieszczona przed jakimikolwiek pługami w pojeździe do " +"sprawnego działania. Ma wewnętrzną przestrzeń ładunkową do zbierania plonów." #: lang/json/vehicle_part_from_json.py msgid "cargo lock" @@ -120006,18 +120463,24 @@ msgstr "" #: lang/json/vehicle_part_from_json.py msgid "external cargo rack" +msgstr "zewnętrzny stelaż ładunkowy" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns fuel from a tank in the vehicle." msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." msgstr "" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" #: lang/json/vehicle_part_from_json.py @@ -120328,6 +120791,14 @@ msgstr "zewnętrzny zbiornik (200L)" msgid "barrel (100L)" msgstr "beczka (100L)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "zamontowany miotacz ognia" @@ -121667,6 +122138,12 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -121847,6 +122324,8 @@ msgid "" "This heavy weapon is mounted on a turret, and can be fired from your vehicle" " controls." msgstr "" +"Ta ciężka broń montowana w wieżyczce i może być wystrzelona z poziomu " +"elementów sterujących pojazdu." #: lang/json/vehicle_part_from_json.py msgid "manual storm bolter" @@ -122003,7 +122482,7 @@ msgstr "Witamina C" #: src/action.cpp src/input.cpp msgid "Press " -msgstr "Naciśnij" +msgstr "Naciśnij " #: src/action.cpp src/input.cpp msgid "Try" @@ -122060,7 +122539,7 @@ msgstr "GŁÓWNE MENU" #. ~ appended to "Close where?" "Pry where?" etc. #: src/action.cpp msgid " (Direction button)" -msgstr "(Klawisz kierunku)" +msgstr " (Klawisz kierunku)" #: src/action.cpp msgid "Invalid direction." @@ -123577,11 +124056,11 @@ msgstr "Jest przyjazne wodzie." #: src/armor_layers.cpp msgid "It looks fancy." -msgstr "Wygląda szykownie." +msgstr "Wygląda wymyślnie." #: src/armor_layers.cpp msgid "It looks really fancy." -msgstr "Wygląda naprawdę szykownie." +msgstr "Wygląda naprawdę wymyślnie." #: src/armor_layers.cpp msgid "You will not drown today." @@ -125594,11 +126073,11 @@ msgstr "percepcja" #: src/character.cpp msgid "Left Arm" -msgstr "Lewe Ramię" +msgstr "Lewa Ręka" #: src/character.cpp msgid "Right Arm" -msgstr "Prawe Ramię" +msgstr "Prawa Ręka" #: src/character.cpp msgid "Left Leg" @@ -125676,135 +126155,135 @@ msgstr "Bez Podnoszenia przez NPC" #: src/clzones.cpp msgid "Loot: Unsorted" -msgstr "" +msgstr "Łup: Nieposortowane" #: src/clzones.cpp msgid "Loot: Food" -msgstr "" +msgstr "Łup: Żywność" #: src/clzones.cpp msgctxt "perishable food" msgid "Loot: P.Food" -msgstr "" +msgstr "Łup: P.Żywność" #: src/clzones.cpp msgid "Loot: Drink" -msgstr "" +msgstr "Łup: Napoje" #: src/clzones.cpp msgctxt "perishable drink" msgid "Loot: P.Drink" -msgstr "" +msgstr "Łup: P.Napoje" #: src/clzones.cpp msgid "Loot: Guns" -msgstr "" +msgstr "Łup: Broń palna" #: src/clzones.cpp msgctxt "gun magazines" msgid "Loot: Magazines" -msgstr "" +msgstr "Łup: Magazynki" #: src/clzones.cpp msgid "Loot: Ammo" -msgstr "" +msgstr "Łup: Amunicja" #: src/clzones.cpp msgid "Loot: Weapons" -msgstr "" +msgstr "Łup: Broń" #: src/clzones.cpp msgid "Loot: Tools" -msgstr "" +msgstr "Łup: Narzędzia" #: src/clzones.cpp msgid "Loot: Clothing" -msgstr "" +msgstr "Łup: Ubrania" #: src/clzones.cpp msgctxt "filthy clothing" msgid "Loot: F.Clothing" -msgstr "" +msgstr "Łup: B.Ubrania" #: src/clzones.cpp msgid "Loot: Drugs" -msgstr "" +msgstr "Łup: Leki" #: src/clzones.cpp msgid "Loot: Books" -msgstr "" +msgstr "Łup: Książki" #: src/clzones.cpp msgid "Loot: Mods" -msgstr "" +msgstr "Łup: Modyfikacje" #: src/clzones.cpp msgid "Loot: Mutagens" -msgstr "" +msgstr "Łup: Mutageny" #: src/clzones.cpp msgid "Loot: Bionics" -msgstr "" +msgstr "Łup: Bionika" #: src/clzones.cpp msgctxt "vehicle parts" msgid "Loot: V.Parts" -msgstr "" +msgstr "Łup: C.Pojazdów" #: src/clzones.cpp msgid "Loot: Other" -msgstr "" +msgstr "Łup: Inne" #: src/clzones.cpp msgid "Loot: Fuel" -msgstr "" +msgstr "Łup: Paliwo" #: src/clzones.cpp msgid "Loot: Seeds" -msgstr "" +msgstr "Łup: Nasiona" #: src/clzones.cpp msgid "Loot: Chemical" -msgstr "" +msgstr "Łup: Chemia" #: src/clzones.cpp msgctxt "spare parts" msgid "Loot: S.Parts" -msgstr "" +msgstr "Łup: C.Zamienne" #: src/clzones.cpp msgid "Loot: Artifacts" -msgstr "" +msgstr "Łup: Artefakty" #: src/clzones.cpp msgid "Loot: Armor" -msgstr "" +msgstr "Łup: Zbroje" #: src/clzones.cpp msgctxt "filthy armor" msgid "Loot: F.Armor" -msgstr "" +msgstr "Łup: B.Zbroja" #: src/clzones.cpp msgid "Loot: Wood" -msgstr "" +msgstr "Łup: Drewno" #: src/clzones.cpp msgid "Loot: Ignore" -msgstr "" +msgstr "Łup: Ignoruj" #: src/clzones.cpp msgctxt "plot of land" msgid "Farm: Plot" -msgstr "" +msgstr "Farma: Działka" #: src/clzones.cpp msgid "No seed" -msgstr "" +msgstr "Brak nasiona" #: src/clzones.cpp msgid "Plant seed: " -msgstr "" +msgstr "Zasadź nasiono: " #: src/clzones.cpp msgid "Zone name:" @@ -125816,7 +126295,7 @@ msgstr "Wybierz typ strefy:" #: src/clzones.cpp msgid "" -msgstr "" +msgstr "" #: src/clzones.cpp msgid "zones date" @@ -126010,7 +126489,7 @@ msgstr "dźwięk alarmu!" #: src/computer.cpp msgid "Containment shields opened. Press any key..." -msgstr "Osłony powstrzymujące otwarte. Naciśnij dowolny klawisz..." +msgstr "Osłony powstrzymujące otwarte. Naciśnij dowolny klawisz..." #: src/computer.cpp msgctxt "memorial_male" @@ -126179,7 +126658,7 @@ msgstr "" #: src/computer.cpp msgid "Continue reading?" -msgstr "" +msgstr "Kontynuować czytanie?" #: src/computer.cpp msgid "" @@ -126217,7 +126696,7 @@ msgstr "" #: src/computer.cpp msgid "AMIGARA PROJECT" -msgstr "" +msgstr "PROJEKT AMIGARA" #: src/computer.cpp #, c-format @@ -127447,7 +127926,8 @@ msgstr[3] "Potrzebujesz %s z %d ładunkami." #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "Nieważne." @@ -127786,6 +128266,42 @@ msgstr "Trafiasz %s za %d obrażeń." msgid "%1$s shoots %2$s." msgstr "%1$s strzela w%2$s." +#: src/creature.cpp +msgid "Severe pain" +msgstr "" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "" + +#: src/creature.cpp +msgid "No pain" +msgstr "" + #: src/creature.cpp msgid "Hostile" msgstr "Wrogi" @@ -131545,15 +132061,15 @@ msgstr "Świat zachowany. Pozostało postaci: %s" msgid "Wait till you wake up..." msgstr "Zaczekaj aż się obudzisz..." -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "(Y) Tak, (N)ie, (I)gnoruj kolejne zakłócenia spokoju i dokończ." - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s. Auto-ruch anulowany" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -132493,7 +133009,7 @@ msgstr "Spostrzegasz %s!" #: src/game.cpp #, c-format msgid "We have detected a %s - an enemy of the Mycus!" -msgstr "" +msgstr "Wykryliśmy %s - wroga Grzybni!" #: src/game.cpp msgid "Our fibers strain with renewed wrath!" @@ -132893,7 +133409,7 @@ msgstr "Popchnij %s" #: src/game.cpp msgid "Rename" -msgstr "Przemianuj" +msgstr "Zmień nazwę" #: src/game.cpp msgid "Place items into bag" @@ -133041,7 +133557,7 @@ msgstr "%s nie ma gdzie przejść!" msgid "Use which item?" msgstr "Użyj którego przedmiotu?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "Nieważne" @@ -133826,7 +134342,7 @@ msgstr "Krzyczysz: \"%s\"" #: src/game.cpp msgid "You can't drive the vehicle from here. You need controls!" -msgstr "Nie możesz stąd prowadzić wozu. Potrzebujesz sterowania!" +msgstr "Nie możesz stąd prowadzić pojazdu. Potrzebujesz sterowania!" #: src/game.cpp msgid "Can't drive this vehicle remotely. It has no working controls." @@ -134134,7 +134650,7 @@ msgstr "Widzisz tu %s i wiele innych przedmiotów" #: src/game.cpp msgid "There are vehicle controls here." -msgstr "Jest tu układ kierowniczy pojazdu." +msgstr "Są tu elementy sterowania pojazdem." #: src/game.cpp #, c-format @@ -135289,7 +135805,7 @@ msgstr "q: Powrót do gry" #: src/help.cpp msgid "Movement is performed using the numpad, or vikeys." -msgstr "Ruch następuje za pomocą klawiatury numerycznej lub strzałek." +msgstr "Ruch następuje za pomocą klawiatury numerycznej, lub klawiszy vi." #: src/help.cpp #, c-format @@ -135331,6 +135847,8 @@ msgid "" "You control vehicles using the numpad, or vikeys. However, you control their" " controls, rather than the vehicle directly." msgstr "" +"Sterujesz pojazdami używając klawiszy numerycznych lub klawiszy vi. Jednak " +"kontrolujesz ich sterowanie, nie pojazd bezpośrednio." #: src/help.cpp #, c-format @@ -136438,7 +136956,7 @@ msgid "" "Q: What is Safe Mode, and why does it prevent me from moving?\n" "A: Safe Mode is a way to guarantee that you won't die by holding a movement key down. When a monster comes into view, your movement will be ignored until Safe Mode is turned off with the ! key. This ensures that the sudden appearance of a monster won't catch you off guard." msgstr "" -"P: Co to jest tryb bezpieczny i czemu powstrzymuje mój ruch?\n" +"P: Czym jest Tryb Bezpieczny i czemu powstrzymuje mój ruch?\n" "O: Tryb Bezpieczny to sposób zagwarantowania że nie zginiesz podczas trzymania klawiszy ruchu. Gdy w pole widzenia wejdzie potwór ruch będzie ignorowany aż nie wyłączysz trybu bezpiecznego klawiszem !. To pozwala na to, że nagłe pojawienie się potwora nie zastanie cię nieprzygotowanego." #: src/help.cpp @@ -138198,7 +138716,7 @@ msgstr "Nieprzypisany!" #: src/input.cpp src/requirements.cpp msgid " or " -msgstr "lub" +msgstr " lub " #: src/input.cpp msgid "Unbound keys" @@ -138859,7 +139377,7 @@ msgstr "Tors. " #: src/item.cpp msgid "Either arm. " -msgstr "Dowolne ramię. " +msgstr "Dowolna ręka. " #: src/item.cpp msgid "The arms. " @@ -138867,11 +139385,11 @@ msgstr "Ramiona. " #: src/item.cpp msgid "The left arm. " -msgstr "Lewe ramię. " +msgstr "Lewa ręka. " #: src/item.cpp msgid "The right arm. " -msgstr "Prawe ramię. " +msgstr "Prawa ręka. " #: src/item.cpp msgid "Either hand. " @@ -139101,7 +139619,7 @@ msgstr "Zrobione z: %s" #: src/item.cpp #, c-format msgid "Disassembling this item takes %s and might yield: %s." -msgstr "Rozebranie tej rzeczy zajmie %s i może dać: %s." +msgstr "Rozebranie tego przedmiotu zajmie %s i może dać: %s." #: src/item.cpp #, c-format @@ -139203,8 +139721,7 @@ msgstr "* Ten element ubioru pasuje na ciebie jak ulał." #: src/item.cpp msgid "* This piece of clothing can be refitted." -msgstr "" -"* Ta część ubioru może zostać dopasowana do twojego rozmiaru." +msgstr "* Ten element ubioru może zostać dopasowany." #: src/item.cpp msgid "* This item can be worn on either side of the body." @@ -139374,7 +139891,7 @@ msgstr "Mody: " #: src/item.cpp msgid "Content of this item:" -msgstr "" +msgstr "Zawartość tego przedmiotu:" #: src/item.cpp msgid "You know dozens of things you could craft with it." @@ -139502,7 +140019,7 @@ msgstr "(stare)" #: src/item.cpp msgid " (fresh)" -msgstr "(świeże)" +msgstr " (świeże)" #: src/item.cpp msgid " (hot)" @@ -139510,7 +140027,7 @@ msgstr "(gorące)" #: src/item.cpp msgid " (cold)" -msgstr "(zimne)" +msgstr " (zimne)" #: src/item.cpp msgid " (frozen)" @@ -139522,7 +140039,7 @@ msgstr "" #: src/item.cpp msgid " (fits)" -msgstr "(pasuje)" +msgstr " (pasuje)" #: src/item.cpp msgid " (undersized)" @@ -140380,12 +140897,12 @@ msgstr "Zjadłaś galaretkę marloss." #: src/iuse.cpp msgctxt "memorial_male" msgid "Became one with the Mycus." -msgstr "Stałeś się jednością z Mykus." +msgstr "Stał się jednością z Grzybnią." #: src/iuse.cpp msgctxt "memorial_female" msgid "Became one with the Mycus." -msgstr "Stałaś się jednością z Mykus." +msgstr "Stała się jednością z Grzybnią." #: src/iuse.cpp msgid "" @@ -142631,15 +143148,15 @@ msgstr "Podłóż bombę pod samochód" #: src/iuse.cpp msgid "The RC car's batteries seem to be dead." -msgstr "Baterie zdalnego samochodu wyczerpały się." +msgstr "Baterie zdalnie sterowanego samochodu wyczerpały się." #: src/iuse.cpp msgid "" "You turned on your RC car, now place it on ground, and use radio control to " "play." msgstr "" -"Włączyłeś swój zdalnie sterowany samochód, teraz połóż go na ziemi i użyj " -"radiowego sterowania do zabawy." +"Włączasz swój zdalnie sterowany samochód, teraz połóż go na ziemi i użyj " +"kontrolera radiowego by się bawić." #: src/iuse.cpp msgid "Arm what?" @@ -142648,22 +143165,23 @@ msgstr "Uzbrój co?" #: src/iuse.cpp #, c-format msgid "You armed your RC car with %s." -msgstr "Uzbroiłeś swój zdalny samochód w %s." +msgstr "Uzbroiłeś swój zdalnie sterowany samochód w %s." #: src/iuse.cpp #, c-format msgid "RC car with %s ? How?" -msgstr "Zdalny samochód z %s? Jak?" +msgstr "Zdalnie sterowany samochód z %s? Jak?" #: src/iuse.cpp #, c-format msgid "Your %s is too heavy or bulky for this RC car." msgstr "" -"Twój %s jest zbyt ciężki lub zbyt duży dla twojego zdalnego samochodu." +"Twój %s jest zbyt ciężki lub nieporęczny dla tego zdalnie sterowanego " +"samochodu." #: src/iuse.cpp msgid "You disarmed your RC car" -msgstr "Rozbrajasz swój zdalny samochód" +msgstr "Rozbrajasz swój zdalnie sterowany samochód" #. ~Sound of a radio controlled car moving around #: src/iuse.cpp @@ -142676,7 +143194,7 @@ msgstr "Co chcesz zrobić z aktywnym zdalnie sterowanym samochodem?" #: src/iuse.cpp msgid "You turned off your RC car" -msgstr "Wyłączyłeś swój zdalny samochód" +msgstr "Wyłączasz swój zdalnie sterowany samochód" #: src/iuse.cpp src/map.cpp msgid "beep." @@ -142684,11 +143202,11 @@ msgstr "beep." #: src/iuse.cpp msgid "Take control of RC car" -msgstr "Przejmij kontrolę nad zdalnym samochodem" +msgstr "Przejmij kontrolę nad zdalnie sterowanym samochodem" #: src/iuse.cpp msgid "Stop controlling RC car" -msgstr "Przestań kontrolować zdalny samochód" +msgstr "Przestań kontrolować zdalnie sterowany samochód" #: src/iuse.cpp msgid "What to do with radio control?" @@ -142708,11 +143226,11 @@ msgstr "Naciśnij czerwony przycisk" #: src/iuse.cpp msgid "No active RC cars on ground and in range." -msgstr "Brak aktywnych zdalnych samochodów na ziemi w zasięgu." +msgstr "Brak aktywnych zdalnie sterowanych samochodów na ziemi w zasięgu." #: src/iuse.cpp msgid "You take control of the RC car." -msgstr "Przejmujesz kontrolę nad zdalnym samochodem." +msgstr "Przejmujesz kontrolę nad zdalnie sterowanym samochodem." #: src/iuse.cpp #, c-format @@ -143824,7 +144342,7 @@ msgstr "Kończysz używać %s." #: src/iuse_actor.cpp msgid "That arm is broken. It needs surgical attention or a splint." -msgstr "To ramię jest złamane. Wymaga interwencji chirurgicznej lub szyn." +msgstr "Ta ręka jest złamana. Wymaga interwencji chirurgicznej lub szyn." #: src/iuse_actor.cpp msgid "That leg is broken. It needs surgical attention or a splint." @@ -145423,7 +145941,7 @@ msgstr "[]Losowa Postać" #: src/main_menu.cpp msgctxt "Main Menu|New Game" msgid "Play Now! (ixed Scenario)" -msgstr "Graj Teraz! ( Gotowy scenariusz)" +msgstr "Graj Teraz! ( Gotowy scenariusz)" #: src/main_menu.cpp msgctxt "Main Menu|New Game" @@ -148205,7 +148723,7 @@ msgstr "Nikt nie wraca do twojej drużyny..." #: src/mission_companion.cpp msgid "MAIN" -msgstr "" +msgstr "GŁÓWNY" #: src/mission_companion.cpp msgid " [N] " @@ -148442,7 +148960,7 @@ msgstr "" #: src/mission_companion.cpp msgid "Repeat?" -msgstr "" +msgstr "Powrórz?" #: src/mission_companion.cpp msgid "You don't have the materials to craft that" @@ -148515,6 +149033,8 @@ msgid "" "NPC Overview:\n" " \n" msgstr "" +"Przegląd NPC:\n" +" \n" #: src/mission_companion.cpp #, c-format @@ -148522,21 +149042,23 @@ msgid "" "Name: %20s\n" " \n" msgstr "" +"Imię: %20s\n" +" \n" #: src/mission_companion.cpp #, c-format msgid "Strength: %10d\n" -msgstr "" +msgstr "Siła: %10d\n" #: src/mission_companion.cpp #, c-format msgid "Dexterity: %10d\n" -msgstr "" +msgstr "Zręczność: %10d\n" #: src/mission_companion.cpp #, c-format msgid "Intelligence: %10d\n" -msgstr "" +msgstr "Inteligencja: %10d\n" #: src/mission_companion.cpp #, c-format @@ -148544,14 +149066,16 @@ msgid "" "Perception: %10d\n" " \n" msgstr "" +"Percepcja: %10d\n" +" \n" #: src/mission_companion.cpp msgid "Top 3 Skills:\n" -msgstr "" +msgstr "Top 3 Umiejętności:\n" #: src/mission_companion.cpp msgid "Asking for:\n" -msgstr "" +msgstr "Prosi o:\n" #: src/mission_companion.cpp #, c-format @@ -148559,6 +149083,8 @@ msgid "" "> Food: %10d days\n" " \n" msgstr "" +"> Jedzenie: %10d dni\n" +" \n" #: src/mission_companion.cpp #, c-format @@ -148566,6 +149092,8 @@ msgid "" "Faction Food:%9d days\n" " \n" msgstr "" +"Jedzenie Frakcji:%9d dni\n" +" \n" #: src/mission_companion.cpp #, c-format @@ -148573,40 +149101,42 @@ msgid "" "Recruit Chance: %10d%%\n" " \n" msgstr "" +"Szansa Werbunku: %10d%%\n" +" \n" #: src/mission_companion.cpp msgid "Select an option:" -msgstr "" +msgstr "Wybierz opcję:" #: src/mission_companion.cpp msgid "Increase Food" -msgstr "" +msgstr "Zwiększ Jedzenie" #: src/mission_companion.cpp msgid "Decrease Food" -msgstr "" +msgstr "Zmniejsz Jedzenie" #: src/mission_companion.cpp msgid "Make Offer" -msgstr "" +msgstr "Złóż Ofertę" #: src/mission_companion.cpp msgid "Not Interested" -msgstr "" +msgstr "Brak Zaintersowania" #: src/mission_companion.cpp msgid "You decide you aren't interested..." -msgstr "" +msgstr "Decydujesz, że nie interesuje cię to..." #: src/mission_companion.cpp #, c-format msgid "%s has been convinced to join!" -msgstr "" +msgstr "%s został przekonany by dołączyć!" #: src/mission_companion.cpp #, c-format msgid "%s wasn't interested..." -msgstr "" +msgstr "%s nie był zainteresowany..." #: src/mission_end.cpp #, c-format @@ -148749,7 +149279,7 @@ msgstr "Bez nazwy (%s)" #: src/mod_manager.cpp msgid "CORE CONTENT PACKS" -msgstr "PAKIETY ZAWARTOŚCI RDZENIA" +msgstr "GŁÓWNA ZAWARTOŚĆ" #: src/mod_manager.cpp msgid "ITEM ADDITION MODS" @@ -148930,7 +149460,7 @@ msgstr "Łuk elektryczny przeskakuje w kierunku %s!" #: src/monattack.cpp #, c-format msgid "the %s obnoxiously yelling \"%s!!!\"" -msgstr "" +msgstr "%s nieprzyjemnie krzyczy \"%s!!!\"" #: src/monattack.cpp #, c-format @@ -149119,12 +149649,12 @@ msgstr "Zarodniki zostały rozpylone przez %s!" #: src/monattack.cpp msgid "\"Buy SpOreos(tm) now!\"" -msgstr "" +msgstr "\"Kup Grzybnieo(tm) teraz!\"" #: src/monattack.cpp #, c-format msgid "Delicious snacks are released from the %s!" -msgstr "" +msgstr "Pyszne przekąski zostały rozpylone przez %s!" #: src/monattack.cpp #, c-format @@ -150202,15 +150732,15 @@ msgstr "%1$s trafia %2$s , ale odbija się od zbroi!" #: src/monattack.cpp #, c-format msgid "The %s doots its trumpet!" -msgstr "" +msgstr "%s trąbi w swoją trąbkę!" #: src/monattack.cpp msgid "A spooky skeleton rises from the ground!" -msgstr "" +msgstr "Upiorny szkielet wstaje z ziemi!" #: src/monattack.cpp msgid "DOOT." -msgstr "" +msgstr "TRUTUTU." #: src/mondeath.cpp #, c-format @@ -150555,7 +151085,7 @@ msgstr "Jest bardzo poważnie ranny." #: src/monster.cpp msgid "It is nearly dead!" -msgstr "" +msgstr "Jest niemal martwe!" #: src/monster.cpp #, c-format @@ -150778,42 +151308,42 @@ msgstr "%s przełamuje chwyt!" #: src/monster.cpp msgid "hummmmm." -msgstr "" +msgstr "mmmmmmm." #: src/monster.cpp msgid "fwoosh!" -msgstr "" +msgstr "fuszzzz!" #: src/monster.cpp #, c-format msgid "The %s explodes in a fiery inferno!" -msgstr "" +msgstr "%s eksploduje w ognistych płomieniach!" #: src/monster.cpp #, c-format msgid "Lightning from %1$s engulfs the %2$s!" -msgstr "" +msgstr "Piorun od %1$s pochłania %2$s!" #: src/monster.cpp msgid "BOOOOOOOM!!!" -msgstr "" +msgstr "BUUUUUUUM!!!" #: src/monster.cpp msgid "vrrrRRRUUMMMMMMMM!" -msgstr "" +msgstr "wrrrRRRUUMMMMMMMM!" #: src/monster.cpp #, c-format msgid "Lightning strikes the %s!" -msgstr "" +msgstr "Piorun trafia %s!" #: src/monster.cpp msgid "Your vision goes white!" -msgstr "" +msgstr "Twój wzrok zakrywa biel!" #: src/monster.cpp msgid "VMMMMMMMMM!" -msgstr "" +msgstr "WMMMMMMMMM!" #: src/monster.cpp #, c-format @@ -150907,31 +151437,31 @@ msgstr "Zaczynasz pleść pajęczynę swoimi kądziołkami przędnymi!" #: src/mutation.cpp msgid "Turn on digging mode" -msgstr "" +msgstr "Włącz tryb kopania" #: src/mutation.cpp msgid "Fill pit/tamp ground" -msgstr "" +msgstr "Zapełnij dół/ubij ziemię" #: src/mutation.cpp msgid "Churn up ground" -msgstr "" +msgstr "Zryj ziemię." #: src/mutation.cpp msgid "Fill pit where?" -msgstr "" +msgstr "Zasypać dół gdzie?" #: src/mutation.cpp msgid "There is no pit to fill." -msgstr "" +msgstr "Nie ma tu dołu do zasypania." #: src/mutation.cpp msgid "There is no rubble to clear." -msgstr "" +msgstr "Nie ma gruzu do oczyszczenia." #: src/mutation.cpp msgid "Churn up ground where?" -msgstr "" +msgstr "Zryj ziemię gdzie?" #: src/mutation.cpp msgid "You focus, but are too hemmed in to birth a new slimespring!" @@ -150961,7 +151491,7 @@ msgstr "jesteśmy drużyną, ogarniemy to!" #: src/mutation.cpp msgid "Bionic power storage increased by 100." -msgstr "" +msgstr "Bank energii bionicznej zwiększono o 100." #: src/mutation.cpp msgid "You feel something straining deep inside you, yearning to be free..." @@ -151051,7 +151581,7 @@ msgstr "" #: src/mutation.cpp msgid "This is a contaminant. We reject it from the Mycus." -msgstr "To jest skażenie. Odrzucamy to z dala od Mykus." +msgstr "To jest skażenie. Odrzucamy to od Grzybni." #: src/mutation.cpp msgid "We decontaminate it with spores." @@ -151122,7 +151652,7 @@ msgstr "Odniosłaś skutki toksycznej reakcji na marloss/mutagen." #: src/mutation.cpp msgid "Something strains mightily for a moment... and then... you're... FREE!" -msgstr "" +msgstr "Coś wysila się potężnie przez moment... i wtedy... jesteś... WOLNY!" #: src/mutation.cpp msgid "Your appetite for blood fades." @@ -151785,7 +152315,7 @@ msgstr "Różne rany kończyn" #: src/newcharacter.cpp msgid "No starting NPC" -msgstr "" +msgstr "Brak startowych NPC" #: src/newcharacter.cpp msgid "Search by scenario name." @@ -152542,7 +153072,7 @@ msgstr "%s ucieka przed tobą!" #: src/npctalk.cpp #, c-format msgid "Dialogue: %s" -msgstr "" +msgstr "Dialog: %s" #: src/npctalk.cpp msgid "Your response:" @@ -152571,6 +153101,8 @@ msgid "" "%s is sedated and can't be moved or woken up until the medication or " "sedation wears off." msgstr "" +"%s jest naszprycowany i nie może być przesunięty albo obudzony aż lek lub " +"środek uspokajający przestanie działać." #: src/npctalk.cpp msgid " And I have more I'd like you to do." @@ -153388,7 +153920,7 @@ msgstr "Stoję na straży." #: src/npctalk.cpp msgid "Hey Boss..." -msgstr "" +msgstr "Hej szefie..." #: src/npctalk.cpp msgid "Not a bloody chance, I'm going to get left behind!" @@ -154315,11 +154847,11 @@ msgstr "Widzimy się." #: src/npctalk.cpp msgid "What needs to be done?" -msgstr "" +msgstr "Co trzeba zrobić?" #: src/npctalk.cpp msgid "We're abandoning this camp." -msgstr "" +msgstr "Porzucamy ten obóz." #: src/npctalk.cpp msgid "Combat commands..." @@ -154367,11 +154899,11 @@ msgstr "Chciałbym się dowiedzieć o tobie czegoś więcej..." #: src/npctalk.cpp msgid "I want you to use this item" -msgstr "Użyj proszę tego przedmiotu..." +msgstr "Użyj tego przedmiotu" #: src/npctalk.cpp msgid "Hold on to this item" -msgstr "Weź proszę ten przedmiot..." +msgstr "Weź ten przedmiot" #: src/npctalk.cpp msgid "Miscellaneous rules..." @@ -154379,7 +154911,7 @@ msgstr "Różne zasady..." #: src/npctalk.cpp msgid "I want you to build a camp here." -msgstr "" +msgstr "Chcę zbudować tu obóz." #: src/npctalk.cpp msgid "I'll give you some space." @@ -154624,44 +155156,50 @@ msgstr "%s podąża za tobą." #: src/npctalk.cpp msgid "Would you like to review the faction camp description?" -msgstr "" +msgstr "Chciałbyś przejrzeć opis obozu frakcji?" #: src/npctalk.cpp msgid "You must build your camp in an empty field." -msgstr "" +msgstr "Musisz wybudować swój obóz na pustej przestrzeni." #: src/npctalk.cpp msgid "You need more room for camp expansions!" -msgstr "" +msgstr "Potrzebujesz więcej przestrzeni na rozszerzenia obozu!" #: src/npctalk.cpp msgid "You are too close to another camp!" -msgstr "" +msgstr "Jesteś zbyt blisko innego obozu!" #: src/npctalk.cpp msgid "" "Warning, you have selected a region with the following issues:\n" " \n" msgstr "" +"Uwaga, wybrany przez ciebie region ma następujące problemy:\n" +" \n" #: src/npctalk.cpp msgid "There are few forests. Wood is your primary construction material.\n" msgstr "" +"Jest tutaj parę lasów. Drewno jest twoim głównym materiałem " +"konstrukcyjnym.\n" #: src/npctalk.cpp msgid "There are few large clean-ish water sources.\n" -msgstr "" +msgstr "Jest tutaj kilka dużych w miarę czystych źródeł wody.\n" #: src/npctalk.cpp msgid "" "There are no swamps. Swamps provide access to a few late game industries.\n" -msgstr "" +msgstr "Nie ma tu bagien. Bagna dają dostęp do kilku przemysłów późnej gry.\n" #: src/npctalk.cpp msgid "" "There are few fields. Producing enough food to supply your camp may be " "difficult.\n" msgstr "" +"Jest tutaj kilka polan. Produkowanie wystarczającej ilości żywności, by " +"zaopatrzyć twój obóz może być trudne.\n" #: src/npctalk.cpp #, c-format @@ -154669,10 +155207,12 @@ msgid "" "%s \n" "Are you sure you wish to continue? " msgstr "" +"%s \n" +"Na pewno chcesz kontynuować? " #: src/npctalk.cpp msgid "You weren't able to survey the camp site." -msgstr "" +msgstr "Nie udało ci się zbadać miejsca na obóz." #: src/npctalk.cpp #, c-format @@ -156123,12 +156663,12 @@ msgstr "Tors: %d/%d" #: src/player.cpp #, c-format msgid "L Arm: %d/%d" -msgstr "L Ramię: %d/%d" +msgstr "L Ręka: %d/%d" #: src/player.cpp #, c-format msgid "R Arm: %d/%d" -msgstr "R Ramię: %d/%d" +msgstr "P Ręka: %d/%d" #: src/player.cpp #, c-format @@ -156471,11 +157011,11 @@ msgstr "Roztrzaskujesz się o %s otrzymując %d obrażeń." #: src/player.cpp #, c-format msgid "You are slammed against %s!" -msgstr "" +msgstr "Roztrzaskujesz się o %s!" #: src/player.cpp msgid "...but your shock absorbers negate the damage!" -msgstr "" +msgstr "...ale twoje amortyzatory negują obrażenia!" #: src/player.cpp #, c-format @@ -156952,7 +157492,7 @@ msgstr "Hej, zabijmy tego %1$s!" #: src/player.cpp #, c-format msgid "Did you see that %1$s!?" -msgstr "" +msgstr "Widziałeś tego %1$s!?" #: src/player.cpp #, c-format @@ -157160,7 +157700,7 @@ msgstr "\"Zmusili mnie!\"" #: src/player.cpp msgid "\"What are you!?\"" -msgstr "" +msgstr "\"Czym jesteś!?\"" #: src/player.cpp msgid "\"I should never have trusted you!\"" @@ -157532,7 +158072,7 @@ msgstr "Nie możesz tego założyć, jest brudne i obrzydliwe!" #: src/player.cpp #, c-format msgid "Your %s mutation prevents you from wearing your %s." -msgstr "" +msgstr "Twoja mutacja %s uniemożliwia ci założenie twojego %s." #: src/player.cpp #, c-format @@ -157722,13 +158262,13 @@ msgstr "Jesteś ogłuszony!" #: src/player.cpp #, c-format msgid "This %s is too big to wear comfortably! Maybe it could be refitted..." -msgstr "" +msgstr "To %s jest zbyt duże by wygodnie je nosić! Może można to dopasować..." #: src/player.cpp #, c-format msgid "" "This %s is too small to wear comfortably! Maybe it could be refitted..." -msgstr "" +msgstr "To %s jest zbyt małe by wygodnie je nosić! Może można to dopasować..." #: src/player.cpp #, c-format @@ -158770,19 +159310,19 @@ msgstr "Twoje dreszcze czynią cię niestabilnym." #: src/player_hardcoded_effects.cpp msgid "Your left arm is shivering." -msgstr "Twoje lewe ramię drży." +msgstr "Twoja lewa ręka ma dreszcze." #: src/player_hardcoded_effects.cpp msgid "Your left arm trembles from the cold." -msgstr "Twoje lewe ramie drży z zimna." +msgstr "Twoja lewa ręka drży z zimna." #: src/player_hardcoded_effects.cpp msgid "Your right arm is shivering." -msgstr "Twoje prawe ramię drży." +msgstr "Twoja prawa ręka ma dreszcze." #: src/player_hardcoded_effects.cpp msgid "Your right arm trembles from the cold." -msgstr "Twoje prawe ramię drży z zimna." +msgstr "Twoja prawa ręka drży z zimna." #: src/player_hardcoded_effects.cpp msgid "Your left hand feels like ice." @@ -159034,7 +159574,7 @@ msgstr "Twój wzrok się rozmywa." #: src/player_hardcoded_effects.cpp msgid "Your vision goes black!" -msgstr "Twój wzrok zakrywa czerń." +msgstr "Twój wzrok zakrywa czerń!" #: src/player_hardcoded_effects.cpp msgid "Your bowels ache." @@ -159460,7 +160000,7 @@ msgstr "tz-KRAKk!" #: src/ranged.cpp msgid "Fwoosh!" -msgstr "Fwoosh!" +msgstr "Fuszzzz!" #: src/ranged.cpp msgid "Fzzt!" @@ -160292,6 +160832,8 @@ msgid "" "You hit the ground hard, but your shock absorbers handle the impact " "admirably!" msgstr "" +"Uderzasz twardo w ziemię, ale twoje amortyzatory doskonale radzą sobie z " +"uderzeniem!" #: src/trapfunc.cpp msgid "You hurt yourself!" @@ -160887,13 +161429,11 @@ msgstr "Wybierz część do usunięcia w tym miejscu:" #: src/veh_interact.cpp msgid "The vehicle has no liquid fuel left to siphon." -msgstr "Nie ma już płynnego paliwa do spuszczenia ze zbiornika." +msgstr "Ten pojazd nie ma już płynnego paliwa do spuszczenia." #: src/veh_interact.cpp msgid "You need a hose to siphon liquid fuel." -msgstr "" -"Potrzebujesz węża do spuszczenia płynnego paliwa ze " -"zbiornika." +msgstr "Potrzebujesz węża do spuszczenia płynnego paliwa." #: src/veh_interact.cpp msgid "You can't siphon from a moving vehicle." @@ -160902,7 +161442,15 @@ msgstr "" #: src/veh_interact.cpp msgid "Select part to siphon: " -msgstr "" +msgstr "Wybierz część z której chcesz spuścić:" + +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "Ten pojazd nie ma już stałego paliwa do usunięcia." + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "Nie możesz wyładować czegokolwiek z poruszającego się pojazdu." #: src/veh_interact.cpp msgid "There is no wheel to change here." @@ -161093,6 +161641,10 @@ msgstr "wymntuj" msgid "iphon" msgstr "puść ze zbiornika" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "wyłauj" + #: src/veh_interact.cpp msgid "hange tire" msgstr " - zmień oponę" @@ -161103,7 +161655,7 @@ msgstr " - załoga" #: src/veh_interact.cpp msgid "rname" -msgstr "przemianuj" +msgstr "zmiń nazwę" #: src/veh_interact.cpp msgid "lbel" @@ -161241,7 +161793,11 @@ msgstr "Użyć jakiego gizmo?" #: src/veh_interact.cpp msgid "Select tank to siphon:" -msgstr "" +msgstr "Wybierz zbiornik z którego chcesz spuścić:" + +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "Usuń co?" #: src/veh_interact.cpp #, c-format @@ -161647,7 +162203,7 @@ msgstr "%d\"" #: src/vehicle_part.cpp msgid " (faulty)" -msgstr "(wadliwy)" +msgstr " (wadliwy)" #: src/vehicle_part.cpp #, c-format @@ -161859,7 +162415,7 @@ msgstr "Przestajesz sterować pojazdem." #: src/vehicle_use.cpp msgid "Let go of controls" -msgstr "Wypuść kierownicę" +msgstr "Wypuść sterowanie" #: src/vehicle_use.cpp msgid "No controls there" @@ -161871,7 +162427,7 @@ msgstr "Przestań jechać" #: src/vehicle_use.cpp msgid "You turn the engine off and let go of the controls." -msgstr "Wyłączasz silnik i wypuszczasz z rąk kierownicę." +msgstr "Wyłączasz silnik i wypuszczasz z rąk sterowanie." #: src/vehicle_use.cpp msgid "Turn off the engine" @@ -161924,7 +162480,7 @@ msgstr "Uruchamiasz alarm" #: src/vehicle_use.cpp msgid "Vehicle controls" -msgstr "System sterowniczy pojazdu" +msgstr "Układ sterowniczy pojazdu" #: src/vehicle_use.cpp #, c-format @@ -162532,6 +163088,8 @@ msgid "" "%s = Save Load Order as default. %s = Controls %s/%s = Prev/Next Option. " "%s/%s = Prev/Next Tab." msgstr "" +"%s = Zapisz Kolejność Wczytywania jako domyślną. %s = Kontroluje %s/%s = " +"Poprz./Nast. Opcja. %s/%s = Poprz./Nast. Karta." #: src/worldfactory.cpp msgid "World Mods" diff --git a/lang/po/ru.po b/lang/po/ru.po index da73ab72f0049..dda299da6a425 100644 --- a/lang/po/ru.po +++ b/lang/po/ru.po @@ -35,7 +35,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Igor Kirpik , 2018\n" "Language-Team: Russian (https://www.transifex.com/cataclysm-dda-translators/teams/2217/ru/)\n" @@ -30539,8 +30539,8 @@ msgstr[3] "шарик мороженого" #: lang/json/COMESTIBLE_from_json.py msgid "A sweet, frozen food made of milk with liberal amounts of sugar." msgstr "" -"Сладкая, замороженная еда, приготовленная из молока с неограниченным " -"количеством сахара." +"Сладкая замороженная еда, приготовленная из молока с щедрым количеством " +"сахара." #: lang/json/COMESTIBLE_from_json.py msgid "dairy dessert" @@ -30595,10 +30595,10 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "frozen custard" msgid_plural "frozen custard scoops" -msgstr[0] "шарик заварного крема замороженное" -msgstr[1] "шарика заварного крема замороженное" -msgstr[2] "шариков заварного крема замороженное" -msgstr[3] "шарик заварного крема замороженное" +msgstr[0] "шарик замороженного крема" +msgstr[1] "шарика замороженного крема" +msgstr[2] "шариков замороженного крема" +msgstr[3] "шарик замороженного крема" #. ~ Description for frozen custard #: lang/json/COMESTIBLE_from_json.py @@ -30615,10 +30615,10 @@ msgstr "" #: lang/json/COMESTIBLE_from_json.py msgid "frozen yogurt" msgid_plural "frozen yogurt" -msgstr[0] "йогурт замороженное" -msgstr[1] "йогурта замороженное" -msgstr[2] "йогуртов замороженное" -msgstr[3] "йогурт замороженное" +msgstr[0] "замороженный йогурт" +msgstr[1] "замороженного йогурта" +msgstr[2] "замороженных йогуртов" +msgstr[3] "замороженный йогурт" #. ~ Description for frozen yogurt #: lang/json/COMESTIBLE_from_json.py @@ -34719,6 +34719,10 @@ msgstr "базовый дизельный двигатель" msgid "base gasoline engine" msgstr "базовый бензиновый двигатель" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "1-цилиндровый двигатель" @@ -34826,6 +34830,114 @@ msgstr "" "Крупный и очень мощный двигатель V12, обычно устанавливаемый на тяжёлые " "грузовики." +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "самодельный паровой двигатель" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "маленький паровой двигатель" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "средний паровой двигатель" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -44587,6 +44699,15 @@ msgstr "АРТЕФАКТЫ" msgid "ARMOR" msgstr "БРОНЯ" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "ящик для топлива" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "патронная лента" @@ -49993,11 +50114,11 @@ msgstr "личинка саранчи" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" -"Личинка саранчи размером с кролика. Вы с отвращением представляете, что " -"может сделать целый рой." +"Саранча размером с кролика. Вы боитесь даже представить, что может сотворить" +" рой таких существ." #: lang/json/MONSTER_from_json.py msgid "bear cub" @@ -51113,7 +51234,7 @@ msgstr "гигантская гремучая змея" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "" "Мутировавшая лесная гремучая змея, примерно в три раза больше обычного. Хотя" " она недостаточно большая, чтобы видеть в людях потенциальную добычу, её " @@ -59133,7 +59254,7 @@ msgstr "" #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" +msgid_plural "pocket watches" msgstr[0] "карманные часы" msgstr[1] "карманных часов" msgstr[2] "карманных часов" @@ -79686,7 +79807,7 @@ msgstr "" #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py msgid "This item can start fire." -msgstr "" +msgstr "С помощью этого предмета можно развести огонь." #. ~ Please leave anything in unchanged. #: lang/json/json_flag_from_json.py @@ -80813,6 +80934,10 @@ msgstr "Чинить часть" msgid "Refill tank/battery" msgstr "Восполнить бак/батарею" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "Разгрузить ящик для топлива" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "Убрать деталь" @@ -84003,7 +84128,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Find 25 Plutonium Cells" -msgstr "Найти 25 Плутониевых батареек" +msgstr "Найти 25 плутониевых батарей" #: lang/json/mission_def_from_json.py msgid "" @@ -87878,6 +88003,8 @@ msgid "" "Your body's demanding energy needs mean you can fall asleep just about " "anywhere." msgstr "" +"Ваше тело требует так много энергии, что вы можете заснуть практически где " +"угодно." #: lang/json/mutation_from_json.py msgid "Pain Resistant" @@ -88758,7 +88885,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Sweet Tooth" -msgstr "" +msgstr "Сластёна" #. ~ Description for Sweet Tooth #: lang/json/mutation_from_json.py @@ -88766,10 +88893,12 @@ msgid "" "You have a soft spot for processed foods, and gain a morale bonus from " "eating it." msgstr "" +"Вы обожаете есть приготовленную пищу и получаете бонус к морали, когда едите" +" её." #: lang/json/mutation_from_json.py msgid "Sugar-Loving" -msgstr "" +msgstr "Чипсоед" #. ~ Description for Sugar-Loving #: lang/json/mutation_from_json.py @@ -88777,6 +88906,8 @@ msgid "" "You *adore* the taste of junk food, and find it preferable to everything " "else!" msgstr "" +"Вы просто обожаете вкус разного рода нездоровой пищи и предпочитаете её всем" +" другим видам еды!" #: lang/json/mutation_from_json.py msgid "Glass Jaw" @@ -88888,7 +89019,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Prey Animal" -msgstr "" +msgstr "Жертва" #. ~ Description for Prey Animal #: lang/json/mutation_from_json.py @@ -88896,6 +89027,8 @@ msgid "" "Natural animals like dogs and wolves see you as prey, and are liable to " "attack you on sight." msgstr "" +"Лесные хищники (например, волки) рассматривают вас в качестве добычи и " +"поэтому более склонны атаковать вас." #: lang/json/mutation_from_json.py msgid "Slow Reader" @@ -90740,7 +90873,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Rodent Tail" -msgstr "" +msgstr "Хвост грызуна" #. ~ Description for Rodent Tail #: lang/json/mutation_from_json.py @@ -91253,7 +91386,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Rodent Ears" -msgstr "" +msgstr "Уши грызуна" #. ~ Description for Rodent Ears #: lang/json/mutation_from_json.py @@ -91261,6 +91394,7 @@ msgid "" "Your ears are huge, round, and gray! They're rather fascinating, and help " "you hear from a much greater distance." msgstr "" +"У вас огромные круглые серые уши! Они помогают вам слышать отдалённые звуки." #: lang/json/mutation_from_json.py msgid "Web Walker" @@ -91656,7 +91790,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Little" -msgstr "" +msgstr "Маленький" #. ~ Description for Little #: lang/json/mutation_from_json.py @@ -91664,10 +91798,13 @@ msgid "" "You've noticeably shrunk in size. You're able to move with increased " "litheness, but your smaller stature prevents you from carrying as much." msgstr "" +"Вы стали значительно меньше в размерах, чем были раньше. Вы способны " +"передвигаться более ловко, но ваш размер больше не позволяет вам таскать " +"много вещей." #: lang/json/mutation_from_json.py msgid "Tiny" -msgstr "" +msgstr "Крохотный" #. ~ Description for Tiny #: lang/json/mutation_from_json.py @@ -91678,10 +91815,14 @@ msgid "" "reduced. However, your movement is silent, and your dodge skill is a little " "higher." msgstr "" +"Вы уменьшились в размерах в два раза! Вещи, которые вы раньше поднимали без " +"труда, теперь для вас неподъёмны, вещи сковывают в два раза больше, так как " +"они стали вам велики, а очки здоровья значительно снижены. Однако вы умеете " +"передвигаться бесшумно, а ваш навык уклонения немного повышен." #: lang/json/mutation_from_json.py msgid "Unassuming" -msgstr "" +msgstr "Непритязательный" #. ~ Description for Unassuming #: lang/json/mutation_from_json.py @@ -91690,10 +91831,13 @@ msgid "" " are reduced, and you've learned to use your increased nimbleness to offset " "your reduced capacity to absorb damage." msgstr "" +"Вы в совершенстве овладели своими крохотными размерами! Скованность вещей и " +"штрафы к весу предметов теперь снижены, а вы научились использовать своё " +"проворство для компенсации сниженных возможностей по поглощению урона." #: lang/json/mutation_from_json.py msgid "Crafty" -msgstr "" +msgstr "Хитрый" #. ~ Description for Crafty #: lang/json/mutation_from_json.py @@ -91701,6 +91845,8 @@ msgid "" "By making the most of your small stature, you can avoid the notice of all " "but the most perceptive creatures, and your speed is greatly increased." msgstr "" +"Ваш маленький рост позволяет вам избегать обнаружения всеми, за исключением " +"самых глазастых существ. Также ваша скорость значительно увеличена." #: lang/json/mutation_from_json.py msgid "Metallassomaiphile" @@ -92000,7 +92146,7 @@ msgstr "%1$s кусает противника (%2$s)" #: lang/json/mutation_from_json.py msgid "Rodent Muzzle" -msgstr "" +msgstr "Морда грызуна" #. ~ Description for Rodent Muzzle #: lang/json/mutation_from_json.py @@ -92182,7 +92328,7 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Metabolic Rehydration" -msgstr "" +msgstr "Метаболитическая регидратация" #. ~ Description for Metabolic Rehydration #: lang/json/mutation_from_json.py @@ -92190,6 +92336,8 @@ msgid "" "Your body gets all the hydration it needs from the food that you eat! You " "no longer need to drink water." msgstr "" +"Ваше тело получает всю необходимую влагу из еды! Вам больше не нужно пить " +"для утоления жажды." #: lang/json/mutation_from_json.py msgid "Very Heavy Sleeper" @@ -93228,14 +93376,14 @@ msgstr "" #: lang/json/mutation_from_json.py msgid "Diminutive" -msgstr "" +msgstr "Миниатюрный" #. ~ Description for Diminutive #: lang/json/mutation_from_json.py msgid "" "So much food, everywhere! And nobody's even guarding it anymore! These are" " good times." -msgstr "" +msgstr "Везде так много еды! И никто её больше не охраняет! Просто сказка!" #: lang/json/mutation_from_json.py msgid "Marloss Gateway" @@ -94202,7 +94350,7 @@ msgstr "Бандит" #: lang/json/npc_from_json.py msgid "Psycho" -msgstr "" +msgstr "Психо" #: lang/json/npc_from_json.py msgid "Raider" @@ -94944,6 +95092,10 @@ msgstr "общественный туалет" msgid "roadside foodcart" msgstr "придорожная столовая" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "гараж - заправка" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "кладбище" @@ -95271,8 +95423,8 @@ msgid "stadium parking" msgstr "парковка стадиона" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" -msgstr "концессии стадиона" +msgid "stadium" +msgstr "стадион" #: lang/json/overmap_terrain_from_json.py msgid "stadium entrance" @@ -95339,8 +95491,8 @@ msgid "trailer park" msgstr "трейлерный парк" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" -msgstr "" +msgid "mass grave" +msgstr "массовое захоронение" #: lang/json/overmap_terrain_from_json.py msgid "abandoned drive-through" @@ -95419,11 +95571,11 @@ msgid "Bankrupt Pizzeria" msgstr "разорённая пиццерия" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "аренда лодок" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "строение на берегу" #: lang/json/overmap_terrain_from_json.py @@ -95452,7 +95604,7 @@ msgstr "местное отделение жизни в диких услови #: lang/json/overmap_terrain_from_json.py msgid "VFW hall" -msgstr "" +msgstr "VFW-холл" #: lang/json/overmap_terrain_from_json.py msgid "apartment towers" @@ -95629,15 +95781,23 @@ msgstr "электрическая подстанция" #: lang/json/overmap_terrain_from_json.py msgid "animal clinic" -msgstr "" +msgstr "ветеринарная клиника" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" -msgstr "стадион" +msgid "war memorial" +msgstr "военный мемориал" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" -msgstr "" +msgid "ruined cabin - barn" +msgstr "разрушенная хижина - амбар" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "разрушенная хижина - стоянка" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" +msgstr "разрушенная хижина - грязная площадь" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -114348,6 +114508,8 @@ msgstr " обезоруживает %s" #: lang/json/technique_from_json.py msgid "Down 1 turn, knockback 1 tile, min 3 unarmed" msgstr "" +"Сбивание с ног на 1 ход, отбрасывание на 1 тайл, минимум 3 уровень " +"безоружного боя" #: lang/json/technique_from_json.py lang/json/technique_from_json.py #: src/monster.cpp @@ -119567,6 +119729,10 @@ msgstr "К9 полицейский транспорт" msgid "SWAT Truck" msgstr "фургон спецназа" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "паровой трактор" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "автоматический трактор" @@ -119900,6 +120066,7 @@ msgstr "дверь" #: lang/json/vehicle_part_from_json.py msgid "A door. Has a window so you can see out of it, even when closed." msgstr "" +"Дверь. Имеет окно, так что можно смотреть через нее даже когда закрыта." #: lang/json/vehicle_part_from_json.py msgid "opaque door" @@ -119953,7 +120120,7 @@ msgstr "люк" #. ~ Description for hatch #: lang/json/vehicle_part_from_json.py msgid "A strong door. A window lets you see through it when closed." -msgstr "" +msgstr "Крепкая дверь. Окно позволяет смотреть через закрытую дверь. " #: lang/json/vehicle_part_from_json.py msgid "opaque hatch" @@ -119966,7 +120133,7 @@ msgstr "тяжёлый люк" #. ~ Description for heavy duty hatch #: lang/json/vehicle_part_from_json.py msgid "A very strong door. A window lets you see through it when closed." -msgstr "" +msgstr "Очень крепкая дверь. Окно позволяет смотреть через закрытую дверь." #: lang/json/vehicle_part_from_json.py msgid "opaque heavy duty hatch" @@ -119991,7 +120158,7 @@ msgstr "" #. ~ Description for blade #: lang/json/vehicle_part_from_json.py msgid "A blade, welded to the vehicle, for cutting up zombies." -msgstr "" +msgstr "Клинок, приваренный к транспорту для вырезания зомби." #. ~ Description for spike #: lang/json/vehicle_part_from_json.py @@ -120323,7 +120490,7 @@ msgstr "дверь багажника" #. ~ Description for trunk door #: lang/json/vehicle_part_from_json.py msgid "A short door. You can always see over it, open or closed." -msgstr "" +msgstr "Небольшая дверь. Вы всегда видите через нее, открытую или закрытую." #: lang/json/vehicle_part_from_json.py msgid "heavy duty trunk door" @@ -120333,6 +120500,8 @@ msgstr "тяжёлая дверь багажника" #: lang/json/vehicle_part_from_json.py msgid "A strong, short door. You can always see over it, open or closed." msgstr "" +"Укрепленная, небольшая дверь. Вы всегда видите через нее, открытую или " +"закрытую." #: lang/json/vehicle_part_from_json.py msgid "shutter door" @@ -120345,7 +120514,7 @@ msgstr "раздвижная дверь" #. ~ Description for sliding door #: lang/json/vehicle_part_from_json.py msgid "A door. A window lets you see through it when closed." -msgstr "" +msgstr "Дверь. Окно позволяет смотреть через закрытую дверь." #: lang/json/vehicle_part_from_json.py msgid "cargo space" @@ -120362,10 +120531,13 @@ msgid "" "next to you, or to release the animal currently contained. When selecting " "an animal to capture, choose its tile relative to you, not the part." msgstr "" +"Хранилище для перевозки скота. Осмотрите (по-умолчанию \"e\") для помещения " +"животного за Вами или выгрузки уже погруженного. При выборе животного для " +"погрузки выберете тайл относительно Вас, не хранилища." #: lang/json/vehicle_part_from_json.py msgid "animal compartment" -msgstr "" +msgstr "отделение для животных" #. ~ Description for animal compartment #: lang/json/vehicle_part_from_json.py @@ -120375,6 +120547,10 @@ msgid "" "selecting an animal to capture, choose its tile relative to you, not the " "part." msgstr "" +"Большое хранилище для транспортировки небольших животных. Осмотрите (по-" +"умолчанию \"e\") для помещения животного за Вами или выгрузки уже " +"погруженного. При выборе животного для погрузки выберете тайл относительно " +"Вас, не хранилища." #. ~ Description for UPS-compatible recharging station #: lang/json/vehicle_part_from_json.py @@ -120382,6 +120558,8 @@ msgid "" "A recharger for UPS devices. When turned on, it charges any UPS devices in " "the cargo space." msgstr "" +"Зарядка для УБП устройств. При включении заряжает УБП устройства в " +"хранилище." #: lang/json/vehicle_part_from_json.py msgid "wing mirror" @@ -120393,6 +120571,8 @@ msgid "" "A small mirror, mounted outside the vehicle. If you see the mirror, your " "vision is expanded as though you were standing where the mirror is." msgstr "" +"Небольшое зеркало, прикрепленное снаружи транспорта. Если Вы видите зеркало," +" Ваше зрение расширяется так, как будто стоите на его месте." #: lang/json/vehicle_part_from_json.py msgid "inboard mirror" @@ -120404,11 +120584,13 @@ msgid "" "A small mirror, mounted inside the vehicle. If you see the mirror, your " "vision is expanded as though you were standing where the mirror is." msgstr "" +"Небольшое зеркало, закрепленное внутри транспорта. Если Вы видите зеркало, " +"Ваше зрение расширяется так, как будто стоите на его месте." #. ~ Description for stereo system #: lang/json/vehicle_part_from_json.py msgid "A stereo system. When turned on, it plays music, improving your mood." -msgstr "" +msgstr "Стереосистема. При включении играет музыку и улучает Ваше настроение." #: lang/json/vehicle_part_from_json.py src/vehicle_use.cpp msgid "chimes" @@ -120420,6 +120602,9 @@ msgid "" "A collection of electronic bells. Use the vehicle's controls to turn it on " "or off. When turned on, it makes noise, attracting neighborhood children." msgstr "" +"Коллекция электронных звонков. Используйте управление транспорта для " +"включения или выключения. При включении производит шум, привлекающий " +"соседских детей." #. ~ Description for jumper cable #: lang/json/vehicle_part_from_json.py @@ -120444,7 +120629,7 @@ msgstr "деревянное сидение" #. ~ Description for wooden seat #: lang/json/vehicle_part_from_json.py msgid "A place to sit." -msgstr "" +msgstr "Место для сиденья." #: lang/json/vehicle_part_from_json.py msgid "wooden spike" @@ -120456,6 +120641,8 @@ msgid "" "A wooden spike, attached to the vehicle, to increase injury when crashing " "into things." msgstr "" +"Деревянный штырь, прикрепленный к транспорту. Увеличивает урон при " +"столкновении с чем-либо." #: lang/json/vehicle_part_from_json.py msgid "wooden door" @@ -120497,6 +120684,9 @@ msgid "" "it will allow you to remotely open the door or curtain from the vehicle " "controls." msgstr "" +"Маленький электрический мотор, установленный на той же раме, что и дверь или" +" занавеска. Позволяет удаленно управлять дверью или занавеской через панель " +"управления." #. ~ Description for drive by wire controls #: lang/json/vehicle_part_from_json.py @@ -120506,6 +120696,10 @@ msgid "" "the tile or attempt to pick-up items (default ',') to access the controls, " "or use the vehicle control key (default '^')." msgstr "" +"Сложная электронная система управления, позволяющая контролировать транспорт" +" удаленно, без присутствия в нем. Вы можете «e» изучить тайл или попытаться " +"поднять предметы (по умолчанию «,»), чтобы получить доступ к управлению, или" +" использовать клавишу управления (по умолчанию «^»)." #: lang/json/vehicle_part_from_json.py msgid "camera control system" @@ -120519,12 +120713,19 @@ msgid "" "can 'e'xamine the tile or attempt to pick-up items (default ',') to access " "the controls, or use the vehicle control key (default '^')." msgstr "" +"LCD экран, подключенный к одной или несколько камер. Во включенном режиме " +"позволяет видеть через камеры, но потребляет энергию из батарей транспорта. " +"Вы можете \"e\" изучить тайл или поднять предметы(по-умолчанию \",\"), чтобы" +" получить доступ к управлению, или использовать клавишу управления (по " +"умолчанию «^»). " #. ~ Description for security camera #: lang/json/vehicle_part_from_json.py msgid "" "A small camera. Will relay what it can see to a camera control station." msgstr "" +"Небольшая камера. Передает изображение, что можно увидеть на панели " +"управления камер." #: lang/json/vehicle_part_from_json.py msgid "robot controls" @@ -120536,11 +120737,12 @@ msgid "" "A set of controls to allow a vehicle to drive itself, or you to drive it " "remotely using a controller." msgstr "" +"Управление, позволяющий вести транспорт самому или удаленно с контроллером." #. ~ Description for clock #: lang/json/vehicle_part_from_json.py msgid "A clock, so you know what time it is." -msgstr "" +msgstr "Часы, что бы знать сколько времени." #. ~ Description for leather funnel #. ~ Description for makeshift funnel @@ -120548,7 +120750,7 @@ msgstr "" #. ~ Description for metal funnel #: lang/json/vehicle_part_from_json.py msgid "A funnel that will collect rainwater into the tank beneath it." -msgstr "" +msgstr "Воронка, собирающая дождевую воду в бак под ней." #: lang/json/vehicle_part_from_json.py src/vehicle_use.cpp msgid "scoop" @@ -120561,6 +120763,9 @@ msgid "" " will scoop up any loose items that it travels over, putting them into the " "vehicle's storage." msgstr "" +"Отвал. Используется панель управления транспорта для включения или " +"выключения. При включении отвал черпает незакрепленные предметы, помещая их " +"в хранилище транспорта." #. ~ Description for water purifier #: lang/json/vehicle_part_from_json.py @@ -120569,6 +120774,9 @@ msgid "" "purify water in a container or in the vehicle's tanks. 'e'xamine the tile " "with the purifier to use it." msgstr "" +"Водный фильтр, запитанный от батарей транспорта. Можно использовать для " +"очистки воды в ёмкости или баках транспорта. Осмотрите(по-умолчанию \"e\") " +"тайл с фильтром для использования." #. ~ Description for plow #: lang/json/vehicle_part_from_json.py @@ -120578,6 +120786,10 @@ msgid "" "planting seeds. It should be placed in front of any seed drills on the " "vehicle." msgstr "" +"Плуг. Используйте панель управления транспорта для включения или выключения." +" После включения создает борозду в любой почве при движении через нее. Почва" +" после готова к посадке семян. Должно быть установлено перед любой " +"посадочной машиной." #. ~ Description for seed drill #. ~ Description for advanced seed drill @@ -120638,6 +120850,8 @@ msgid "" "Improvised armor plate. Will partially protect other components on the same" " frame from damage." msgstr "" +"Самодельная пластинчатая броня. Будет частично защищать другие части " +"автомобиля на том же участке рамы от повреждений." #. ~ Description for shock absorber #: lang/json/vehicle_part_from_json.py @@ -120653,6 +120867,8 @@ msgid "" "A battery for storing electrical power, and discharging it to power " "electrical devices built into the vehicle." msgstr "" +"Батарея для хранения или отдачи электрической энергии. Питает встроенные " +"устройства в транспорт." #: lang/json/vehicle_part_from_json.py msgid "swappable storage battery" @@ -120677,6 +120893,8 @@ msgid "" "A metal wall. Keeps zombies outside the vehicle and prevents people from " "seeing through it." msgstr "" +"Металлическая стена. Держит зомби вне транспорта и не позволяет быть " +"обнаруженным через них." #: lang/json/vehicle_part_from_json.py msgid "cloth board" @@ -120688,6 +120906,8 @@ msgid "" "A cloth wall. Keeps zombies outside the vehicle and prevents people from " "seeing through it." msgstr "" +"Тряпичная стена. Держит зомби вне транспорта и не позволяет быть " +"обнаруженным через них." #: lang/json/vehicle_part_from_json.py msgid "cloth quarterpanel" @@ -120793,6 +121013,8 @@ msgid "" "Storage space, mounted outside your vehicle's armor and vulnerable to " "damage." msgstr "" +"Место для хранения, закрепленное на внешнем корпусе транспорта и " +"невосприимчивое для урона." #: lang/json/vehicle_part_from_json.py msgid "external wire bike basket" @@ -120803,16 +121025,24 @@ msgid "external cargo rack" msgstr "внешний грузовой стеллаж" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." -msgstr "" +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "Двигатель внутреннего сгорания. Сжигает топливо в баке транспорта." + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "Двигатель внутреннего сгорания. Сжигает дизель в баке транспорта." + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." +msgstr "Двигатель внутреннего сгорания. Сжигает газ в баке транспорта." #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" +"Внешний двигатель внутреннего сгорания замкнутого цикла. Сжигает уголь из " +"бункера для производства пара." #: lang/json/vehicle_part_from_json.py msgid "boom crane" @@ -121122,6 +121352,14 @@ msgstr "внешний бак (200 л)" msgid "barrel (100L)" msgstr "бочка (100 л)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "cмонтированный огнемёт" @@ -121182,7 +121420,7 @@ msgstr "смонтированная плазменная пушка" #. ~ Description for roller drum #: lang/json/vehicle_part_from_json.py msgid "A strong metal wheel." -msgstr "" +msgstr "Укрепленное металлическое колесо." #: lang/json/vehicle_part_from_json.py msgid "roller drum" @@ -121200,7 +121438,7 @@ msgstr "колесо (управляемое)" #. ~ Description for armored wheel #: lang/json/vehicle_part_from_json.py msgid "A very strong, armored metal wheel." -msgstr "" +msgstr "Хорошо укрепленное, бронированное металлическое колесо." #: lang/json/vehicle_part_from_json.py msgid "armored wheel (steerable)" @@ -121211,12 +121449,12 @@ msgstr "бронированное колесо (управляемое)" #. ~ Description for unicycle wheel #: lang/json/vehicle_part_from_json.py msgid "A small wheel." -msgstr "" +msgstr "Маленькое колесо." #. ~ Description for bicycle wheel #: lang/json/vehicle_part_from_json.py msgid "A thin bicycle wheel." -msgstr "" +msgstr "Тонкое велосипедное колесо." #: lang/json/vehicle_part_from_json.py msgid "bicycle wheel (steerable)" @@ -121236,7 +121474,7 @@ msgstr "" #. ~ Description for motorbike wheel #: lang/json/vehicle_part_from_json.py msgid "A small wheel from a motorcycle." -msgstr "" +msgstr "Маленькое колесо от мотоцикла." #: lang/json/vehicle_part_from_json.py msgid "motorbike wheel (steerable)" @@ -121257,13 +121495,14 @@ msgstr "колесо от кресла-каталки" #. ~ Description for wheelchair wheel #: lang/json/vehicle_part_from_json.py msgid "A pair of wheelchair wheels." -msgstr "" +msgstr "Пара колёс от кресла-каталки" #. ~ Description for wide wheel #: lang/json/vehicle_part_from_json.py msgid "" "A wide wheel that provides more traction and better off-road performance." msgstr "" +"Широкое колесо. Дает больше управляемость и улучшает внедорожное движение." #: lang/json/vehicle_part_from_json.py msgid "wide wheel (steerable)" @@ -121324,7 +121563,7 @@ msgstr "смонтированная установка ПТУР" #: lang/json/vehicle_part_from_json.py msgid "ATGM turret" -msgstr "" +msgstr "турель ПТУР" #: lang/json/vehicle_part_from_json.py msgid "30mm chaingun" @@ -122013,7 +122252,7 @@ msgstr "" #: lang/json/vehicle_part_from_json.py msgid "TEC-9 turret" -msgstr "" +msgstr "турель с TEC-9" #: lang/json/vehicle_part_from_json.py msgid "automated TEC-9" @@ -122021,7 +122260,7 @@ msgstr "" #: lang/json/vehicle_part_from_json.py msgid "Uzi turret" -msgstr "" +msgstr "турель с Узи" #: lang/json/vehicle_part_from_json.py msgid "automated Uzi" @@ -122461,6 +122700,12 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -122893,22 +123138,26 @@ msgstr "Вы обнаружили %s!" #: src/activity_handlers.cpp msgid "You don't trust the quality of your tools, but carry on anyway." msgstr "" +"Вы сомневаетесь в качестве своих инструментов, но всё равно продолжаете." #: src/activity_handlers.cpp msgid "None of your tools are sharp and precise enough to do that." msgstr "" +"Ни один из ваших инструментов остр и точен настолько, чтобы им можно было " +"выполнить эту операцию." #: src/activity_handlers.cpp msgid "You could use a better tool, but this will do." msgstr "" +"Вы могли бы использовать инструмент лучшего качества, но и этот сойдёт." #: src/activity_handlers.cpp msgid "This tool is great, but you still would like a scalpel." -msgstr "" +msgstr "Этот инструмент хорош, но вы бы всё равно предпочли скальпель." #: src/activity_handlers.cpp msgid "You dissect the corpse with a trusty scalpel." -msgstr "" +msgstr "Вы разделываете тушу своим верным скальпелем." #: src/activity_handlers.cpp msgid "" @@ -122945,41 +123194,44 @@ msgstr "Для полной разделки такой большой туши #: src/activity_handlers.cpp msgid "" "It would be futile to search for implants inside this badly damaged corpse." -msgstr "" +msgstr "В настолько повреждённой туше бесполезно искать имплантаты." #: src/activity_handlers.cpp msgid "This corpse is already field dressed." -msgstr "" +msgstr "Эта туша уже подверглась полевой разделке." #: src/activity_handlers.cpp msgid "This corpse is too small to quarter without damaging." -msgstr "" +msgstr "Эта туша слишком мала, чтобы её можно было четвертовать, не повредив." #: src/activity_handlers.cpp msgid "This is already quartered." -msgstr "" +msgstr "Эта туша уже четвертована." #: src/activity_handlers.cpp msgid "You need to perform field dressing before quartering." msgstr "" +"Необходимо провести полевую разделку, прежде чем четвертовать эту тушу." #: src/activity_handlers.cpp msgid "You clench your teeth at the prospect of this gruesome job." -msgstr "" +msgstr "Сжав зубы, вы принялись за эту отвратительную работу." #: src/activity_handlers.cpp msgid "This will haunt you in your dreams." -msgstr "" +msgstr "Это будет преследовать вас в ночных кошмарах." #: src/activity_handlers.cpp msgid "" "You try to look away, but this gruesome image will stay on your mind for " "some time." msgstr "" +"Вы стараетесь не смотреть, но это отвратительное изображение всё равно стоит" +" у вас перед глазами." #: src/activity_handlers.cpp msgid "It needs a coffin, not a knife." -msgstr "" +msgstr "\"Этому\" нужен гроб, а не нож." #: src/activity_handlers.cpp msgid "You harvest some fluid bladders!" @@ -123035,23 +123287,31 @@ msgid "" "You suspect there might be bionics implanted in this corpse, that careful " "dissection might reveal." msgstr "" +"Вы подозреваете, что в этом теле может быть имплантирована бионика, которую " +"можно было бы достать при аккуратном вскрытии." #: src/activity_handlers.cpp msgid "" "Your butchering tool encounters something implanted in this corpse, but your" " rough cuts destroy it." msgstr "" +"При разделке ваш инструмент наткнулся на какой-то имплантат, но ваши " +"неаккуратные разрезы уничтожили его." #: src/activity_handlers.cpp msgid "" "You find traces of implants in the body, but you care only for the flesh." msgstr "" +"При разделке вы нашли следы каких-то имплантатов, но вас интересует только " +"плоть." #: src/activity_handlers.cpp msgid "" "You found some bionics in the body, but harvesting them would require more " "surgical approach." msgstr "" +"Вы нашли бионические имплантаты в теле, но чтобы добыть их, потребуется " +"более хирургический подход." #: src/activity_handlers.cpp msgid "Your clumsy butchering destroys the flesh!" @@ -123074,7 +123334,7 @@ msgstr "Вы добыли: %s" #: src/activity_handlers.cpp #, c-format msgid "You roughly slice the corpse of %s into four parts and set them aside." -msgstr "" +msgstr "Вы грубо разделали тушу (%s) на четыре части и отложили их в сторону." #: src/activity_handlers.cpp msgid "There's no corpse to butcher!" @@ -123085,12 +123345,16 @@ msgid "" "You hack up the corpse so unskillfully, that there is nothing left to " "salvage from this bloody mess." msgstr "" +"Вы так неаккуратно разделали тушу, что в этом кровавом месиве не осталось " +"ничего ценного." #: src/activity_handlers.cpp msgid "" "You wanted to cut the corpse, but instead you hacked the meat, spilled the " "guts all over it, and made a bloody mess." msgstr "" +"Вы хотели разделать тушу, но у вас получилось лишь превратить её в кровавую " +"массу, разбрызганную по округе." #: src/activity_handlers.cpp msgid "" @@ -123112,6 +123376,8 @@ msgid "" "You apply few quick cuts to the %s and leave what's left of it for " "scavengers." msgstr "" +"Вы сделали несколько быстрых разрезов на туше (%s) и оставили все остальное " +"падальщикам." #: src/activity_handlers.cpp #, c-format @@ -123123,38 +123389,48 @@ msgid "" "You unskillfully hack up the corpse and chop off some excess body parts. " "You're left wondering how you did so poorly." msgstr "" +"Вы неаккуратно разделали тушу и отрубили несколько лишних частей тела. " +"Теперь вы стоите и недоумеваете, почему так вышло." #: src/activity_handlers.cpp msgid "" "Your unskilled hands slip and damage the corpse. You still hope it's not a " "total waste though." msgstr "" +"Из-за недостатка опыта вы допустили несколько ошибок и повредили тушу. " +"Впрочем, вы всё ещё надеетесь, что не всё так плохо." #: src/activity_handlers.cpp msgid "" "You did something wrong and hacked the corpse badly. Maybe it's still " "recoverable." msgstr "" +"При разделке что-то пошло не так, и вы сильно повредили тушу. Возможно, из " +"неё ещё можно добыть что-нибудь полезное." #: src/activity_handlers.cpp #, c-format msgid "You field dress the %s." -msgstr "" +msgstr "Вы осуществили полевую разделку туши (%s)." #: src/activity_handlers.cpp msgid "" "You slice the corpse's belly and remove intestines and organs, until you're " "confident that it will not rot from inside." msgstr "" +"Вы вскрыли живот туши и удалил оттуда внутренние органы и требуху. Теперь вы" +" уверены, что она не сгниёт изнутри." #: src/activity_handlers.cpp msgid "You remove guts and excess parts, preparing the corpse for later use." msgstr "" +"Вы удалили все внутренности и лишние части, подготовив тушу для дальнейшего " +"использования." #: src/activity_handlers.cpp #, c-format msgid "You finish dissecting the %s." -msgstr "" +msgstr "Вы закончили вскрывать тело (%s)." #: src/activity_handlers.cpp #, c-format @@ -123563,7 +123839,7 @@ msgstr "Вы вскопали все доступные участки." #: src/activity_handlers.cpp msgid "You planted all seeds you could." -msgstr "" +msgstr "Вы посадили все доступные семена." #: src/activity_item_handling.cpp #, c-format @@ -125643,7 +125919,7 @@ msgstr "Вы ошиблись при удалении." #: src/bionics.cpp msgid " flubs the removal." -msgstr "" +msgstr " ошибается при удалении." #: src/bionics.cpp msgid "You mess up the removal." @@ -125651,7 +125927,7 @@ msgstr "Вы напутали в удалении." #: src/bionics.cpp msgid " messes up the removal." -msgstr "" +msgstr " косячит при удалении." #: src/bionics.cpp msgid "The removal fails." @@ -125667,35 +125943,38 @@ msgstr "Вы запороли удаление." #: src/bionics.cpp msgid " screws up the removal." -msgstr "" +msgstr " запарывает удаление." #: src/bionics.cpp #, c-format msgid "%s body is severely damaged!" -msgstr "" +msgstr "Тело %s сильно повреждено!" #: src/bionics.cpp msgid "You prep to begin surgery." -msgstr "" +msgstr "Вы подготавливаетесь к проведению операции." #: src/bionics.cpp msgid " prepares for surgery." -msgstr "" +msgstr " подготавливается к проведению операции." #: src/bionics.cpp #, c-format msgid "A lifetime of Autodoc use has taught %s a thing or two..." msgstr "" +"Работая всю свою жизнь с автодоком, %s может продемонстрировать пару " +"фокусов..." #: src/bionics.cpp #, c-format msgid "%s don't have this bionic installed." -msgstr "" +msgstr "У %s не установлена эта бионика." #: src/bionics.cpp #, c-format msgid "Removing %s Fusion Blaster Arm would leave %s with a useless stump." msgstr "" +"Удалив %s термоядерный бластер, %s получишь вместо руки бесполезную культю." #: src/bionics.cpp msgid "" @@ -125706,7 +125985,7 @@ msgstr "" #: src/bionics.cpp #, c-format msgid "%s must remove the %s bionic to remove the %s." -msgstr "" +msgstr "%s должен удалить бионику %s, прежде чем удалять %s." #: src/bionics.cpp #, c-format @@ -125714,6 +125993,8 @@ msgid "" "The Telescopic Lenses are part of %s eyes now. Removing them would leave %s" " blind." msgstr "" +"%s телескопические линзы теперь являются частью глаз. Удалив их, %s " +"ослепнешь." #: src/bionics.cpp msgid "Are you sure you wish to uninstall the selected bionic?" @@ -125742,11 +126023,11 @@ msgstr "Удалена бионика: %s." #: src/bionics.cpp msgid "You jiggle the parts back into their familiar places." -msgstr "" +msgstr "Вы вставили части в их родные места." #: src/bionics.cpp msgid " jiggles the parts back into their familiar places." -msgstr "" +msgstr " вставляет части в их родные места." #: src/bionics.cpp #, c-format @@ -125813,13 +126094,13 @@ msgstr "Успешно установлено %s." #, c-format msgctxt "memorial_male" msgid "Failed install of bionic: %s." -msgstr "" +msgstr "Неудачная установка бионики: %s." #: src/bionics.cpp #, c-format msgctxt "memorial_female" msgid "Failed install of bionic: %s." -msgstr "" +msgstr "Неудачная установка бионики: %s." #: src/bionics.cpp msgid "The installation fails without incident." @@ -125831,7 +126112,7 @@ msgstr "Вы ошиблись при установке." #: src/bionics.cpp msgid " flubs the installation." -msgstr "" +msgstr " ошибается при установке." #: src/bionics.cpp msgid "You mess up the installation." @@ -125839,7 +126120,7 @@ msgstr "Вы напутали в установке." #: src/bionics.cpp msgid " messes up the installation." -msgstr "" +msgstr " косячит при установке." #: src/bionics.cpp msgid "The installation fails." @@ -125855,7 +126136,7 @@ msgstr "Вы запороли установку." #: src/bionics.cpp msgid " screws up the installation." -msgstr "" +msgstr " запарывает установку." #. ~"Complications" is USian medical-speak for "unintended damage from a #. medical procedure". @@ -125863,6 +126144,8 @@ msgstr "" #, c-format msgid "%s training helps %s minimize the complications." msgstr "" +"%s опыт работы в медицине сведёт осложнения к минимуму, когда %s будешь " +"заниматься бионикой." #: src/bionics.cpp msgid "It really hurts!" @@ -125871,7 +126154,7 @@ msgstr "Ужасно больно!" #: src/bionics.cpp #, c-format msgid "%s body is damaged!" -msgstr "" +msgstr "Тело %s повреждено!" #: src/bionics.cpp msgid "The installation is faulty!" @@ -125880,7 +126163,7 @@ msgstr "Вы устанавливаете глюк!" #: src/bionics.cpp #, c-format msgid "%s lose power capacity!" -msgstr "" +msgstr "%s теряешь запас энергии!" #: src/bionics.cpp #, c-format @@ -125926,23 +126209,27 @@ msgstr "Бионика %s выходит из строя и разрушаетс msgid "" "You set up the operation step-by-step, configuring the Autodoc to manipulate" " a CBM" -msgstr "" +msgstr "Вы шаг за шагом настраиваете автодок для манипуляций с КБМ." #: src/bionics.cpp msgid "" " sets up the operation, configuring the Autodoc to manipulate a " "CBM." -msgstr "" +msgstr " шаг за шагом настраивает автодок для манипуляций с КБМ." #: src/bionics.cpp msgid "" "You settle into position, sliding your right wrist into the couch's strap." msgstr "" +"Вы занимаете положенное место и продеваете правую руку в петлю, " +"прикреплённую к кушетке." #: src/bionics.cpp msgid "" " settles into position, sliding their wrist into the couch's strap." msgstr "" +" занимает положенное место и продевает правую руку в петлю, " +"прикреплённую к кушетке." #: src/bionics.cpp msgid "" @@ -126187,7 +126474,7 @@ msgstr "%d:%02d:%02d%sPM" #: src/calendar.cpp msgid "End times" -msgstr "" +msgstr "Конец времён" #. ~ 1 is the year, 2 is the day (of the *year*), 3 is the time of the day in #. its usual format @@ -126449,17 +126736,17 @@ msgstr "Правая нога" #: src/character.cpp #, c-format msgid "(bandaged [%s] & disinfected [%s])" -msgstr "" +msgstr "(перебинтовано [%s] и продезинфицировано [%s])" #: src/character.cpp #, c-format msgid "(bandaged [%s])" -msgstr "" +msgstr "(перебинтовано [%s])" #: src/character.cpp #, c-format msgid "(disinfected [%s])" -msgstr "" +msgstr "(продезинфицировано [%s])" #: src/character.cpp #, c-format @@ -127980,10 +128267,11 @@ msgstr "Это выглядит несъедобным в текущем вид #: src/consumption.cpp msgid "It's frozen solid. You must defrost it before you can eat it." msgstr "" +"Этот продукт заморожен. Его нужно разморозить, чтобы его можно было есть." #: src/consumption.cpp msgid "You can't drink it while it's frozen." -msgstr "" +msgstr "Невозможно пить замороженные напитки." #: src/consumption.cpp src/player.cpp #, c-format @@ -128166,6 +128454,8 @@ msgid "" "You try to ignore its mushy texture, but it leaves you with an awful " "aftertaste." msgstr "" +"Вы стараетесь не обращать внимания на кашицеобразную текстуру, но во рту всё" +" равно присутствует ужасное послевкусие." #: src/consumption.cpp msgid "Yuck! How can anybody eat this stuff?" @@ -128173,15 +128463,15 @@ msgstr "Фу! Как можно есть эту дрянь?" #: src/consumption.cpp msgid "Mmm, junk food." -msgstr "" +msgstr "Ммм, нездоровая пища." #: src/consumption.cpp msgid "When life's got you down, there's always sugar." -msgstr "" +msgstr "Даже если весь мир разрушен, всегда есть сахар." #: src/consumption.cpp msgid "They may do what they must... you've already won." -msgstr "" +msgstr "Они могут делать что хотят... вы всё равно выиграли." #: src/consumption.cpp msgid "Your stomach begins gurgling and you feel bloated and ill." @@ -128485,7 +128775,8 @@ msgstr[3] "Понадобится %s с %d зарядом." #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "Ничего особенного." @@ -128821,6 +129112,42 @@ msgstr "Вы нанесли существу (%s) урон %d." msgid "%1$s shoots %2$s." msgstr "%1$s стреляет в %2$s." +#: src/creature.cpp +msgid "Severe pain" +msgstr "Серьёзная боль" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "Сильная боль" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "Невыносимая боль" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "Тревожащая боль" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "Беспокоящая боль" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "Умеренная боль" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "Небольшая боль" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "Минимальная боль" + +#: src/creature.cpp +msgid "No pain" +msgstr "Нет боли" + #: src/creature.cpp msgid "Hostile" msgstr "Враждебные" @@ -129097,6 +129424,8 @@ msgid "" "NPC: \n" "%s\n" msgstr "" +"НПС: \n" +"%s\n" #: src/debug_menu.cpp #, c-format @@ -130511,7 +130840,7 @@ msgstr "громкий хлопок!" #: src/explosion.cpp msgid "a" -msgstr "" +msgstr "один" #: src/explosion.cpp msgid "many" @@ -132581,16 +132910,17 @@ msgstr "Мир не удалён. Оставшиеся персонажи: %s" msgid "Wait till you wake up..." msgstr "Ожидайте, пока ваш персонаж не проснётся..." -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "" -" (Y) Да, (N) Нет, (I) Игнорировать дальнейшие предупреждения и завершить." - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s. Авто-движение отменено." +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" +" (Y) Да, (N) Нет, (I) Игнорировать последующие предупреждения такого вида и " +"завершить." + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -133845,15 +134175,15 @@ msgstr "Вскапывает ближайшие зоны типа \"Фермер #: src/game.cpp msgid "Plant seeds... it is too cold for planting" -msgstr "" +msgstr "Посадить семена... слишком холодно для посадки" #: src/game.cpp msgid "Plant seeds" -msgstr "" +msgstr "Посадить семена" #: src/game.cpp msgid "Plant seeds... you don't have any" -msgstr "" +msgstr "Посадить семена... у вас их нет" #: src/game.cpp msgid "" @@ -133875,7 +134205,7 @@ msgstr "Слишком холодно, чтобы что-то сажать." #: src/game.cpp msgid "You don't have any seeds." -msgstr "" +msgstr "У вас нет семян." #: src/game.cpp msgid "You pull a handbrake." @@ -134091,7 +134421,7 @@ msgstr "%s некуда идти!" msgid "Use which item?" msgstr "Какой предмет использовать?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "Неважно" @@ -134105,41 +134435,49 @@ msgstr "Что изучить?" #: src/game.cpp msgid "There is a fire here." -msgstr "" +msgstr "Здесь огонь." #: src/game.cpp msgid "It's too big and unpredictable to evaluate how long it will last." msgstr "" +"Он слишком большой и непредсказуемый, чтобы вычислить, сколько он ещё будет " +"гореть." #: src/game.cpp msgid "It's going to go out soon without extra fuel." -msgstr "" +msgstr "Без дополнительного топлива он скоро потухнет." #: src/game.cpp #, c-format msgid "" "Without extra fuel it might burn yet for %s, but might also go out sooner." -msgstr "" +msgstr "Без дополнительного топлива он будет гореть приблизительно %s." #: src/game.cpp msgid "" "It's quite decent and looks like it'll burn for a bit without extra fuel." msgstr "" +"Он хорошо горит и, судя по всему, будет гореть ещё какое-то время без " +"дополнительного времени." #: src/game.cpp msgid "It's looks solid, and will burn for a few hours without extra fuel." msgstr "" +"Он хорошо горит и без дополнительного топлива будет продолжать делать это " +"ещё несколько часов." #: src/game.cpp msgid "" "It's very well supplied and even without extra fuel might burn for at least " "s part of a day." msgstr "" +"Здесь много материала для горения, так что даже без дополнительного топлива " +"он будет гореть ещё часть дня." #: src/game.cpp #, c-format msgid "Without extra fuel it will burn for %s." -msgstr "" +msgstr "Без дополнительного топлива он будет продолжать гореть ещё %s." #: src/game.cpp msgid "You can't do that while driving." @@ -134654,11 +134992,15 @@ msgid "" "You are not in the mood and the prospect of guts and blood on your hands " "convinces you to turn away." msgstr "" +"Вы не в настроении сейчас заниматься чем-то, что покроет ваши руки по локоть" +" в крови." #: src/game.cpp msgid "" "You are not in the mood and the prospect of work stops you before you begin." msgstr "" +"Вы сейчас не в настроении, и перспектива заниматься сейчас этим вас совсем " +"не радует." #: src/game.cpp msgid "Choose type of butchery:" @@ -134698,7 +135040,7 @@ msgstr "" #: src/game.cpp msgid "Field dress corpse" -msgstr "" +msgstr "Полевая разделка" #: src/game.cpp msgid "" @@ -134707,6 +135049,10 @@ msgid "" "lighter and will stay fresh longer. Can be combined with other methods for " "better effects." msgstr "" +"Техника, при которой удаляются внутренние органы для предотвращения гниения " +"туши изнутри. Даёт на выходе внутренние органы. Оставшийся каркас будет " +"легче и останется свежим более длительное время. Можно совмещать с другими " +"методами для получения лучших результатов." #: src/game.cpp msgid "" @@ -134715,10 +135061,14 @@ msgid "" "This action destroys skin, hide, pelt, etc., so don't use it if you want to " "harvest them later." msgstr "" +"Четвертование предварительно разделанной по-полевому туши даст на выходе " +"четыре лёгких и небольших части. Удобно при транспортировке большой добычи. " +"Этот метод уничтожает кожу, шкуру, мех и т.д., так что не стоит использовать" +" его, если вам нужны эти субпродукты." #: src/game.cpp msgid "Quarter corpse" -msgstr "" +msgstr "Четвертование" #: src/game.cpp msgid "" @@ -134727,10 +135077,14 @@ msgid "" "tools, ruins corpse, and consumes lot of time. Your medical knowledge is " "most useful here." msgstr "" +"Вы аккуратно вскрываете тело и осматриваете его на наличие имплантатов. Если" +" они присутствуют вы, возможно, получите их. Требуются инструменты с " +"качеством, как у скальпеля. Этот метод уничтожает тело и занимает много " +"времени. Медицинские знания помогают получить лучшие результаты." #: src/game.cpp msgid "Dissect corpse" -msgstr "" +msgstr "Вскрытие" #: src/game.cpp msgid "You're too full to eat the underbrush." @@ -138296,7 +138650,7 @@ msgstr "Какие семена использовать?" #: src/iexamine.cpp #, c-format msgid "Planted %s." -msgstr "" +msgstr "Посажено: %s." #: src/iexamine.cpp msgid "You have no seeds to plant." @@ -138950,12 +139304,16 @@ msgid "" " of success compared to your %3$d chance of success." " Continue with a higher risk of failure?" msgstr "" +"%1$s в данный момент спит, но имеет " +"%2$d шанс на успех операции, по сравнению с вашим " +"%3$d шансом. Продолжить, несмотря на повышенный " +"риск?" #. ~ %1$s is the name of the ally #: src/iexamine.cpp #, c-format msgid "%1$s will perform the operation with a %2$d chance of success." -msgstr "" +msgstr "%1$s проведёт операцию с %2$d шансом на успех." #: src/iexamine.cpp msgid "No connected couches found. Operation impossible. Exiting." @@ -139004,7 +139362,7 @@ msgstr "У вас нет КБМ для установки." #: src/iexamine.cpp #, c-format msgid "%1$s cannot be installed on %2$s." -msgstr "" +msgstr "%1$s нельзя установить в тело %2$s." #. ~ %1$s is patient name #: src/iexamine.cpp src/iuse_actor.cpp @@ -139014,7 +139372,7 @@ msgstr "Вы уже установили эту бионику." #: src/iexamine.cpp #, c-format msgid "%1$s has already installed this bionic." -msgstr "" +msgstr "%1$s уже имеет эту бионику." #. ~ %1$s is patient name #: src/iexamine.cpp @@ -139026,6 +139384,7 @@ msgstr "" #, c-format msgid "%1$s has no base version of this bionic to upgrade." msgstr "" +"У %1$s нет базовой версии этой бионики, которую можно было бы улучшить." #. ~ %1$s is patient name #: src/iexamine.cpp @@ -139035,14 +139394,14 @@ msgstr "Вы уже установили улучшенную версию эт #: src/iexamine.cpp #, c-format msgid "%1$s has installed a superior version of this bionic." -msgstr "" +msgstr "%1$s уже имеет улучшенную версию этой бионики." #. ~ %1$s is installer name, %2$s is bionic CBM display name, %3$s is patient #. name #: src/iexamine.cpp #, c-format msgid "%1$s prepares to install the %2$s on %3$s." -msgstr "" +msgstr "%1$s готовится установить %2$s в тело %3$s." #. ~ %1$s is patient name #: src/iexamine.cpp @@ -139052,7 +139411,7 @@ msgstr "У вас не установлена никакая бионика." #: src/iexamine.cpp #, c-format msgid "%1$s doesn't have any bionics installed." -msgstr "" +msgstr "У %1$s не установлена никакая бионика." #: src/iexamine.cpp msgid "Choose bionic to uninstall" @@ -139060,26 +139419,28 @@ msgstr "Выберите бионику для удаления" #: src/iexamine.cpp msgid "This rack already contains smoked food." -msgstr "" +msgstr "В коптильне уже имеется копчёная еда." #: src/iexamine.cpp msgid "Remove it before firing the smoking rack again." -msgstr "" +msgstr "Удалите её, прежде чем снова зажигать коптильню." #: src/iexamine.cpp #, c-format msgid "This rack contains %s, which can't be smoked!" -msgstr "" +msgstr "В коптильне лежит %s, это нельзя закоптить!" #: src/iexamine.cpp #, c-format msgid "You remove %s from the rack." -msgstr "" +msgstr "Вы убираете %s из коптильни." #: src/iexamine.cpp msgid "" "This rack has some smoked food that might be dehydrated by smoking it again." msgstr "" +"В коптильне уже лежит копчёная еда, которая при повторном копчении " +"высушится." #: src/iexamine.cpp msgid "" @@ -139090,22 +139451,24 @@ msgstr "" #: src/iexamine.cpp msgid "There is no charcoal in the rack." -msgstr "" +msgstr "В коптильне нет угля." #: src/iexamine.cpp msgid "" "This rack is overloaded with food, and it blocks the flow of smoke. Remove " "some and try again." msgstr "" +"Коптильня переполнена едой, которая затрудняет ток воздуха. Удалите часть " +"еды и попробуйте ещё раз." #: src/iexamine.cpp #, c-format msgid "You think that you can load about %s %s in it." -msgstr "" +msgstr "Вы думаете, что сможете загрузить около %s %s в неё." #: src/iexamine.cpp msgid "There is not enough charcoal in the rack to smoke this much food." -msgstr "" +msgstr "В коптильне недостаточно угля, чтобы закоптить такое количество еды." #: src/iexamine.cpp #, c-format @@ -139113,30 +139476,32 @@ msgid "" "You need at least %1$s pieces of charcoal, and the smoking rack has %2$s " "inside." msgstr "" +"Вам нужно как минимум %1$s кусков угля, в коптильне сейчас находится %2$s " +"кусков." #: src/iexamine.cpp msgid "This smoking rack is ready to be fired, but you have no fire source." -msgstr "" +msgstr "Коптильня подготовлена, но у вас нечем её зажечь." #: src/iexamine.cpp msgid "Fire the smoking rack?" -msgstr "" +msgstr "Зажечь коптильню?" #: src/iexamine.cpp msgid "You light a small fire under the rack and it starts to smoke." -msgstr "" +msgstr "Вы разожгли небольшой огонь под коптильней. Она начала коптить еду." #: src/iexamine.cpp msgid "You can't place more food while it's smoking." -msgstr "" +msgstr "Вы не можете положить больше еды, пока другая еда коптится." #: src/iexamine.cpp msgid "Load smoking rack with what kind of food?" -msgstr "" +msgstr "Что положить в коптильню?" #: src/iexamine.cpp msgid "You don't have any food that can be smoked." -msgstr "" +msgstr "У вас нет никакой еды, которую можно было бы закоптить." #: src/iexamine.cpp #, c-format @@ -139150,81 +139515,83 @@ msgstr "Вы не можете положить так много." #: src/iexamine.cpp msgid "You have rotten food mixed with fresh. Get rid of it first." msgstr "" +"Вы положили в коптильню свежую еду вперемешку с пропавшей. Уберите её " +"оттуда." #: src/iexamine.cpp #, c-format msgid "You carefully place %s %s in the rack." -msgstr "" +msgstr "Вы аккуратно кладёте %s %s в коптильню." #: src/iexamine.cpp msgid "What to do with the smoking rack:" -msgstr "" +msgstr "Что делать с коптильней:" #: src/iexamine.cpp msgid "Inspect smoking rack" -msgstr "" +msgstr "Осмотреть коптильню" #: src/iexamine.cpp msgid "Light up and smoke food (lit & smoking)" -msgstr "" +msgstr "Зажечь и коптить еду (зажжено и коптится)" #: src/iexamine.cpp msgid "Light up and smoke food" -msgstr "" +msgstr "Зажечь и коптить еду" #: src/iexamine.cpp msgid "Insert food for smoking" -msgstr "" +msgstr "Положить еду для копчения" #: src/iexamine.cpp msgid "Reload with charcoal" -msgstr "" +msgstr "Положить уголь" #: src/iexamine.cpp msgid "Remove food from rack" -msgstr "" +msgstr "Вытащить еду из коптильни" #: src/iexamine.cpp msgid "Remove food from rack (none inside)" -msgstr "" +msgstr "Вытащить еду из коптильни (внутри пусто)" #: src/iexamine.cpp msgid "Remove charcoal from rack; has: " -msgstr "" +msgstr "Убрать уголь из коптильни; внутри: " #: src/iexamine.cpp msgid "Remove charcoal from rack (none inside)" -msgstr "" +msgstr "Убрать уголь из коптильни (внутри пусто)" #: src/iexamine.cpp msgid "Quench burning charcoal" -msgstr "" +msgstr "Потушить горящие угли" #: src/iexamine.cpp msgid "There's a smoking rack here. It is lit and smoking." -msgstr "" +msgstr "Это коптильня. Она зажжена и коптит еду." #: src/iexamine.cpp #, c-format msgid "It will finish smoking in about %d hour." msgid_plural "It will finish smoking in about %d hours." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Еда закончит коптиться через %d час." +msgstr[1] "Еда закончит коптиться через %d часа." +msgstr[2] "Еда закончит коптиться через %d часов." +msgstr[3] "Еда закончит коптиться через %d час." #: src/iexamine.cpp msgid "It will finish smoking in less than an hour." -msgstr "" +msgstr "Еда закончит коптиться меньше чем через час." #: src/iexamine.cpp #, c-format msgid "It should take about %d minutes to finish smoking." -msgstr "" +msgstr "Еда закончит коптиться через %d минут." #: src/iexamine.cpp msgid "There's a smoking rack here." -msgstr "" +msgstr "Это коптильня." #: src/iexamine.cpp msgid "You inspect its contents and find: " @@ -139236,11 +139603,11 @@ msgstr "Вы видите здесь немного тлеющих угольк #: src/iexamine.cpp msgid "It is already lit and smoking." -msgstr "" +msgstr "Она уже зажжена и коптит." #: src/iexamine.cpp msgid "You stop the smoking process." -msgstr "" +msgstr "Вы останавливаете процесс копчения." #: src/iexamine.cpp msgid "Use electrohack?" @@ -139715,15 +140082,15 @@ msgstr "last rot: " #: src/item.cpp msgid "HOT: " -msgstr "" +msgstr "ГОРЯЧЕЕ: " #: src/item.cpp msgid "COLD: " -msgstr "" +msgstr "ХОЛОДНОЕ: " #: src/item.cpp msgid "FROZEN: " -msgstr "" +msgstr "ЗАМОРОЖЕННОЕ: " #: src/item.cpp msgid "burn: " @@ -139846,7 +140213,7 @@ msgstr "" #: src/item.cpp msgid "* It seems that deep freezing killed all parasites." -msgstr "" +msgstr "* Похоже, что глубокая заморозка убила всех паразитов." #: src/item.cpp msgid "" @@ -140737,7 +141104,7 @@ msgstr " (тухлое)" #: src/item.cpp msgid " (mushy)" -msgstr "" +msgstr " (кашицеобразное)" #: src/item.cpp msgid " (old)" @@ -140757,11 +141124,11 @@ msgstr " (охлаждено)" #: src/item.cpp msgid " (frozen)" -msgstr "" +msgstr "(заморожено)" #: src/item.cpp msgid " (melted)" -msgstr "" +msgstr "(растаявшее)" #: src/item.cpp msgid " (fits)" @@ -140769,7 +141136,7 @@ msgstr " (впору)" #: src/item.cpp msgid " (undersized)" -msgstr "" +msgstr " (мало)" #: src/item.cpp msgid " (filthy)" @@ -141040,20 +141407,20 @@ msgstr "Вам нужен УБП для запуска %s!" msgctxt "item name" msgid "%s carcass" msgid_plural "%s carcasses" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "каркас %s" +msgstr[1] "каркаса %s" +msgstr[2] "каркасов %s" +msgstr[3] "каркас %s" #: src/item.cpp #, c-format msgctxt "item name" msgid "quartered %s carcass" msgid_plural "quartered %s carcasses" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "четвертованный каркас %s" +msgstr[1] "четвертованных каркаса %s" +msgstr[2] "четвертованных каркасов %s" +msgstr[3] "четвертованный каркас %s" #: src/item.cpp #, c-format @@ -141070,10 +141437,10 @@ msgstr[3] "%s труп" msgctxt "item name" msgid "%s carcass of %s" msgid_plural "%s carcasses of %s" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "%s каркас %s" +msgstr[1] "%s каркаса %s" +msgstr[2] "%s каркасов %s" +msgstr[3] "%s каркас %s" #: src/item.cpp #, c-format @@ -143246,7 +143613,7 @@ msgstr "У вас нет подходящей еды для разогрева." #: src/iuse.cpp msgid "You defrost the food." -msgstr "" +msgstr "Вы разморозили еду." #: src/iuse.cpp msgid "You heat up the food." @@ -145004,11 +145371,12 @@ msgstr "Вы ушиваете %s, подгоняя вещь по фигуре." #, c-format msgid "You resize the %s to accommodate your tiny build." msgstr "" +"Вы подгоняете %s, чтобы это соответствовало вашему крохотному размеру." #: src/iuse_actor.cpp #, c-format msgid "You adjust the %s back to its normal size." -msgstr "" +msgstr "Вы возвращаете обычный размер %s." #: src/iuse_actor.cpp #, c-format @@ -146532,15 +146900,15 @@ msgstr "Загрузка" #: src/lua_console.cpp msgid "This build does not support Lua." -msgstr "" +msgstr "Эта сборка не поддерживает Lua." #: src/lua_console.cpp msgid "Welcome to the Lua console! Here you can enter Lua code." -msgstr "" +msgstr "Добро пожаловать в консоль Lua. Здесь вы можете ввести код Lua." #: src/lua_console.cpp msgid "Press [Esc] to close the Lua console." -msgstr "" +msgstr "Чтобы выйти из консоли Lua, нажмите Esc." #: src/main.cpp msgid "Really Quit? All unsaved changes will be lost." @@ -148053,7 +148421,7 @@ msgstr "Боевой патруль" #: src/mission_companion.cpp msgid " Expansion Upgrade" -msgstr "" +msgstr "Улучшение расширения" #: src/mission_companion.cpp msgid "" @@ -148208,15 +148576,15 @@ msgstr "Работает над расширением вашего лагеря #: src/mission_companion.cpp msgid " hours left] \n" -msgstr "" +msgstr " часов до конца] \n" #: src/mission_companion.cpp msgid " minutes left] \n" -msgstr "" +msgstr " минут до конца] \n" #: src/mission_companion.cpp msgid " [DONE]\n" -msgstr "" +msgstr " [ГОТОВО]\n" #: src/mission_companion.cpp msgid "Recover Ally from Upgrading" @@ -148252,7 +148620,7 @@ msgstr "Работает в вашей кухне!\n" #: src/mission_companion.cpp msgid " [ALMOST DONE]\n" -msgstr "" +msgstr " [ПОЧТИ ГОТОВО]\n" #: src/mission_companion.cpp msgid " (Finish) Cooking" @@ -149199,6 +149567,8 @@ msgstr "Молчаливый призрак подошёл к %s, когда т msgid "" "%s notices the antlered horror and slips away before it gets too close." msgstr "" +"%s замечает рогатый ужас и успевает улизнуть до того, как тот подобрался " +"слишком близко." #: src/mission_companion.cpp #, c-format @@ -149257,7 +149627,7 @@ msgstr "Превратив существо в кучку мяса, %s уход #: src/mission_companion.cpp msgid "(Sounds like bullshit, you wonder what really happened.)" -msgstr "" +msgstr "(Пахнет выдумкой, интересно, что же случилось на самом деле.)" #: src/mission_companion.cpp #, c-format @@ -149279,7 +149649,7 @@ msgstr "Куски %s валялись по всей округе." #: src/mission_companion.cpp msgid "(You wonder if your companions are fit to work on their own...)" -msgstr "" +msgstr "(Интересно, ваши компаньоны вообще способны за себя постоять?..)" #: src/mission_companion.cpp #, c-format @@ -149333,7 +149703,7 @@ msgstr "Выберите расширение:" #: src/mission_companion.cpp msgid "You choose to wait..." -msgstr "" +msgstr "Вы решили подождать..." #: src/mission_companion.cpp #, c-format @@ -149364,34 +149734,34 @@ msgstr "" #: src/mission_companion.cpp #, c-format msgid "Name: %25s\n" -msgstr "" +msgstr "Имя: %25s\n" #: src/mission_companion.cpp msgid "---- Engines ----\n" -msgstr "" +msgstr "---- Двигатели ----\n" #: src/mission_companion.cpp #, c-format msgid "Engine: %25s\n" -msgstr "" +msgstr "Двигатель: %25s\n" #: src/mission_companion.cpp #, c-format msgid ">Status: %24d%%\n" -msgstr "" +msgstr ">Статус: %24d%%\n" #: src/mission_companion.cpp #, c-format msgid ">Fuel: %25s\n" -msgstr "" +msgstr ">Топливо: %25s\n" #: src/mission_companion.cpp msgid "---- Fuel Storage & Battery ----\n" -msgstr "" +msgstr "---- Топливо, вместимость и заряд ----\n" #: src/mission_companion.cpp msgid "Estimated Chop Time: 5 Days\n" -msgstr "" +msgstr "Время до окончания разборки: 5 дней\n" #: src/mission_companion.cpp #, c-format @@ -149543,11 +149913,11 @@ msgstr "" #: src/mission_companion.cpp msgid "You choose to send no one..." -msgstr "" +msgstr "Вы решили никого не посылать." #: src/mission_companion.cpp msgid "The companion you selected doesn't have the skills!" -msgstr "" +msgstr "Компаньон, которого вы выбрали, не обладает необходимыми навыками!" #: src/mission_companion.cpp msgid "You don't have any companions ready to return..." @@ -149641,52 +150011,52 @@ msgstr "Вы хотите отказаться от этого места, чт #: src/mission_companion.cpp #, c-format msgid ">Distance:%15.2f (km)\n" -msgstr "" +msgstr ">Расстояние: %15.2f (км)\n" #: src/mission_companion.cpp #, c-format msgid ">One Way: %15d (trips)\n" -msgstr "" +msgstr ">В одну сторону: %15d (походов)\n" #: src/mission_companion.cpp #, c-format msgid ">Covered: %15.2f (km)\n" -msgstr "" +msgstr ">Преодолено: %15.2f (км)\n" #: src/mission_companion.cpp #, c-format msgid ">Distance:%15d (m)\n" -msgstr "" +msgstr ">Расстояние :%15d (м)\n" #: src/mission_companion.cpp #, c-format msgid ">Covered: %15d (m)\n" -msgstr "" +msgstr ">Преодолено: %15d (м)\n" #: src/mission_companion.cpp #, c-format msgid ">Travel: %15d (hours)\n" -msgstr "" +msgstr ">Дорога: %15d (часов)\n" #: src/mission_companion.cpp #, c-format msgid ">Working: %15d (hours)\n" -msgstr "" +msgstr ">Работа: %15d (часов)\n" #: src/mission_companion.cpp #, c-format msgid "Total: %15d (days)\n" -msgstr "" +msgstr "Всего: %15d (дней)\n" #: src/mission_companion.cpp #, c-format msgid "Total: %15d (hours)\n" -msgstr "" +msgstr "Всего: %15d (часов)\n" #: src/mission_companion.cpp #, c-format msgid "Total: %15d (minutes)\n" -msgstr "" +msgstr "Всего: %15d (минут)\n" #: src/mission_companion.cpp #, c-format @@ -149694,6 +150064,8 @@ msgid "" "Food: %15d (kcal)\n" " \n" msgstr "" +"Еда: %15d (ккал)\n" +" \n" #: src/mission_companion.cpp msgid "food for you" @@ -149901,6 +150273,8 @@ msgid "" "NPC Overview:\n" " \n" msgstr "" +"Характеристики персонажа:\n" +" \n" #: src/mission_companion.cpp #, c-format @@ -149908,21 +150282,23 @@ msgid "" "Name: %20s\n" " \n" msgstr "" +"Имя: %20s\n" +" \n" #: src/mission_companion.cpp #, c-format msgid "Strength: %10d\n" -msgstr "" +msgstr "Сила: %10d\n" #: src/mission_companion.cpp #, c-format msgid "Dexterity: %10d\n" -msgstr "" +msgstr "Ловкость: %10d\n" #: src/mission_companion.cpp #, c-format msgid "Intelligence: %10d\n" -msgstr "" +msgstr "Интеллект: %10d\n" #: src/mission_companion.cpp #, c-format @@ -149930,14 +150306,16 @@ msgid "" "Perception: %10d\n" " \n" msgstr "" +"Восприятие: %10d\n" +" \n" #: src/mission_companion.cpp msgid "Top 3 Skills:\n" -msgstr "" +msgstr "3 самых развитых навыка:\n" #: src/mission_companion.cpp msgid "Asking for:\n" -msgstr "" +msgstr "Требуется:\n" #: src/mission_companion.cpp #, c-format @@ -149945,6 +150323,8 @@ msgid "" "> Food: %10d days\n" " \n" msgstr "" +"> Еда: %10d дней\n" +" \n" #: src/mission_companion.cpp #, c-format @@ -149952,6 +150332,8 @@ msgid "" "Faction Food:%9d days\n" " \n" msgstr "" +"Еда фракции: %9d дней\n" +" \n" #: src/mission_companion.cpp #, c-format @@ -149959,6 +150341,8 @@ msgid "" "Recruit Chance: %10d%%\n" " \n" msgstr "" +"Шанс вербовки: %10d%%\n" +" \n" #: src/mission_companion.cpp msgid "Select an option:" @@ -152308,15 +152692,15 @@ msgstr "Вы начали плести паутину из своих паути #: src/mutation.cpp msgid "Turn on digging mode" -msgstr "" +msgstr "Включить режим копания" #: src/mutation.cpp msgid "Fill pit/tamp ground" -msgstr "" +msgstr "Закопать яму / утрамбовать землю" #: src/mutation.cpp msgid "Churn up ground" -msgstr "" +msgstr "Вспахать землю" #: src/mutation.cpp msgid "Fill pit where?" @@ -162351,6 +162735,14 @@ msgstr "Вы не можете перелить из движущейся маш msgid "Select part to siphon: " msgstr "Выберите часть для сливания жидкости:" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "В этом транспортном средстве нет твёрдого топлива для выгрузки." + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "Нельзя выгружать во время движения транспортного средства." + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "Тут нет колёс, которые можно было бы заменить." @@ -162540,6 +162932,10 @@ msgstr "-демонтаж" msgid "iphon" msgstr "-слить" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "-выгрузить " + #: src/veh_interact.cpp msgid "hange tire" msgstr "-сменить колесо" @@ -162690,6 +163086,10 @@ msgstr "использовать" msgid "Select tank to siphon:" msgstr "Выберите бак для сливания жидкости:" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "Что убрать?" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." @@ -163680,23 +164080,23 @@ msgstr "%s кПа" #: src/weather_data.cpp msgid "Clear" -msgstr "Ясно" +msgstr "ясно" #: src/weather_data.cpp msgid "Sunny" -msgstr "Солнечно" +msgstr "солнечно" #: src/weather_data.cpp msgid "Cloudy" -msgstr "Пасмурно" +msgstr "пасмурно" #: src/weather_data.cpp msgid "Drizzle" -msgstr "Морось" +msgstr "морось" #: src/weather_data.cpp msgid "Rain" -msgstr "Дождь" +msgstr "дождь" #: src/weather_data.cpp msgid "Thunder Storm" @@ -163704,23 +164104,23 @@ msgstr "Грозовой ливень" #: src/weather_data.cpp msgid "Lightning Storm" -msgstr "Гроза" +msgstr "гроза" #: src/weather_data.cpp msgid "Acidic Drizzle" -msgstr "Кислотная морось" +msgstr "кислотная морось" #: src/weather_data.cpp msgid "Acid Rain" -msgstr "Кислотный дождь" +msgstr "кислотный дождь" #: src/weather_data.cpp msgid "Flurries" -msgstr "Моросящий снег" +msgstr "моросящий снег" #: src/weather_data.cpp msgid "Snowing" -msgstr "Снегопад" +msgstr "снегопад" #: src/weather_data.cpp msgid "Snowstorm" diff --git a/lang/po/zh_CN.po b/lang/po/zh_CN.po index 9ec425b43df91..863116fbdf0b9 100644 --- a/lang/po/zh_CN.po +++ b/lang/po/zh_CN.po @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: 高 励贤 <475964436@qq.com>, 2018\n" "Language-Team: Chinese (China) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_CN/)\n" @@ -12558,7 +12558,7 @@ msgstr[0] "MBR防弹背心(凯夫拉板)" msgid "" "A Modular Bullet Resistant Vest. Kevlar plates have been inserted to " "improve its protection. It has four pouches capable of carrying magazines." -msgstr "一件模块化防弹背心,插入了卡夫拉板来进一步增强防护性能。它有着四个能装下弹匣的口袋。" +msgstr "一件模块化防弹背心,插入了凯夫拉板来进一步增强防护性能。它有着四个能装下弹匣的口袋。" #: lang/json/ARMOR_from_json.py msgid "MBR vest (steel plating)" @@ -27260,6 +27260,10 @@ msgstr "基础柴油引擎" msgid "base gasoline engine" msgstr "基础汽油引擎" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "基础蒸汽引擎" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "单缸引擎" @@ -27363,6 +27367,114 @@ msgid "" "trucks." msgstr "一台巨大而强劲的十二缸引擎,一般用于重型卡车。" +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "简易蒸汽引擎" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "一台小型自制蒸汽引擎。一个内置锅炉燃烧木炭将水加热变成蒸汽,带动一根往复轴。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "小型蒸汽引擎" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "一台小型蒸汽引擎。一个内置锅炉燃烧木炭将水加热变成蒸汽,带动一根往复轴。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "中型蒸汽引擎" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "一台中型蒸汽引擎。一个内置锅炉燃烧木炭将水加热变成蒸汽,带动一根往复轴。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "大型蒸汽引擎" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "一台大型蒸汽引擎。一个内置锅炉燃烧木炭将水加热变成蒸汽,带动一根往复轴。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "巨型蒸汽引擎" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "一台巨型蒸汽引擎。一个内置锅炉燃烧木炭将水加热变成蒸汽,带动一根往复轴。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "小型蒸汽涡轮机" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "一台小型蒸汽涡轮机。一个内置锅炉燃烧木炭将水加热变成蒸汽,驱动旋转涡轮机。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "中型蒸汽涡轮机" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "一台中型蒸汽涡轮机。一个内置锅炉燃烧木炭将水加热变成蒸汽,驱动旋转涡轮机。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "大型蒸汽涡轮机" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "一台大型蒸汽涡轮机。一个内置锅炉燃烧木炭将水加热变成蒸汽,驱动旋转涡轮机。一个冷凝器回收冷却水,构成一个闭环系统。" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "巨型蒸汽涡轮机" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "一台巨型蒸汽涡轮机。一个内置锅炉燃烧木炭将水加热变成蒸汽,驱动旋转涡轮机。一个冷凝器回收冷却水,构成一个闭环系统。" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -28852,7 +28964,7 @@ msgstr[0] "松塔" msgid "" "A spiny pod from a pine tree. Dry seeds rattle around inside when you shake" " it." -msgstr "一个从松树上找到的带刺坚果。已经很干燥了,当你晃他的时候能听到里面有声音传出来。" +msgstr "一个从松树上找到的带刺坚果。当你摇动它的时候能听见干燥的种子在里面嘎吱作响。" #: lang/json/GENERIC_from_json.py msgid "poppy flower" @@ -33226,7 +33338,7 @@ msgstr[0] "钢制吊臂" msgid "" "A large rigid steel boom. If attached to a frame it could be used to lift " "up to 20 metric tonnes." -msgstr "一个巨大而坚固的钢吊杆。如果连接到一个框架上,则可以用于起重不超过20吨的汽车。" +msgstr "一个巨大而坚固的钢吊杆。安装到车架上后,可以用于起重不超过20吨的载具。" #: lang/json/GENERIC_from_json.py msgid "telescopic cantilever" @@ -33238,7 +33350,7 @@ msgstr[0] "可伸缩吊臂" msgid "" "A small steel telescoping cantilever. If attached to a frame it could be " "used to lift up to 3.5 metric tonnes." -msgstr "一个小型钢制伸缩悬臂。如果连接到一个框架上,则可以用于起重不超过3.5吨的汽车。" +msgstr "一个小型钢制伸缩悬臂。安装到车架上后,可以用于起重不超过3.5吨的载具。" #: lang/json/GENERIC_from_json.py lang/json/vehicle_part_from_json.py msgid "pallet lifter" @@ -34532,6 +34644,15 @@ msgstr "神器" msgid "ARMOR" msgstr "装备" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "燃料舱" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "一个用来储存固态燃料的箱子。" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "子弹带" @@ -39116,7 +39237,7 @@ msgstr "巨型蝗虫幼体" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "一只如兔子一般大的蝗虫。你不敢去想像一群这样的怪物会干些什么出来。" @@ -40038,7 +40159,7 @@ msgstr "巨型响尾蛇" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." +"aggressive and dangerous compared to a normal rattler." msgstr "一条变异的这种林响蛇,约有普通响尾蛇的三倍体积,虽然体型并没有大到可以将人类当作猎物,但相比普通的响尾蛇更具有侵略性且更危险。" #: lang/json/MONSTER_from_json.py @@ -46057,7 +46178,7 @@ msgstr "这是一把基本的鲤鱼钳,能用来做一些基本的机械工作 #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" +msgid_plural "pocket watches" msgstr[0] "怀表" #. ~ Description for pocket watch @@ -51938,7 +52059,7 @@ msgstr "非马卡斯们有时会排斥马洛斯莓。吾等开拓者应以慈悲 msgid "" "The seething masses attempt to wall non-Mycus away from the Marloss. We " "will adapt and defeat them." -msgstr "一些狂热群众试图将马洛斯莓与非马卡斯们隔离开来。吾等会适应并击败它们。" +msgstr "狂信之众试图将非马卡斯们与马洛斯莓隔绝开来。吾等会适应并击败它们。" #: lang/json/effects_from_json.py msgid "Hit By Player" @@ -63332,12 +63453,16 @@ msgstr "修理部件" #: lang/json/keybinding_from_json.py msgid "Mend part" -msgstr "修复汽车部件" +msgstr "修复载具部件" #: lang/json/keybinding_from_json.py msgid "Refill tank/battery" msgstr "补充燃料/电池" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "清空燃料舱" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "移除部件" @@ -66249,7 +66374,7 @@ msgstr "" #: lang/json/mission_def_from_json.py msgid "Fuck ya, America!" -msgstr "操你妈的,美国!" +msgstr "吊炸了,美国!" #: lang/json/mission_def_from_json.py msgid "" @@ -76002,6 +76127,10 @@ msgstr "公共厕所" msgid "roadside foodcart" msgstr "路边摊" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "车库(加油站)" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "宗教墓地" @@ -76329,8 +76458,8 @@ msgid "stadium parking" msgstr "体育馆(停车场)" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" -msgstr "体育馆(摊位)" +msgid "stadium" +msgstr "体育馆" #: lang/json/overmap_terrain_from_json.py msgid "stadium entrance" @@ -76397,8 +76526,8 @@ msgid "trailer park" msgstr "拖车公园" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" -msgstr "集体坟墓" +msgid "mass grave" +msgstr "集体墓地" #: lang/json/overmap_terrain_from_json.py msgid "abandoned drive-through" @@ -76477,11 +76606,11 @@ msgid "Bankrupt Pizzeria" msgstr "破产的披萨店" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "游船码头" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "河畔公寓" #: lang/json/overmap_terrain_from_json.py @@ -76690,12 +76819,20 @@ msgid "animal clinic" msgstr "动物诊所" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" -msgstr "体育馆" +msgid "war memorial" +msgstr "战争纪念馆" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" -msgstr "退伍军人协会" +msgid "ruined cabin - barn" +msgstr "废弃小屋(谷仓)" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "废弃小屋(汽车角)" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" +msgstr "废弃小屋(露天广场)" #: lang/json/professions_from_json.py msgctxt "profession_male" @@ -84261,7 +84398,7 @@ msgid "" "whiskey. A tiny obese devil sits on his shoulder and drinks a martini. The" " caption reads: \"Drink like there's no tomorrow!\"" msgstr "" -"这是一个\"节食恶魔\"酒精燃烧器CBM的广告。它展示了一副画面,一个十几岁的男孩边驾驶汽车边灌着一瓶威士忌。一个微小的肥胖魔鬼坐在他的肩膀上喝着一杯马提尼。标题写着:\"喝吧,就像是没有明天!\"" +"这是一个\"节食恶魔\"酒精燃烧器CBM的广告。它展示了一副画面,一个十几岁的男孩边开车边灌着一瓶威士忌。一个微小的肥胖魔鬼坐在他的肩膀上喝着一杯马提尼。标题写着:\"喝吧,就像是没有明天!\"" #: lang/json/snippet_from_json.py msgid "" @@ -89070,7 +89207,7 @@ msgstr "\"我的购物车上装了一门激光炮炮塔。我推着它到处跑 msgid "" "\"Day 40. Controls broken-- car's magic reactor makes it goes inexorably " "forward. Giant rollers on front demolish forest. Maine, here I come.\"" -msgstr "\"第40日。控制器坏了——但汽车里的神奇反应堆让它无需控制朝前一直开。车前巨大的压路机摧毁着森林。缅因州,我来了。\"" +msgstr "\"第40日。控制器坏了——但车里神奇的反应堆让其不为所动依旧一直前行。正前方巨大的压路机正摧毁着森林。缅因州,我来了。\"" #: lang/json/snippet_from_json.py msgid "\"my car is a diamond in the rough... literally\"" @@ -97450,6 +97587,10 @@ msgstr "警用K-9运输车" msgid "SWAT Truck" msgstr "SWAT卡车" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "自制拖拉机" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "全自动拖拉机" @@ -97612,7 +97753,7 @@ msgstr "核动力SUV" #: lang/json/vehicle_from_json.py msgid "Atomic Car" -msgstr "核动力汽车" +msgstr "核动力轿车" #: lang/json/vehicle_from_json.py msgid "Atomic Mini-Tank" @@ -98692,16 +98833,22 @@ msgid "external cargo rack" msgstr "外挂货架" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." -msgstr "一个内燃引擎。开启后,在轮胎足够时,消耗燃料带动车辆前进。" +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "一个内燃引擎。燃烧消耗载具水箱内的燃料。" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "一个内燃引擎。燃烧消耗载具水箱内的柴油。" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." +msgstr "一个内燃引擎。燃烧消耗载具水箱内的汽油。" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." -msgstr "一个内燃引擎。开启后,在轮胎足够时,消耗汽油带动车辆前进。" +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." +msgstr "一个闭环外燃蒸汽引擎。燃烧消耗载具燃料舱内的木炭并产生蒸汽。" #: lang/json/vehicle_part_from_json.py msgid "boom crane" @@ -99021,6 +99168,14 @@ msgstr "外挂油箱(200升)" msgid "barrel (100L)" msgstr "大桶(100L)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "一个能够装载固态燃料的货舱。装入车辆引擎所对应消耗的燃料后,引擎启动时将会自动从对应的燃料舱内抽取燃料。" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "车载 火焰喷射器" @@ -100363,6 +100518,12 @@ msgstr "一坨形状不定的物质,变形怪载具的活着的心脏和大脑 msgid "A living blob turned into a heavy vehicle weapon." msgstr "一只活的变形怪变成的重型车载武器。" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "一个闭环外燃蒸汽涡轮机。燃烧消耗载具燃料舱内的木炭并产生蒸汽。" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -106226,7 +106387,8 @@ msgstr[0] "你需要 %s 并且至少有 %d 单位电量。" #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "算了。" @@ -106474,17 +106636,17 @@ msgstr "批量" #: src/creature.cpp msgid " forces you to the ground!" -msgstr " 将你按在地上!" +msgstr " 把你扎倒在地!" #: src/creature.cpp #, c-format msgid "You force %s to the ground!" -msgstr "你把 %s 摔倒在地!" +msgstr "你把 %s 扎倒在地!" #: src/creature.cpp #, c-format msgid " forces %s to the ground!" -msgstr " 把 %s 摔倒在地!" +msgstr " 把 %s 扎倒在地!" #: src/creature.cpp #, c-format @@ -106556,6 +106718,42 @@ msgstr "你击中 %s,造成 %d 点伤害。" msgid "%1$s shoots %2$s." msgstr "%1$s 射击 %2$s。" +#: src/creature.cpp +msgid "Severe pain" +msgstr "极度疼痛" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "剧烈疼痛" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "严重疼痛" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "重度疼痛" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "较重疼痛" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "中度疼痛" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "轻度疼痛" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "轻微疼痛" + +#: src/creature.cpp +msgid "No pain" +msgstr "无疼痛" + #: src/creature.cpp msgid "Hostile" msgstr "敌对" @@ -107796,7 +107994,7 @@ msgstr "你只能在旷野上建设扩展区。" msgid "" "Engine cannot support merging vehicles from two overmaps, please remove them" " from the OM tile." -msgstr "当前引擎不支持合并两个不同大地图上的载具,需要先将所有载具从对应区块中移除。" +msgstr "程序尚无法合并两块大地图上的载具,需要先将所有载具移出此区域。" #: src/editmap.cpp msgid "Your mechanic could not find a vehicle at the garage." @@ -110278,15 +110476,15 @@ msgstr "世界保留。剩余人物:%s" msgid "Wait till you wake up..." msgstr "等待你醒来……" -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr "(Y)是,(N)否,(I)忽略干扰并直到结束。" - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s。自动移动终止" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "(Y)是,(N)否,(I)忽略类似干扰直到完成。" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -111715,7 +111913,7 @@ msgstr "%s 没地方可以去!" msgid "Use which item?" msgstr "使用哪个物品?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "没事了。" @@ -117007,7 +117205,7 @@ msgstr "※仔细观察后,这似乎是致幻的。" msgid "" "* This food is perishable, and takes %s to " "rot from full freshness, at room temperature." -msgstr "※这份食物 易腐坏,从新鲜到完全腐坏在室温下需要 %s。" +msgstr "※这份食物 易腐坏,在室温下从新鲜到完全腐坏需要 %s。" #: src/item.cpp msgid "* This food looks as fresh as it can be." @@ -117895,7 +118093,7 @@ msgstr "(热腾腾)" #: src/item.cpp msgid " (cold)" -msgstr "(冰冷)" +msgstr "(冰凉)" #: src/item.cpp msgid " (frozen)" @@ -118689,7 +118887,7 @@ msgstr "还记得上次吃这玩意后发生的事了吗?啊~哦。你再也 #: src/iuse.cpp msgid "We no longer require this scaffolding. We reserve it for other uses." -msgstr "吾等已经不再需要这个垫脚石了。吾等会让其派上其他用场的。" +msgstr "吾等已不需此等垫脚石了。吾等留之另有所用。" #: src/iuse.cpp msgctxt "memorial_male" @@ -129447,11 +129645,11 @@ msgstr "刚才发生了什么来着……?啊哦,你再也不想喝下那些 #: src/mutation.cpp msgid "This is a contaminant. We reject it from the Mycus." -msgstr "这是一个污染源。吾等不能让它接近马卡斯。" +msgstr "此乃污秽之物。吾等不能让它接近马卡斯。" #: src/mutation.cpp msgid "We decontaminate it with spores." -msgstr "吾等已用孢子清除了感染。" +msgstr "吾等已用孢子清除了此等污秽之物。" #: src/mutation.cpp msgctxt "memorial_male" @@ -129465,7 +129663,7 @@ msgstr "恶意入侵者一名,已摧毁。" #: src/mutation.cpp msgid "We must eliminate this contaminant at the earliest opportunity." -msgstr "吾等必须尽快清除这个污染源。" +msgstr "待有机会吾等将清除此等污秽之物。" #: src/mutation.cpp #, c-format @@ -137198,11 +137396,11 @@ msgstr "死于严重感染。" #: src/player_hardcoded_effects.cpp msgid "You nestle your pile of clothes for warmth." -msgstr "你依偎在你温暖的衣服堆里。" +msgstr "你依偎在一堆衣服里来保暖。" #: src/player_hardcoded_effects.cpp msgid "You use your pile of clothes for warmth." -msgstr "你用一堆衣服来取暖。" +msgstr "你盖上一堆衣服来保暖。" #: src/player_hardcoded_effects.cpp #, c-format @@ -137337,7 +137535,7 @@ msgstr "开火 %s %s" #: src/ranged.cpp #, c-format msgid "Throwing %s" -msgstr "投向 %s" +msgstr "投掷 %s" #: src/ranged.cpp msgid "Set target" @@ -138906,7 +139104,7 @@ msgstr "选择一个要拆除的部件:" #: src/veh_interact.cpp msgid "The vehicle has no liquid fuel left to siphon." -msgstr "这汽车没有液体燃料可供抽取。" +msgstr "这辆载具没有可抽取的液态燃料。" #: src/veh_interact.cpp msgid "You need a hose to siphon liquid fuel." @@ -138920,6 +139118,14 @@ msgstr "在运动的车辆中你也能用皮管抽油啊!" msgid "Select part to siphon: " msgstr "选择要抽取的水箱:" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "这辆载具没有可清空的固态燃料。" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "你无法从正在移动的载具中清空燃料。" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "这里没有可换的轮胎。" @@ -139105,6 +139311,10 @@ msgstr "移除" msgid "iphon" msgstr "抽油" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "清空" + #: src/veh_interact.cpp msgid "hange tire" msgstr "换胎" @@ -139255,6 +139465,10 @@ msgstr "使用哪个零件?" msgid "Select tank to siphon:" msgstr "选择要抽取的水箱:" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "清空什么?" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lang/po/zh_TW.po b/lang/po/zh_TW.po index 70a9f52a834cf..512956583551b 100644 --- a/lang/po/zh_TW.po +++ b/lang/po/zh_TW.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: cataclysm-dda 0.C\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-09-06 12:09+0800\n" +"POT-Creation-Date: 2018-09-07 09:39+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Meat , 2018\n" "Language-Team: Chinese (Taiwan) (https://www.transifex.com/cataclysm-dda-translators/teams/2217/zh_TW/)\n" @@ -26694,6 +26694,10 @@ msgstr "基本柴油引擎" msgid "base gasoline engine" msgstr "基本汽油引擎" +#: lang/json/ENGINE_from_json.py +msgid "base steam engine" +msgstr "" + #: lang/json/ENGINE_from_json.py msgid "1-cylinder engine" msgstr "單缸引擎" @@ -26797,6 +26801,114 @@ msgid "" "trucks." msgstr "一個巨大而無比強力的十二缸內燃式引擎,通常用於重型卡車。" +#: lang/json/ENGINE_from_json.py +msgid "makeshift steam engine" +msgstr "" + +#. ~ Description for makeshift steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small, primitive, steam engine. An integrated boiler burns coal to heat " +"water into steam, driving a reciprocating shaft. A condensor recaptures the" +" water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam engine" +msgstr "" + +#. ~ Description for small steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam engine" +msgstr "" + +#. ~ Description for medium steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam engine. An integrated boiler burns coal to heat water " +"into steam, driving a reciprocating shaft. A condensor recaptures the " +"water, making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam engine" +msgstr "" + +#. ~ Description for large steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam engine" +msgstr "" + +#. ~ Description for huge steam engine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam engine. An integrated boiler burns coal to heat water into " +"steam, driving a reciprocating shaft. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "small steam turbine" +msgstr "" + +#. ~ Description for small steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A small steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "medium steam turbine" +msgstr "" + +#. ~ Description for medium steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A medium sized steam turbine. An integrated boiler burns coal to heat water" +" into steam, driving a spinning turbine. A condensor recaptures the water, " +"making this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "large steam turbine" +msgstr "" + +#. ~ Description for large steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A large steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + +#: lang/json/ENGINE_from_json.py +msgid "huge steam turbine" +msgstr "" + +#. ~ Description for huge steam turbine +#: lang/json/ENGINE_from_json.py +msgid "" +"A huge steam turbine. An integrated boiler burns coal to heat water into " +"steam, driving a spinning turbine. A condensor recaptures the water, making" +" this a closed cycle system." +msgstr "" + #: lang/json/GENERIC_from_json.py msgid "explosive arrowhead" msgid_plural "explosive arrowheads" @@ -33884,6 +33996,15 @@ msgstr "神器" msgid "ARMOR" msgstr "護具" +#: lang/json/MAGAZINE_from_json.py lang/json/vehicle_part_from_json.py +msgid "fuel bunker" +msgstr "" + +#. ~ Description for fuel bunker +#: lang/json/MAGAZINE_from_json.py +msgid "A bin for holding solid fuel." +msgstr "" + #: lang/json/MAGAZINE_from_json.py msgid "ammo belt" msgstr "彈鏈" @@ -38440,7 +38561,7 @@ msgstr "" #. ~ Description for locust nymph #: lang/json/MONSTER_from_json.py msgid "" -"A locust the size of a rabbit. You’d hate to think what a swarm of these " +"A locust the size of a rabbit. You'd hate to think what a swarm of these " "could do." msgstr "" @@ -39356,8 +39477,8 @@ msgstr "巨大響尾蛇" msgid "" "A mutated timber rattlesnake, about three times as large as the norm. While" " it isn't big enough to regard humans as potential prey, it is more " -"aggresive and dangerous compared to a normal rattler." -msgstr "突變的森林響尾蛇,約為標準的三倍大小。雖然它還未大到足以把人類當成獵物,它比普通響尾蛇更具侵略性和危險。" +"aggressive and dangerous compared to a normal rattler." +msgstr "" #: lang/json/MONSTER_from_json.py msgid "sewer snake" @@ -45356,8 +45477,8 @@ msgstr "這是把簡單的鯉魚鉗,能夠進行基本的機械作業。更複 #: lang/json/TOOL_from_json.py msgid "pocket watch" -msgid_plural "pocket watchs" -msgstr[0] "懷錶" +msgid_plural "pocket watches" +msgstr[0] "" #. ~ Description for pocket watch #: lang/json/TOOL_from_json.py @@ -62424,6 +62545,10 @@ msgstr "修補零件" msgid "Refill tank/battery" msgstr "加滿油箱/電池" +#: lang/json/keybinding_from_json.py +msgid "Unload fuel bunker" +msgstr "" + #: lang/json/keybinding_from_json.py msgid "Remove part" msgstr "移除零件" @@ -75058,6 +75183,10 @@ msgstr "公廁" msgid "roadside foodcart" msgstr "路邊攤" +#: lang/json/overmap_terrain_from_json.py +msgid "garage - gas station" +msgstr "" + #: lang/json/overmap_terrain_from_json.py msgid "religious cemetery" msgstr "宗教墓地" @@ -75385,7 +75514,7 @@ msgid "stadium parking" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium concessions" +msgid "stadium" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -75453,7 +75582,7 @@ msgid "trailer park" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Mass Grave" +msgid "mass grave" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -75533,11 +75662,11 @@ msgid "Bankrupt Pizzeria" msgstr "破產比薩店" #: lang/json/overmap_terrain_from_json.py -msgid "Boat Rental" +msgid "boat rental" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "Riverside Dwelling" +msgid "riverside dwelling" msgstr "" #: lang/json/overmap_terrain_from_json.py @@ -75746,11 +75875,19 @@ msgid "animal clinic" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "stadium" +msgid "war memorial" msgstr "" #: lang/json/overmap_terrain_from_json.py -msgid "foreign wars veterans" +msgid "ruined cabin - barn" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - car corner" +msgstr "" + +#: lang/json/overmap_terrain_from_json.py +msgid "ruined cabin - dirt plaza" msgstr "" #: lang/json/professions_from_json.py @@ -96453,6 +96590,10 @@ msgstr "" msgid "SWAT Truck" msgstr "SWAT 貨櫃車" +#: lang/json/vehicle_from_json.py +msgid "Primitive Tractor" +msgstr "" + #: lang/json/vehicle_from_json.py msgid "Automatic Tractor" msgstr "自動拖拉機" @@ -97685,15 +97826,21 @@ msgid "external cargo rack" msgstr "" #: lang/json/vehicle_part_from_json.py -msgid "" -"A combustion engine. Burns fuel from a tank in the vehicle to move the " -"vehicle if the vehicle has sufficient wheels." +msgid "A combustion engine. Burns fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns diesel fuel from a tank in the vehicle." +msgstr "" + +#: lang/json/vehicle_part_from_json.py +msgid "A combustion engine. Burns gasoline fuel from a tank in the vehicle." msgstr "" #: lang/json/vehicle_part_from_json.py msgid "" -"A combustion engine. Burns gasoline fuel from a tank in the vehicle to move" -" the vehicle if the vehicle has sufficient wheels." +"A closed cycle, external combustion steam engine. Burns coal from a bunker " +"in the vehicle to produce steam." msgstr "" #: lang/json/vehicle_part_from_json.py @@ -98004,6 +98151,14 @@ msgstr "外置油箱(200 公升)" msgid "barrel (100L)" msgstr "桶子(100升)" +#. ~ Description for fuel bunker +#: lang/json/vehicle_part_from_json.py +msgid "" +"A storage space for holding solid fuels. If filled with the appropriate " +"fuel for the vehicle's engine, the engine will automatically draw fuel from " +"the tank when the engine is on." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "mounted flamethrower" msgstr "車載火焰噴射器" @@ -99343,6 +99498,12 @@ msgstr "" msgid "A living blob turned into a heavy vehicle weapon." msgstr "" +#: lang/json/vehicle_part_from_json.py +msgid "" +"A closed cycle, external combustion steam turbine. Burns coal from a bunker" +" in the vehicle to produce steam." +msgstr "" + #: lang/json/vehicle_part_from_json.py msgid "" "This part is obsolete. It should not be installed in a vehicle, and if it " @@ -105175,7 +105336,8 @@ msgstr[0] "你需要 %s 並有著 %d 電量。" #: src/crafting.cpp src/game.cpp src/game.cpp src/game.cpp src/iexamine.cpp #: src/iexamine.cpp src/iuse.cpp src/iuse.cpp src/iuse_actor.cpp #: src/iuse_actor.cpp src/iuse_actor.cpp src/npctalk.cpp src/npctalk.cpp -#: src/npctalk.cpp src/pickup.cpp src/player.cpp +#: src/npctalk.cpp src/pickup.cpp src/player.cpp src/player.cpp +#: src/veh_interact.cpp msgid "Never mind." msgstr "沒事。" @@ -105485,6 +105647,42 @@ msgstr "你擊中 %s 造成 %d 傷害。" msgid "%1$s shoots %2$s." msgstr "%1$s 射擊 %2$s。" +#: src/creature.cpp +msgid "Severe pain" +msgstr "" + +#: src/creature.cpp +msgid "Intense pain" +msgstr "" + +#: src/creature.cpp +msgid "Unmanageable pain" +msgstr "" + +#: src/creature.cpp +msgid "Distressing pain" +msgstr "" + +#: src/creature.cpp +msgid "Distracting pain" +msgstr "" + +#: src/creature.cpp +msgid "Moderate pain" +msgstr "" + +#: src/creature.cpp +msgid "Mild pain" +msgstr "" + +#: src/creature.cpp +msgid "Minimal pain" +msgstr "" + +#: src/creature.cpp +msgid "No pain" +msgstr "" + #: src/creature.cpp msgid "Hostile" msgstr "敵對" @@ -109205,15 +109403,15 @@ msgstr "世界保留。殘存角色:%s" msgid "Wait till you wake up..." msgstr "請稍候至醒來..." -#: src/game.cpp -msgid "(Y)es, (N)o, (I)gnore further distractions and finish." -msgstr " (Y) 是,(N) 否,(I) 忽略所有影響並完成。" - #: src/game.cpp #, c-format msgid "%s. Auto-move canceled" msgstr "%s。取消自動移動" +#: src/game.cpp +msgid "(Y)es, (N)o, (I)gnore further similar distractions and finish." +msgstr "" + #: src/game.cpp #, c-format msgid "The weather changed to %s!" @@ -110631,7 +110829,7 @@ msgstr "%s 沒地方可以去!" msgid "Use which item?" msgstr "使用哪個物品?" -#: src/game.cpp src/iuse.cpp +#: src/game.cpp src/iuse.cpp src/veh_interact.cpp msgid "Never mind" msgstr "沒事" @@ -137556,6 +137754,14 @@ msgstr "你不能對移動的車輛進行抽取。" msgid "Select part to siphon: " msgstr "" +#: src/veh_interact.cpp +msgid "The vehicle has no solid fuel left to remove." +msgstr "" + +#: src/veh_interact.cpp +msgid "You can't unload from a moving vehicle." +msgstr "" + #: src/veh_interact.cpp msgid "There is no wheel to change here." msgstr "這裡沒有輪子可以換。" @@ -137740,6 +137946,10 @@ msgstr "移除" msgid "iphon" msgstr "抽出燃油" +#: src/veh_interact.cpp +msgid "unloa" +msgstr "" + #: src/veh_interact.cpp msgid "hange tire" msgstr "更換輪胎" @@ -137890,6 +138100,10 @@ msgstr "使用哪個裝置?" msgid "Select tank to siphon:" msgstr "" +#: src/veh_interact.cpp +msgid "Remove what?" +msgstr "" + #: src/veh_interact.cpp #, c-format msgid "You don't meet the requirements to install the %s." diff --git a/lua/autoexec.lua b/lua/autoexec.lua index 63d8ddb5f5ccf..55be6c3a4e2ce 100644 --- a/lua/autoexec.lua +++ b/lua/autoexec.lua @@ -1,6 +1,10 @@ --dofile("./class_definitions.lua") -log = require("./lua/log") +package.path = package.path .. ";./lua/?.lua" --Windows/Linux +package.path = package.path .. ";/usr/share/cataclysm-dda/lua/?.lua" --Linux(via make install) +package.path = package.path .. ";/storage/emulated/0/Android/data/com.cleverraven.cataclysmdda/files/lua/?.lua" --Android + +log = require("log") log.init("./config/lua-log.log") outdated_metatable = { diff --git a/lua/class_definitions.lua b/lua/class_definitions.lua index c6b089d096270..ae1b8ad684545 100644 --- a/lua/class_definitions.lua +++ b/lua/class_definitions.lua @@ -185,9 +185,11 @@ classes = { { name = "get_time_died", rval = "time_point", args = { } }, { name = "get_vision_threshold", rval = "float", args = { "int" } }, { name = "gibType", rval = "field_id", args = { } }, + { name = "has_active_bionic", rval = "bool", args = { "bionic_id" } }, { name = "has_active_item", rval = "bool", args = { "string" } }, { name = "has_active_mutation", rval = "bool", args = { "trait_id" } }, { name = "has_base_trait", rval = "bool", args = { "trait_id" } }, + { name = "has_bionic", rval = "bool", args = { "bionic_id" } }, { name = "has_nv", rval = "bool", args = { } }, { name = "has_trait", rval = "bool", args = { "trait_id" } }, { name = "has_trait_flag", rval = "bool", args = { "string" } }, @@ -374,6 +376,103 @@ classes = { { name = "use_computer", rval = nil, args = { "tripoint" } }, } }, + -- TODO: activity_id is to be moved into activity_type.string_id. + -- Now: Visual Studio removes is_valid() function in optimisation, so compile will be filed. + activity_id = { + by_value = true, + has_equal = true, + new = { + { "activity_id" }, + { }, + { "string" } + }, + attributes = { + }, + functions = { + { name = "str", rval = "string", args = { } }, + { name = "obj", rval = "activity_type&", args = { } }, + } + }, + activity_type = { + attributes = { + }, + functions = { + { name = "id", rval = "activity_id&", args = { } }, + { name = "no_resume", rval = "bool", args = { } }, + { name = "rooted", rval = "bool", args = { } }, + { name = "suspendable", rval = "bool", args = { } }, + { name = "stop_phrase", rval = "string", args = { } }, + } + }, + player_activity = { + by_value_and_reference = true, + attributes = { + auto_resume = { type = "bool", writable = true }, + index = { type = "int", writable = true }, + moves_left = { type = "int", writable = true }, + moves_total = { type = "int", writable = true }, + name = { type = "string", writable = true }, + placement = { type = "tripoint", writable = true }, + position = { type = "int", writable = true }, + }, + new = { + { }, + { "activity_id", "int", "int", "int", "string" }, + { "player_activity" }, + }, + functions = { + { name = "is_null", rval = "bool", args = { } }, + { name = "set_to_null", rval = nil, args = { } }, + { name = "id", rval = "activity_id&", args = { } }, + { name = "rooted", rval = "bool", args = { } }, + { name = "is_suspendable", rval = "bool", args = { } }, + } + }, + bionic = { + attributes = { + charge = { type = "int", writable = true }, + id = { type = "bionic_id", writable = true }, + invlet = { type = "int", writable = true }, + powered = { type = "bool", writable = true }, + }, + functions = { + { name = "get_quality", rval = "int", args = { "quality_id" } }, + } + }, + bionic_data = { + string_id = "bionic_id", + attributes = { + activated = { type = "bool", writable = true }, + armor_interface = { type = "bool", writable = true }, + capacity = { type = "int", writable = true }, + charge_time = { type = "int", writable = true }, + description = { type = "string", writable = true }, + fake_item = { type = "string", writable = true }, + faulty = { type = "bool", writable = true }, + gun_bionic = { type = "bool", writable = true }, + name = { type = "string", writable = true }, + power_activate = { type = "int", writable = true }, + power_deactivate = { type = "int", writable = true }, + power_over_time = { type = "int", writable = true }, + power_source = { type = "bool", writable = true }, + toggled = { type = "bool", writable = true }, + upgraded_bionic = { type = "bionic_id", writable = true }, + weapon_bionic = { type = "bool", writable = true }, + }, + functions = { + { name = "is_included", rval = "bool", args = { "bionic_id" } }, + } + }, + morale_type_data = { + string_id = "morale_type", + attributes = { + id = { type = "morale_type", writable = true }, + }, + functions = { + { name = "describe", rval = "string", args = { }, optional_args = { "itype" } }, + { name = "is_permanent", rval = "bool", args = { } }, + } + }, encumbrance_data = { by_value = true, new = { @@ -400,6 +499,7 @@ classes = { player = { parent = "Character", attributes = { + activity = { type = "player_activity", writable = true }, blocks_left = { type = "int", writable = true }, cash = { type = "int", writable = true }, controlling_vehicle = { type = "bool", writable = true }, @@ -437,21 +537,28 @@ classes = { { name = "activate_bionic", rval = "bool", args = { "int" }, optional_args = { "bool" } }, { name = "active_light", rval = "float", args = { } }, { name = "add_addiction", rval = nil, args = { "add_type", "int" } }, + { name = "add_bionic", rval = nil, args = { "bionic_id" } }, { name = "add_known_trap", rval = nil, args = { "tripoint", "trap" } }, { name = "add_martialart", rval = nil, args = { "matype_id" } }, + { name = "add_morale", rval = nil, args = { "morale_type", "int" }, optional_args = { "int", "time_duration", "time_duration", "bool", "itype" } }, { name = "add_pain_msg", rval = nil, args = { "int", "body_part" } }, { name = "addiction_level", rval = "int", args = { "add_type" } }, { name = "adjacent_tile", rval = "tripoint", args = { } }, { name = "adjust_for_focus", rval = "int", args = { "int" } }, + { name = "allergy_type", rval = "morale_type", args = { "item" } }, { name = "amount_of", rval = "int", args = { "string" } }, { name = "amount_worn", rval = "int", args = { "string" } }, { name = "apply_damage", rval = nil, args = { "Creature", "body_part", "int" } }, { name = "apply_persistent_morale", rval = nil, args = { } }, + { name = "assign_activity", rval = nil, args = { "activity_id" }, optional_args = { "int", "int", "int", "string" } }, + { name = "assign_activity", rval = nil, args = { "player_activity" }, optional_args = { "bool" } }, { name = "attack_speed", rval = "int", args = { "item" } }, { name = "avoid_trap", rval = "bool", args = { "tripoint", "trap" } }, { name = "best_shield", rval = "item&", args = { } }, { name = "bonus_damage", rval = "float", args = { "bool" } }, { name = "basic_symbol_color", rval = "nc_color", args = { } }, + { name = "bionic_at_index", rval = "bionic&", args = { "int" } }, + { name = "bionic_by_invlet", rval = "bionic&", args = { "int" } }, { name = "blossoms", rval = nil, args = { } }, { name = "bodytemp_color", rval = "nc_color", args = { "int" } }, { name = "bonus_item_warmth", rval = "int", args = { "body_part" } }, @@ -542,6 +649,7 @@ classes = { { name = "gunmod_remove", rval = "bool", args = { "item", "item" } }, { name = "handle_melee_wear", rval = "bool", args = { "item" }, optional_args = { "float" } }, { name = "has_active_optcloak", rval = "bool", args = { } }, + { name = "has_activity", rval = "bool", args = { "activity_id" } }, { name = "has_addiction", rval = "bool", args = { "add_type" } }, { name = "has_alarm_clock", rval = "bool", args = { } }, { name = "has_amount", rval = "bool", args = { "string", "int" } }, @@ -560,6 +668,7 @@ classes = { { name = "has_martialart", rval = "bool", args = { "matype_id" } }, { name = "has_miss_recovery_tec", rval = "bool", args = { "item" } }, { name = "has_mission_item", rval = "bool", args = { "int" } }, + { name = "has_morale", rval = "int", args = { "morale_type" } }, { name = "has_morale_to_craft", rval = "bool", args = { } }, { name = "has_morale_to_read", rval = "bool", args = { } }, { name = "has_opposite_trait", rval = "bool", args = { "trait_id" } }, @@ -684,6 +793,8 @@ classes = { { name = "reduce_charges", rval = "item", args = { "item", "int" } }, { name = "regen", rval = nil, args = { "int" } }, { name = "rem_addiction", rval = nil, args = { "add_type" } }, + { name = "rem_morale", rval = nil, args = { "morale_type" }, optional_args = { "itype" } }, + { name = "remove_bionic", rval = nil, args = { "bionic_id" } }, { name = "remove_child_flag", rval = nil, args = { "trait_id" } }, { name = "remove_mutation", rval = nil, args = { "trait_id" } }, { name = "remove_random_bionic", rval = "bool", args = { } }, @@ -759,6 +870,79 @@ classes = { { name = "wield_contents", rval = "bool", args = { "item" }, optional_args = { "int", "int", "bool" } }, } }, + npc_companion_mission = { + by_value = true, + attributes = { + mission_id = { type = "string", writable = true }, + position = { type = "tripoint", writable = true }, + role_id = { type = "string", writable = true }, + }, + functions = { + } + }, + npc_personality = { + by_value = true, + attributes = { + aggression = { type = "int", writable = true }, + altruism = { type = "int", writable = true }, + bravery = { type = "int", writable = true }, + collector = { type = "int", writable = true }, + }, + functions = { + } + }, + npc_opinion = { + by_value = true, + attributes = { + anger = { type = "int", writable = true }, + fear = { type = "int", writable = true }, + trust = { type = "int", writable = true }, + owed = { type = "int", writable = true }, + value = { type = "int", writable = true }, + }, + functions = { + } + }, + npc = { + parent = "player", + attributes = { + companion_mission_time = { type = "time_point", writable = true }, + guard_pos = { type = "tripoint", writable = true }, + op_of_u = { type = "npc_opinion", writable = true }, + personality = { type = "npc_personality", writable = true }, + patience = { type = "int", writable = true }, + restock = { type = "time_point", writable = true }, + wander_pos = { type = "tripoint", writable = true }, + wanted_item_pos = { type = "tripoint", writable = true }, + }, + functions = { + { name = "assigned_missions_value", rval = "int", args = { } }, + { name = "can_move_to", rval = "bool", args = { "tripoint", "bool" } }, + { name = "current_target", rval = "Creature&", args = { } }, + { name = "get_attitude", rval = "npc_attitude", args = { } }, + { name = "get_companion_mission", rval = "npc_companion_mission", args = { } }, + { name = "get_healing_item", rval = "item&", args = { "bool", "bool", "bool", "bool" } }, + { name = "guaranteed_hostile", rval = "bool", args = { } }, + { name = "has_companion_mission", rval = "bool", args = { } }, + { name = "hostile_anger_level", rval = "int", args = { } }, + { name = "is_active", rval = "bool", args = { } }, + { name = "is_dead", rval = "bool", args = { } }, + { name = "is_enemy", rval = "bool", args = { } }, + { name = "is_following", rval = "bool", args = { } }, + { name = "is_friend", rval = "bool", args = { } }, + { name = "is_guarding", rval = "bool", args = { } }, + { name = "is_leader", rval = "bool", args = { } }, + { name = "is_minion", rval = "bool", args = { } }, + { name = "make_angry", rval = nil, args = { } }, + { name = "reset_companion_mission", rval = nil, args = { } }, + { name = "say", rval = nil, args = { "string" } }, + { name = "set_attitude", rval = nil, args = { "npc_attitude" } }, + { name = "set_companion_mission", rval = nil, args = { "npc", "string" } }, + { name = "shop_restock", rval = nil, args = { } }, + { name = "spawn_at_precise", rval = nil, args = { "point", "tripoint" } }, + { name = "talk_to_u", rval = nil, args = { } }, + } + }, item = { new = { { }, @@ -775,7 +959,6 @@ classes = { burnt = { type = "int", writable = true }, charges = { type = "int", writable = true }, frequency = { type = "int", writable = true }, - fridge = { type = "time_point", writable = true }, invlet = { type = "int", writable = true }, irridation = { type = "int", writable = true }, item_counter = { type = "int", writable = true }, @@ -1891,6 +2074,24 @@ enums = { "MS_LARGE", "MS_HUGE", }, + npc_attitude = { + "NPCATT_NULL", + "NPCATT_TALK", + "NPCATT_LEGACY_1", + "NPCATT_FOLLOW", + "NPCATT_LEGACY_2", + "NPCATT_LEAD", + "NPCATT_WAIT", + "NPCATT_LEGACY_6", + "NPCATT_MUG", + "NPCATT_WAIT_FOR_LEAVE", + "NPCATT_KILL", + "NPCATT_FLEE", + "NPCATT_LEGACY_3", + "NPCATT_HEAL", + "NPCATT_LEGACY_4", + "NPCATT_LEGACY_5", + }, game_message_type = { "m_good", "m_bad", @@ -2047,6 +2248,12 @@ global_functions = { rval = "Creature&", desc = "Returns a reference to creature at given tripoint, *or* nil if there is no creature." }, + get_npc_at = { + cpp_name = "g->critter_at", + args = { "tripoint" }, + rval = "npc&", + desc = "Returns a reference to npc at given tripoint, *or* nil if there is no npc." + }, create_monster = { cpp_name = "create_monster", args = { "mtype_id", "tripoint" }, diff --git a/src/action.cpp b/src/action.cpp index 56c97886aef5a..75584d1ef5829 100644 --- a/src/action.cpp +++ b/src/action.cpp @@ -765,15 +765,14 @@ action_id handle_action_menu() #endif } - std::string title = _( "Back" ); - title += "..."; - if( category == "back" ) { - title = _( "Cancel" ); + if( category != "back" ) { + std::string msg = _( "Back" ); + msg += "..."; + entries.emplace_back( uimenu_entry( 2 * NUM_ACTIONS, true, + hotkey_for_action( ACTION_ACTIONMENU ), msg ) ); } - entries.emplace_back( uimenu_entry( 2 * NUM_ACTIONS, true, - hotkey_for_action( ACTION_ACTIONMENU ), title ) ); - title = _( "Actions" ); + std::string title = _( "Actions" ); if( category != "back" ) { catgname = _( category.c_str() ); capitalize_letter( catgname, 0 ); @@ -790,12 +789,12 @@ action_id handle_action_menu() width += 2 + 3 + 3; int ix = ( TERMX > width ) ? ( TERMX - width ) / 2 - 1 : 0; int iy = ( TERMY > ( int )entries.size() + 2 ) ? ( TERMY - ( int )entries.size() - 2 ) / 2 - 1 : 0; - int selection = ( int ) uimenu( true, std::max( ix, 0 ), std::min( width, TERMX - 2 ), - std::max( iy, 0 ), title, entries ); + int selection = uilist( std::max( ix, 0 ), std::min( width, TERMX - 2 ), + std::max( iy, 0 ), title, entries ); g->draw(); - if( selection < 0 ) { + if( selection < 0 || selection == NUM_ACTIONS ) { return ACTION_NULL; } else if( selection == 2 * NUM_ACTIONS ) { if( category != "back" ) { @@ -847,12 +846,12 @@ action_id handle_main_menu() width += 2 + 3 + 3; int ix = ( TERMX > width ) ? ( TERMX - width ) / 2 - 1 : 0; int iy = ( TERMY > ( int )entries.size() + 2 ) ? ( TERMY - ( int )entries.size() - 2 ) / 2 - 1 : 0; - int selection = ( int ) uimenu( true, std::max( ix, 0 ), std::min( width, TERMX - 2 ), - std::max( iy, 0 ), _( "MAIN MENU" ), entries ); + int selection = uilist( std::max( ix, 0 ), std::min( width, TERMX - 2 ), + std::max( iy, 0 ), _( "MAIN MENU" ), entries ); g->draw(); - if( selection < 0 || selection > NUM_ACTIONS ) { + if( selection < 0 || selection >= NUM_ACTIONS ) { return ACTION_NULL; } else { return ( action_id ) selection; diff --git a/src/activity_handlers.cpp b/src/activity_handlers.cpp index 32b84f0f4f579..997afc35bb584 100644 --- a/src/activity_handlers.cpp +++ b/src/activity_handlers.cpp @@ -477,7 +477,7 @@ void butchery_drops_hardcoded( item *corpse_item, const mtype *corpse, player *p int pieces = corpse->get_meat_chunks_count(); int skins = 0; int bones = 0; - int fats = 0; + int fats = pieces / 5; int sinews = 0; int feathers = 0; int wool = 0; @@ -490,41 +490,37 @@ void butchery_drops_hardcoded( item *corpse_item, const mtype *corpse, player *p bones = 1; fats = 1; sinews = 1; - feathers = 2; + feathers = 4; wool = 1; break; case MS_SMALL: skins = 2; - bones = 4; - fats = 2; + bones = 8; sinews = 4; - feathers = 6; - wool = 2; + feathers = 12; + wool = 4; break; case MS_MEDIUM: - skins = 4; - bones = 9; - fats = 4; + skins = 5; + bones = 18; sinews = 9; - feathers = 11; - wool = 4; + feathers = 22; + wool = 8; break; case MS_LARGE: - skins = 8; - bones = 14; - fats = 8; + skins = 10; + bones = 28; sinews = 14; - feathers = 17; - wool = 8; + feathers = 36; + wool = 16; max_practice = 5; break; case MS_HUGE: - skins = 16; - bones = 21; - fats = 16; + skins = 20; + bones = 42; sinews = 21; - feathers = 24; - wool = 16; + feathers = 48; + wool = 32; max_practice = 6; break; } diff --git a/src/advanced_inv.cpp b/src/advanced_inv.cpp index 91298abfb0d9a..2e2d4898fc4a8 100644 --- a/src/advanced_inv.cpp +++ b/src/advanced_inv.cpp @@ -1366,8 +1366,7 @@ bool advanced_inventory::move_all_items(bool nested_call) bool advanced_inventory::show_sort_menu( advanced_inventory_pane &pane ) { - uimenu sm; - sm.return_invalid = true; + uilist sm; sm.text = _( "Sort by... " ); sm.addentry( SORTBY_NONE, true, 'u', _( "Unsorted (recently added first)" ) ); sm.addentry( SORTBY_NAME, true, 'n', get_sortname( SORTBY_NAME ) ); @@ -1917,7 +1916,7 @@ bool advanced_inventory::query_destination( aim_location &def ) return false; } - uimenu menu; + uilist menu; menu.text = _( "Select destination" ); menu.pad_left = 9; /* free space for advanced_inventory::menu_square */ @@ -1945,7 +1944,7 @@ bool advanced_inventory::query_destination( aim_location &def ) // Selected keyed to uimenu.entries, which starts at 0. menu.selected = uistate.adv_inv_last_popup_dest - AIM_SOUTHWEST; menu.show(); // generate and show window. - while( menu.ret == UIMENU_INVALID && menu.keypress != 'q' && menu.keypress != KEY_ESCAPE ) { + while( menu.ret == UIMENU_WAIT_INPUT ) { // Render a fancy ASCII grid at the left of the menu. menu_square( menu ); menu.query( false ); // query, but don't loop diff --git a/src/bionics.cpp b/src/bionics.cpp index bb4d6021692d7..f6c5d13382f18 100644 --- a/src/bionics.cpp +++ b/src/bionics.cpp @@ -32,6 +32,7 @@ #include "mutation.h" #include "requirements.h" #include "vpart_position.h" +#include "ui.h" #include //std::min #include @@ -357,6 +358,7 @@ bool player::activate_bionic( int b, bool eff_only ) mod_moves( -100 ); } else if( bio.id == "bio_evap" ) { item water = item( "water_clean", 0 ); + water.reset_temp_check(); int humidity = weatherPoint.humidity; int water_charges = ( humidity * 3.0 ) / 100.0 + 0.5; // At 50% relative humidity or more, the player will draw 2 units of water @@ -512,11 +514,12 @@ bool player::activate_bionic( int b, bool eff_only ) get_local_windchill( weatherPoint.temperature, weatherPoint.humidity, windpower ) + player_local_temp ).c_str() ); } else if( bio.id == "bio_remote" ) { - int choice = menu( true, _( "Perform which function:" ), _( "Nothing" ), - _( "Control vehicle" ), _( "RC radio" ), NULL ); - if( choice >= 2 && choice <= 3 ) { + int choice = uilist( _( "Perform which function:" ), { + _( "Control vehicle" ), _( "RC radio" ) + } ); + if( choice >= 0 && choice <= 1 ) { item ctr; - if( choice == 2 ) { + if( choice == 0 ) { ctr = item( "remotevehcontrol", 0 ); } else { ctr = item( "radiocontrol", 0 ); @@ -815,7 +818,7 @@ void player::bionics_uninstall_failure( player &installer ) float player::bionics_adjusted_skill( const skill_id &most_important_skill, const skill_id &important_skill, const skill_id &least_important_skill, - bool autodoc, int skill_level ) + int skill_level ) { int pl_skill; if( skill_level == -1 ) { @@ -835,10 +838,10 @@ float player::bionics_adjusted_skill( const skill_id &most_important_skill, _( " prepares for surgery." ) ); } - // People trained in using the Autodoc gain an additional advantage towards using it - if( autodoc && has_trait( trait_PROF_AUTODOC ) ) { + // People trained in bionics gain an additional advantage towards using it + if( has_trait( trait_PROF_AUTODOC ) ) { pl_skill += 7; - add_msg( m_neutral, _( "A lifetime of Autodoc use has taught %s a thing or two..." ), + add_msg( m_neutral, _( "A lifetime of augmentation has taught %s a thing or two..." ), disp_name() ); } @@ -918,7 +921,7 @@ bool player::uninstall_bionic( bionic_id const &b_id, player &installer, bool au float adjusted_skill = installer.bionics_adjusted_skill( skilll_firstaid, skilll_computer, skilll_electronics, - autodoc, skill_level ); + skill_level ); int chance_of_success = bionic_manip_cos( adjusted_skill, autodoc, difficulty + 2 ); if( chance_of_success >= 100 ) { @@ -988,12 +991,12 @@ bool player::install_bionics( const itype &type, player &installer, bool autodoc adjusted_skill = installer.bionics_adjusted_skill( skilll_firstaid, skilll_computer, skilll_electronics, - autodoc, skill_level ); + skill_level ); } else { adjusted_skill = installer.bionics_adjusted_skill( skilll_electronics, skilll_firstaid, skilll_mechanics, - autodoc, skill_level ); + skill_level ); } int chance_of_success = bionic_manip_cos( adjusted_skill, autodoc, difficult ); diff --git a/src/calendar.cpp b/src/calendar.cpp index d0ba302472329..f3e0f5fccc6ac 100644 --- a/src/calendar.cpp +++ b/src/calendar.cpp @@ -292,46 +292,58 @@ float calendar::sunlight() const } } -std::string to_string_clipped( const time_duration &d ) +std::pair, std::string> to_num_and_unit( const time_duration &d ) { //@todo: change INDEFINITELY_LONG to time_duration if( to_turns( d ) >= calendar::INDEFINITELY_LONG ) { - return _( "forever" ); + return { {}, _( "forever" ) }; } if( d < 1_minutes ) { //@todo: add to_seconds,from_seconds, operator ""_seconds, but currently // this could be misleading as we only store turns, which are 6 whole seconds const int sec = to_turns( d ) * 6; - return string_format( ngettext( "%d second", "%d seconds", sec ), sec ); + return { sec, npgettext( "time unit", "second", "seconds", sec ) }; } else if( d < 1_hours ) { const int min = to_minutes( d ); - return string_format( ngettext( "%d minute", "%d minutes", min ), min ); + return { min, npgettext( "time unit", "minute", "minutes", min ) }; } else if( d < 1_days ) { const int hour = to_hours( d ); - return string_format( ngettext( "%d hour", "%d hours", hour ), hour ); + return { hour, npgettext( "time unit", "hour", "hours", hour ) }; } else if( d < calendar::season_length() || calendar::eternal_season() ) { // eternal seasons means one season is indistinguishable from the next, // therefore no way to count them const int day = to_days( d ); - return string_format( ngettext( "%d day", "%d days", day ), day ); + return { day, npgettext( "time unit", "day", "days", day ) }; } else if( d < calendar::year_length() && !calendar::eternal_season() ) { //@todo: consider a to_season function, but season length is variable, so // this might be misleading const int season = to_turns( d ) / to_turns( calendar::season_length() ); - return string_format( ngettext( "%d season", "%d seasons", season ), season ); + return { season, npgettext( "time units", "season", "seasons", season ) }; } else { //@todo: consider a to_year function, but year length is variable, so // this might be misleading const int year = to_turns( d ) / to_turns( calendar::year_length() ); - return string_format( ngettext( "%d year", "%d years", year ), year ); + return { year, npgettext( "time unit", "year", "years", year ) }; + } +} + +std::string to_string_clipped( const time_duration &d ) +{ + const auto &num_n_unit = to_num_and_unit( d ); + if( num_n_unit.first.has_value() ) { + //~ %d is time number, %s is time unit + return string_format( pgettext( "time duration", "%d %s" ), + num_n_unit.first.value(), num_n_unit.second ); + } else { + return num_n_unit.second; } } std::string to_string( const time_duration &d ) { if( d >= time_duration::from_turns( calendar::INDEFINITELY_LONG ) ) { - return _( "for ever" ); + return _( "forever" ); } if( d <= 1_minutes ) { diff --git a/src/calendar.h b/src/calendar.h index 7668ddeec5743..b44d5859c1c36 100644 --- a/src/calendar.h +++ b/src/calendar.h @@ -4,6 +4,8 @@ #include +#include "optional.h" + class time_duration; class time_point; class JsonOut; @@ -471,10 +473,15 @@ constexpr time_duration operator"" _days( const unsigned long long int v ) * 0 so it's skipped). */ std::string to_string( const time_duration &d ); +/** + * Returns a number and a unit as in the string returned by @ref to_string_clipped. + * If the duration is "forever", the optional int has no value. + */ +std::pair, std::string> to_num_and_unit( const time_duration &d ); /** * Returns a string showing a duration as whole number of appropriate units, e.g. * "10 days" or "1 minute". - * The chosen unit will be the largest unit, that is as least as much as the + * The chosen unit will be the smallest unit, that is at least as much as the * given duration. E.g. an input of 60 minutes will return "1 hour", an input of * 59 minutes will return "59 minutes". */ diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index cd0e7bf75a63d..fe39ea1e194c9 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -36,6 +36,7 @@ #include "cursesport.h" #include "rect_range.h" #include "clzones.h" +#include "mod_tileset.h" #include #include @@ -608,6 +609,72 @@ void tileset_loader::load( const std::string &tileset_id, const bool precheck ) // Load tile information if available. offset = 0; + load_internal( config, tileset_root, img_path ); + + // Load mod tilesets if available + for( auto mts : all_mod_tilesets ) { + // Set sprite_id offset to separate from other tilesets. + sprite_id_offset = offset; + tileset_root = mts->get_base_path(); + json_path = mts->get_full_path(); + + if( !mts->is_compatible( tileset_id ) ) { + dbg( D_ERROR ) << "Mod tileset in \"" << json_path << "\" is not compatible."; + continue; + } + dbg( D_INFO ) << "Attempting to Load JSON file " << json_path; + std::ifstream mod_config_file( json_path.c_str(), std::ifstream::in | std::ifstream::binary ); + + if( !mod_config_file.good() ) { + throw std::runtime_error( std::string( "Failed to open tile info json: " ) + json_path ); + } + + JsonIn mod_config_json( mod_config_file ); + + int num_in_file = 1; + if( mod_config_json.test_array() ) { + JsonArray mod_config_array = mod_config_json.get_array(); + while( mod_config_array.has_more() ) { + JsonObject mod_config = mod_config_array.next_object(); + if( mod_config.get_string( "type" ) == "mod_tileset" ) { + if( num_in_file == mts->num_in_file() ) { + load_internal( mod_config, tileset_root, img_path ); + break; + } + num_in_file++; + } + } + } else { + JsonObject mod_config = mod_config_json.get_object(); + load_internal( mod_config, tileset_root, img_path ); + } + } + + // loop through all tile ids and eliminate empty/invalid things + for( auto it = ts.tile_ids.begin(); it != ts.tile_ids.end(); ) { + auto &td = it->second; // second is the tile_type describing that id + process_variations_after_loading( td.fg ); + process_variations_after_loading( td.bg ); + // All tiles need at least foreground or background data, otherwise they are useless. + if( td.bg.empty() && td.fg.empty() ) { + dbg( D_ERROR ) << "tile " << it->first << " has no (valid) foreground nor background"; + ts.tile_ids.erase( it++ ); + } else { + ++it; + } + } + + if( !ts.find_tile_type( "unknown" ) ) { + dbg( D_ERROR ) << "The tileset you're using has no 'unknown' tile defined!"; + } + ensure_default_item_highlight(); + + ts.tileset_id = tileset_id; +} + +void tileset_loader::load_internal( JsonObject &config, const std::string &tileset_root, + const std::string &img_path ) +{ if( config.has_array( "tiles-new" ) ) { // new system, several entries // When loading multiple tileset images this defines where @@ -664,27 +731,6 @@ void tileset_loader::load( const std::string &tileset_id, const bool precheck ) // offset should be the total number of sprites loaded from every tileset image // eliminate any sprite references that are too high to exist // also eliminate negative sprite references - - // loop through all tile ids and eliminate empty/invalid things - for( auto it = ts.tile_ids.begin(); it != ts.tile_ids.end(); ) { - auto &td = it->second; // second is the tile_type describing that id - process_variations_after_loading( td.fg ); - process_variations_after_loading( td.bg ); - // All tiles need at least foreground or background data, otherwise they are useless. - if( td.bg.empty() && td.fg.empty() ) { - dbg( D_ERROR ) << "tile " << it->first << " has no (valid) foreground nor background"; - ts.tile_ids.erase( it++ ); - } else { - ++it; - } - } - - if( !ts.find_tile_type( "unknown" ) ) { - dbg( D_ERROR ) << "The tileset you're using has no 'unknown' tile defined!"; - } - ensure_default_item_highlight(); - - ts.tileset_id = tileset_id; } void tileset_loader::process_variations_after_loading( weighted_int_list> &vs ) @@ -923,7 +969,7 @@ void tileset_loader::load_tile_spritelists( JsonObject &entry, if( g_array.test_int() ) { std::vector v; while( g_array.has_more() ) { - const int sprite_id = g_array.next_int(); + const int sprite_id = g_array.next_int() + sprite_id_offset; if( sprite_id >= 0 ) { v.push_back( sprite_id ); } @@ -943,7 +989,7 @@ void tileset_loader::load_tile_spritelists( JsonObject &entry, } // int sprite means one sprite if( vo.has_int( "sprite" ) ) { - const int sprite_id = vo.get_int( "sprite" ); + const int sprite_id = vo.get_int( "sprite" ) + sprite_id_offset; if( sprite_id >= 0 ) { v.push_back( sprite_id ); } @@ -952,7 +998,7 @@ void tileset_loader::load_tile_spritelists( JsonObject &entry, else if( vo.has_array( "sprite" ) ) { JsonArray sprites = vo.get_array( "sprite" ); while( sprites.has_more() ) { - const int sprite_id = sprites.next_int(); + const int sprite_id = sprites.next_int() + sprite_id_offset; if( sprite_id >= 0 && sprite_id < size ) { v.push_back( sprite_id ); } else { @@ -972,7 +1018,7 @@ void tileset_loader::load_tile_spritelists( JsonObject &entry, } // json int indicates a single sprite id else if( entry.has_int( objname ) && entry.get_int( objname ) >= 0 ) { - vs.add( std::vector( {entry.get_int( objname )} ), 1 ); + vs.add( std::vector( {entry.get_int( objname ) + sprite_id_offset} ), 1 ); } } @@ -1625,8 +1671,7 @@ const tile_type *cata_tiles::find_tile_with_season( std::string &id ) const tile_type *cata_tiles::find_tile_looks_like( std::string &id, TILE_CATEGORY category ) { std::string looks_like = id; - int cnt = 0; - while( !looks_like.empty() && cnt < 10 ) { + for( int cnt = 0; cnt < 10 && !looks_like.empty(); cnt++ ) { const tile_type *lltt = find_tile_with_season( looks_like ); if( lltt ) { id = looks_like; @@ -1670,11 +1715,47 @@ const tile_type *cata_tiles::find_tile_looks_like( std::string &id, TILE_CATEGOR } else { return nullptr; } - cnt += 1; } return nullptr; } +bool cata_tiles::find_overlay_looks_like( const bool male, const std::string &overlay, + std::string &draw_id ) +{ + bool exists = false; + + std::string looks_like; + std::string over_type; + if( overlay.substr( 0, 5 ) == "worn_" ) { + looks_like = overlay.substr( 5 ); + over_type = "worn_"; + } else if( overlay.substr( 0, 8 ) == "wielded_" ) { + looks_like = overlay.substr( 8 ); + over_type = "wielded_"; + } else { + looks_like = overlay; + } + + for( int cnt = 0; cnt < 10 && !looks_like.empty(); cnt++ ) { + draw_id = ( male ? "overlay_male_" : "overlay_female_" ) + over_type + looks_like; + if( tileset_ptr->find_tile_type( draw_id ) ) { + exists = true; + break; + } + draw_id = "overlay_" + over_type + looks_like; + if( tileset_ptr->find_tile_type( draw_id ) ) { + exists = true; + break; + } + if( !item::type_is_defined( looks_like ) ) { + break; + } + const itype *new_it = item::find_type( looks_like ); + looks_like = new_it->looks_like; + } + return exists; +} + bool cata_tiles::draw_from_id_string( std::string id, TILE_CATEGORY category, const std::string &subcategory, tripoint pos, int subtile, int rota, lit_level ll, @@ -2390,7 +2471,7 @@ bool cata_tiles::draw_critter_at( const tripoint &p, lit_level ll, int &height_3 bool cata_tiles::draw_zone_mark( const tripoint &p, lit_level ll, int &height_3d ) { - if( !g->is_zone_manager_open() ) { + if( !g->is_zones_manager_open() ) { return false; } @@ -2458,17 +2539,8 @@ void cata_tiles::draw_entity_with_overlays( const player &pl, const tripoint &p, // next up, draw all the overlays std::vector overlays = pl.get_overlay_ids(); for( const std::string &overlay : overlays ) { - bool exists = true; - std::string draw_id = pl.male ? "overlay_male_" + overlay : "overlay_female_" + overlay; - if( !tileset_ptr->find_tile_type( draw_id ) ) { - draw_id = "overlay_" + overlay; - if( !tileset_ptr->find_tile_type( draw_id ) ) { - exists = false; - } - } - - // make sure we don't draw an annoying "unknown" tile when we have nothing to draw - if( exists ) { + std::string draw_id = overlay; + if( find_overlay_looks_like( pl.male, overlay, draw_id ) ) { int overlay_height_3d = prev_height_3d; draw_from_id_string( draw_id, C_NONE, "", p, corner, 0, ll, false, overlay_height_3d ); // the tallest height-having overlay is the one that counts @@ -3093,5 +3165,4 @@ void cata_tiles::tile_loading_report( arraytype const &array, int array_length, return v->id; }, label, prefix ); } - #endif // SDL_TILES diff --git a/src/cata_tiles.h b/src/cata_tiles.h index d2becd4a41a8d..1d5ad9e4c2a6f 100644 --- a/src/cata_tiles.h +++ b/src/cata_tiles.h @@ -21,6 +21,7 @@ #include #include +class cata_tiles; class Creature; class player; class JsonObject; @@ -300,6 +301,7 @@ class tileset_loader int sprite_height; int offset = 0; + int sprite_id_offset = 0; int size = 0; struct { @@ -351,6 +353,12 @@ class tileset_loader * @throw std::exception On any error. */ void load_tilejson_from_file( JsonObject &config ); + /** + * Helper function called by load. + * @throw std::exception On any error. + */ + void load_internal( JsonObject &config, const std::string &tileset_root, + const std::string &img_path ); public: tileset_loader( tileset &ts, SDL_Renderer *const r ) : ts( ts ), renderer( r ) { } @@ -404,6 +412,7 @@ class cata_tiles const tile_type *find_tile_with_season( std::string &id ); const tile_type *find_tile_looks_like( std::string &id, TILE_CATEGORY category ); + bool find_overlay_looks_like( const bool male, const std::string &overlay, std::string &draw_id ); bool draw_from_id_string( std::string id, tripoint pos, int subtile, int rota, lit_level ll, bool apply_night_vision_goggles ); diff --git a/src/catalua.cpp b/src/catalua.cpp index c194d7b3b8377..3ab14b5800afa 100644 --- a/src/catalua.cpp +++ b/src/catalua.cpp @@ -38,6 +38,9 @@ #include "filesystem.h" #include "string_input_popup.h" #include "mutation.h" +#include "npc.h" +#include "bionics.h" +#include "activity_type.h" extern "C" { #include "lua.h" #include "lualib.h" diff --git a/src/clzones.cpp b/src/clzones.cpp index ae8ce12161a0e..0cec2fdcb34ee 100644 --- a/src/clzones.cpp +++ b/src/clzones.cpp @@ -84,13 +84,10 @@ bool zone_options::is_valid( const zone_type_id &type, const zone_options &optio return !options.has_options(); } -void plot_options::query_seed() +plot_options::query_seed_result plot_options::query_seed() { player &p = g->u; - seed = ""; - mark = ""; - std::vector seed_inv = p.items_with( []( const item & itm ) { return itm.is_seed(); } ); @@ -102,25 +99,44 @@ void plot_options::query_seed() if( seed_index > 0 && seed_index < static_cast( seed_entries.size() ) ) { const auto &seed_entry = seed_entries[seed_index]; - seed = std::get<0>( seed_entry ); + const auto new_seed = std::get<0>( seed_entry ); + std::string new_mark; - item it = item( itype_id( seed ) ); + item it = item( itype_id( new_seed ) ); if( it.is_seed() ) { - mark = it.type->seed->fruit_id; + new_mark = it.type->seed->fruit_id; } else { - mark = seed; + new_mark = seed; } + + if( new_seed != seed || new_mark != mark ) { + seed = new_seed; + mark = new_mark; + return changed; + } else { + return successful; + } + } else if( seed_index == 0 ) { // No seeds + if( seed != "" || mark != "" ) { + seed = ""; + mark = ""; + return changed; + } else { + return successful; + } + } else { + return canceled; } } -void plot_options::query_at_creation() +bool plot_options::query_at_creation() { - query_seed(); + return query_seed() != canceled; }; -void plot_options::query() +bool plot_options::query() { - query_seed(); + return query_seed() == changed; }; std::string plot_options::get_zone_name_suggestion() const @@ -159,20 +175,26 @@ void plot_options::deserialize( JsonObject &jo_zone ) seed = jo_zone.get_string( "seed", "" ); }; -std::string zone_manager::query_name( std::string default_name ) const +cata::optional zone_manager::query_name( std::string default_name ) const { - return string_input_popup() - .title( _( "Zone name:" ) ) - .width( 55 ) - .text( default_name ) - .max_length( 15 ) - .query_string(); + string_input_popup popup; + popup + .title( _( "Zone name:" ) ) + .width( 55 ) + .text( default_name ) + .max_length( 15 ) + .query(); + if( popup.canceled() ) { + return {}; + } else { + return popup.text(); + } } -zone_type_id zone_manager::query_type() const +cata::optional zone_manager::query_type() const { const auto &types = get_manager().get_types(); - uimenu as_m; + uilist as_m; as_m.text = _( "Select zone type:" ); size_t i = 0; @@ -181,6 +203,9 @@ zone_type_id zone_manager::query_type() const } as_m.query(); + if( as_m.ret < 0 ) { + return {}; + } size_t index = as_m.ret; auto iter = types.begin(); @@ -189,18 +214,35 @@ zone_type_id zone_manager::query_type() const return iter->first; } -void zone_manager::zone_data::set_name() +bool zone_manager::zone_data::set_name() { - const std::string new_name = get_manager().query_name( name ); - - name = ( new_name.empty() ) ? _( "" ) : new_name; + const auto maybe_name = get_manager().query_name( name ); + if( maybe_name.has_value() ) { + auto new_name = maybe_name.value(); + if( new_name.empty() ) { + new_name = _( "" ); + } + if( name != new_name ) { + name = new_name; + return true; + } + } + return false; } -void zone_manager::zone_data::set_type() +bool zone_manager::zone_data::set_type() { - type = get_manager().query_type(); - - get_manager().cache_data(); + const auto maybe_type = get_manager().query_type(); + if( maybe_type.has_value() && maybe_type.value() != type ) { + auto new_options = zone_options::create( maybe_type.value() ); + if( new_options->query_at_creation() ) { + type = maybe_type.value(); + options = new_options; + get_manager().cache_data(); + return true; + } + } + return false; } void zone_manager::zone_data::set_position( const std::pair position ) @@ -454,6 +496,28 @@ zone_manager::zone_data &zone_manager::add( const std::string &name, const zone_ return zones.back(); } +bool zone_manager::remove( const size_t index ) +{ + if( index < zones.size() ) { + zones.erase( zones.begin() + index ); + return true; + } + + return false; +} + +bool zone_manager::remove( zone_data &zone ) +{ + for( auto it = zones.begin(); it != zones.end(); ++it ) { + if( &zone == &*it ) { + zones.erase( it ); + return true; + } + } + + return false; +} + void zone_manager::swap( zone_data &a, zone_data &b ) { std::swap( a, b ); diff --git a/src/clzones.h b/src/clzones.h index 8d00fb78486e0..25e1284392c49 100644 --- a/src/clzones.h +++ b/src/clzones.h @@ -5,6 +5,7 @@ #include "enums.h" #include "string_id.h" #include "item.h" +#include "optional.h" #include #include @@ -42,11 +43,17 @@ class zone_options return false; }; - /* query only necessary options at zone creation, one by one */ - virtual void query_at_creation() {}; + /* query only necessary options at zone creation, one by one + * returns true if successful, returns false if fails or canceled */ + virtual bool query_at_creation() { + return true; + }; - /* query options, first uimenu should allow to pick an option to edit (if more than one) */ - virtual void query() {}; + /* query options, first uimenu should allow to pick an option to edit (if more than one) + * returns true if something is changed, otherwise returns false */ + virtual bool query() { + return false; + }; /* suggest a name for the zone, depending on options */ virtual std::string get_zone_name_suggestion() const { @@ -77,7 +84,13 @@ class plot_options : public zone_options, public mark_option std::string mark; std::string seed; - void query_seed(); + enum query_seed_result { + canceled, + successful, + changed, + }; + + query_seed_result query_seed(); public: std::string get_mark() const override { @@ -91,8 +104,8 @@ class plot_options : public zone_options, public mark_option return true; }; - void query_at_creation() override; - void query() override; + bool query_at_creation() override; + bool query() override; std::string get_zone_name_suggestion() const override; @@ -137,14 +150,8 @@ class zone_manager const tripoint &start, const tripoint &end, std::shared_ptr options = nullptr ); - bool remove( const size_t index ) { - if( index < zones.size() ) { - zones.erase( zones.begin() + index ); - return true; - } - - return false; - } + bool remove( const size_t index ); + bool remove( zone_data &zone ); unsigned int size() const { return zones.size(); @@ -162,8 +169,8 @@ class zone_manager std::vector get_zones( const zone_type_id &type, const tripoint &where ) const; const zone_data *get_top_zone( const tripoint &where ) const; const zone_data *get_bottom_zone( const tripoint &where ) const; - std::string query_name( std::string default_name = "" ) const; - zone_type_id query_type() const; + cata::optional query_name( std::string default_name = "" ) const; + cata::optional query_type() const; void swap( zone_data &a, zone_data &b ); // 'direct' access to zone_manager::zones, giving direct access was nono @@ -207,8 +214,8 @@ class zone_manager::zone_data } } - void set_name(); - void set_type(); + bool set_name(); // returns true if name is changed + bool set_type(); // returns true if type is changed void set_position( const std::pair position ); void set_enabled( const bool enabled ); diff --git a/src/color.cpp b/src/color.cpp index 48417ca19c2aa..42283ac3d8831 100644 --- a/src/color.cpp +++ b/src/color.cpp @@ -851,10 +851,9 @@ void color_manager::show_gui() auto vFiles = get_files_from_path( ".json", FILENAMES["color_templates"], false, true ); if( vFiles.size() > 0 ) { - uimenu ui_templates; + uilist ui_templates; ui_templates.w_y = iHeaderHeight + 1 + iOffsetY; ui_templates.w_height = 18; - ui_templates.return_invalid = true; ui_templates.text = _( "Color templates:" ); @@ -862,10 +861,9 @@ void color_manager::show_gui() ui_templates.addentry( filename.substr( filename.find_last_of( "/" ) + 1 ) ); } - ui_templates.addentry( std::string( _( "Cancel" ) ) ); ui_templates.query(); - if( ( size_t )ui_templates.ret < vFiles.size() ) { + if( ui_templates.ret >= 0 && ( size_t )ui_templates.ret < vFiles.size() ) { bStuffChanged = true; clear(); @@ -883,10 +881,9 @@ void color_manager::show_gui() finalize(); // Need to recalculate caches } else if( action == "CONFIRM" ) { - uimenu ui_colors; + uilist ui_colors; ui_colors.w_y = iHeaderHeight + 1 + iOffsetY; ui_colors.w_height = 18; - ui_colors.return_invalid = true; std::string sColorType = _( "Normal" ); std::string sSelected = name_color_map[sActive].name_custom; @@ -920,10 +917,9 @@ void color_manager::show_gui() i++; } - ui_colors.addentry( std::string( _( "Cancel" ) ) ); ui_colors.query(); - if( ( size_t )ui_colors.ret < name_color_map.size() ) { + if( ui_colors.ret >= 0 && ( size_t )ui_colors.ret < name_color_map.size() ) { bStuffChanged = true; iter = name_color_map.begin(); diff --git a/src/computer.cpp b/src/computer.cpp index e2aeb6e7c7110..357868846c9f8 100644 --- a/src/computer.cpp +++ b/src/computer.cpp @@ -1,4 +1,5 @@ #include "computer.h" +#include "coordinate_conversions.h" #include "game.h" #include "map.h" #include "debug.h" @@ -31,6 +32,8 @@ const mtype_id mon_manhack( "mon_manhack" ); const mtype_id mon_secubot( "mon_secubot" ); +const mtype_id mon_turret( "mon_turret" ); +const mtype_id mon_turret_rifle( "mon_turret_rifle" ); const skill_id skill_computer( "computer" ); @@ -329,6 +332,19 @@ static item *pick_usb() return nullptr; } +static void remove_submap_turrets() +{ + for( monster &critter : g->all_monsters() ) { + // Check 1) same overmap coords, 2) turret, 3) hostile + if( ms_to_omt_copy( g->m.getabs( critter.pos() ) ) == ms_to_omt_copy( g->m.getabs( g->u.pos() ) ) && + ( critter.type->id == mon_turret || + critter.type->id == mon_turret_rifle ) && + critter.attitude_to( g->u ) == Creature::Attitude::A_HOSTILE ) { + g->remove_zombie( critter ); + } + } +} + void computer::activate_function( computer_action action ) { // Token move cost for any action, if an action takes longer decrement moves further. @@ -339,6 +355,10 @@ void computer::activate_function( computer_action action ) case NUM_COMPUTER_ACTIONS: // Suppress compiler warning [-Wswitch] break; + // OPEN_DISARM falls through to just OPEN + case COMPACT_OPEN_DISARM: + remove_submap_turrets(); + /* fallthrough */ case COMPACT_OPEN: g->m.translate_radius( t_door_metal_locked, t_floor, 25.0, g->u.pos(), true ); query_any( _( "Doors opened. Press any key..." ) ); @@ -354,6 +374,11 @@ void computer::activate_function( computer_action action ) query_any( _( "Lock enabled. Press any key..." ) ); break; + + // UNLOCK_DISARM falls through to just UNLOCK + case COMPACT_UNLOCK_DISARM: + remove_submap_turrets(); + /* fallthrough */ case COMPACT_UNLOCK: g->m.translate_radius( t_door_metal_locked, t_door_metal_c, 8.0, g->u.pos(), true ); query_any( _( "Lock disabled. Press any key..." ) ); @@ -412,6 +437,10 @@ void computer::activate_function( computer_action action ) query_any( _( "Containment shields opened. Press any key..." ) ); break; + // COMPACT_RELEASE_DISARM falls through to just COMPACT_RELEASE_BIONICS + case COMPACT_RELEASE_DISARM: + remove_submap_turrets(); + /* fallthrough */ case COMPACT_RELEASE_BIONICS: sounds::sound( g->u.pos(), 40, _( "an alarm sound!" ) ); g->m.translate_radius( t_reinforced_glass, t_thconc_floor, 3.0, g->u.pos(), true ); @@ -1574,12 +1603,15 @@ computer_action computer_action_from_string( const std::string &str ) static const std::map actions = {{ { "null", COMPACT_NULL }, { "open", COMPACT_OPEN }, + { "open_disarm", COMPACT_OPEN_DISARM }, { "lock", COMPACT_LOCK }, { "unlock", COMPACT_UNLOCK }, + { "unlock_disarm", COMPACT_UNLOCK_DISARM }, { "toll", COMPACT_TOLL }, { "sample", COMPACT_SAMPLE }, { "release", COMPACT_RELEASE }, { "release_bionics", COMPACT_RELEASE_BIONICS }, + { "release_disarm", COMPACT_RELEASE_DISARM }, { "terminate", COMPACT_TERMINATE }, { "portal", COMPACT_PORTAL }, { "cascade", COMPACT_CASCADE }, diff --git a/src/computer.h b/src/computer.h index 2e94568d55964..17bce0ca939aa 100644 --- a/src/computer.h +++ b/src/computer.h @@ -55,6 +55,9 @@ enum computer_action { COMPACT_SRCF_SEAL_ORDER, COMPACT_SRCF_SEAL, COMPACT_SRCF_ELEVATOR, + COMPACT_OPEN_DISARM, + COMPACT_UNLOCK_DISARM, + COMPACT_RELEASE_DISARM, NUM_COMPUTER_ACTIONS }; diff --git a/src/consumption.cpp b/src/consumption.cpp index 12224b83f97fd..0867898d03857 100644 --- a/src/consumption.cpp +++ b/src/consumption.cpp @@ -494,8 +494,9 @@ bool player::eat( item &food, bool force ) if( !food.is_food() ) { return false; } - // Check if it's rotten before eating! - food.calc_rot( global_square_location() ); + // Force re-processing before eating! + food.process( this, global_square_location(), false ); + const auto ret = force ? can_eat( food ) : will_eat( food, is_player() ); if( !ret.success() ) { return false; diff --git a/src/crafting.cpp b/src/crafting.cpp index a462628d6fb8e..e3d7f66375829 100644 --- a/src/crafting.cpp +++ b/src/crafting.cpp @@ -577,6 +577,34 @@ void player::complete_craft() // Set up the new item, and assign an inventory letter if available std::vector newits = making->create_results( batch_size ); + + // Check if the recipe tools make this food item hot upon making it. + // We don't actually know which specific tool the player used here, but + // we're checking for a class of tools; because of the way requirements + // processing works, the "surface_heat" id gets nuked into an actual + // list of tools, see data/json/recipes/cooking_tools.json. + // + // Currently it's only checking for a hotplate because that's a + // suitable item in both the "surface_heat" and "water_boiling_heat" + // tools, and it's usually the first item in a list of tools so if this + // does get heated we'll find it right away. + bool should_heat = false; + if( newits.size() && newits.front().is_food() ) { + const requirement_data::alter_tool_comp_vector &tool_lists = making->requirements().get_tools(); + for( const std::vector &tools : tool_lists ) { + for( const tool_comp &t : tools ) { + if( t.type == "hotplate" ) { + should_heat = true; + break; + } + } + // if we've already decided to heat it up then we're done + if( should_heat ) { + break; + } + } + } + bool first = true; float used_age_tally = 0; int used_age_count = 0; @@ -631,6 +659,22 @@ void player::complete_craft() set_components( newit.components, used, batch_size, newit_counter ); newit_counter++; } + + if( should_heat ) { + newit.heat_up(); + } else { + // Really what we should be doing is averaging the temperatures + // between the recipe components if we don't have a heat tool, but + // that's kind of hard. For now just reset the temperature, don't + // forget byproducts below either when you fix this. + // + // Also, this is going to reset the temperature on non-food items + // as well. This isn't a big deal because they don't care about + // temperature (yet?) and it's actually more costly to check for + // is_food() than just reset the timer. + newit.reset_temp_check(); + } + finalize_crafted_item( newit, used_age_tally, used_age_count ); set_item_inventory( newit ); } @@ -638,6 +682,11 @@ void player::complete_craft() if( making->has_byproducts() ) { std::vector bps = making->create_byproducts( batch_size ); for( auto &bp : bps ) { + if( should_heat ) { + bp.heat_up(); + } else { + bp.reset_temp_check(); + } finalize_crafted_item( bp, used_age_tally, used_age_count ); set_item_inventory( bp ); } @@ -656,13 +705,6 @@ void set_item_food( item &newit ) //@todo: encapsulate this into some function int bday_tmp = to_turn( newit.birthday() ) % 3600; // fuzzy birthday for stacking reasons newit.set_birthday( newit.birthday() + 3600_turns - time_duration::from_turns( bday_tmp ) ); - if( newit.has_flag( "EATEN_HOT" ) ) { // hot foods generated - newit.item_tags.erase( "COLD" ); - newit.item_tags.erase( "FROZEN" ); - newit.item_tags.insert( "HOT" ); - newit.item_counter = 600; - newit.active = true; - } } void finalize_crafted_item( item &newit, float used_age_tally, int used_age_count ) diff --git a/src/debug.cpp b/src/debug.cpp index 2d5a6b697ebe4..b40b1a13666a2 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -115,6 +115,7 @@ void realDebugmsg( const char *filename, const char *line, const char *funcname, #ifdef __ANDROID__ input_context ctxt( "DEBUG_MSG" ); + ctxt.register_manual_key( 'C' ); ctxt.register_manual_key( 'I' ); ctxt.register_manual_key( ' ' ); #endif diff --git a/src/game.cpp b/src/game.cpp index 7e96a6a7497b5..55d2d2d615bf0 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -231,34 +231,6 @@ bool is_valid_in_w_terrain( int x, int y ) return x >= 0 && x < TERRAIN_WINDOW_WIDTH && y >= 0 && y < TERRAIN_WINDOW_HEIGHT; } -class user_turn -{ - - private: - std::chrono::time_point user_turn_start; - public: - user_turn() { - user_turn_start = std::chrono::steady_clock::now(); - } - - bool has_timeout_elapsed() { - float turn_duration = get_option( "TURN_DURATION" ); - // Magic number 0.005 chosen due to option menu's 2 digit precision and - // the option menu UI rounding <= 0.005 down to "0.00" in the display. - // This conditional will catch values (e.g. 0.003) that the options menu - // would round down to "0.00" in the options menu display. This prevents - // the user from being surprised by floating point rounding near zero. - if( turn_duration <= 0.005 ) { - return false; - } - - auto now = std::chrono::steady_clock::now(); - std::chrono::milliseconds elapsed_ms = - std::chrono::duration_cast( now - user_turn_start ); - return elapsed_ms.count() >= 1000.0 * turn_duration; - } -}; - // This is the main game set-up process. game::game() : map_ptr(), @@ -1513,6 +1485,9 @@ bool game::do_turn() calendar::turn.increment(); } + // starting a new turn, clear out temperature cache + temperature_cache.clear(); + if( npcs_dirty ) { load_npcs(); } @@ -1959,6 +1934,11 @@ int get_convection_temperature( const tripoint &location ) int game::get_temperature( const tripoint &location ) { + const auto &cached = temperature_cache.find( location ); + if( cached != temperature_cache.end() ) { + return cached->second; + } + int temp_mod = 0; // local modifier if( !new_game ) { @@ -1966,8 +1946,11 @@ int game::get_temperature( const tripoint &location ) temp_mod += get_convection_temperature( location ); } //underground temperature = average New England temperature = 43F/6C rounded to int - return ( location.z < 0 ? AVERAGE_ANNUAL_TEMPERATURE : temperature ) + ( new_game ? 0 : - ( m.temperature( location ) + temp_mod ) ); + const int temp = ( location.z < 0 ? AVERAGE_ANNUAL_TEMPERATURE : temperature ) + + ( new_game ? 0 : ( m.temperature( location ) + temp_mod ) ); + + temperature_cache.emplace( std::make_pair( location, temp ) ); + return temp; } int game::assign_mission_id() @@ -2174,7 +2157,7 @@ int game::inventory_item_menu( int pos, int iStartX, int iWidth, eat( pos ); break; case 'W': - wear( pos ); + u.wear( u.i_at( pos ) ); break; case 'w': wield( pos ); @@ -2186,7 +2169,7 @@ int game::inventory_item_menu( int pos, int iStartX, int iWidth, change_side( pos ); break; case 'T': - takeoff( pos ); + u.takeoff( u.i_at( pos ) ); break; case 'd': drop( pos ); @@ -2329,1393 +2312,126 @@ input_context get_default_mode_input_context() ctxt.register_action( "look" ); ctxt.register_action( "peek" ); ctxt.register_action( "listitems" ); - ctxt.register_action( "zones" ); - ctxt.register_action( "inventory" ); - ctxt.register_action( "compare" ); - ctxt.register_action( "organize" ); - ctxt.register_action( "apply" ); - ctxt.register_action( "apply_wielded" ); - ctxt.register_action( "wear" ); - ctxt.register_action( "take_off" ); - ctxt.register_action( "eat" ); - ctxt.register_action( "read" ); - ctxt.register_action( "wield" ); - ctxt.register_action( "pick_style" ); - ctxt.register_action( "reload" ); - ctxt.register_action( "unload" ); - ctxt.register_action( "throw" ); - ctxt.register_action( "fire" ); - ctxt.register_action( "fire_burst" ); - ctxt.register_action( "select_fire_mode" ); - ctxt.register_action( "drop" ); - ctxt.register_action( "drop_adj" ); - ctxt.register_action( "bionics" ); - ctxt.register_action( "mutations" ); - ctxt.register_action( "sort_armor" ); - ctxt.register_action( "wait" ); - ctxt.register_action( "craft" ); - ctxt.register_action( "recraft" ); - ctxt.register_action( "long_craft" ); - ctxt.register_action( "construct" ); - ctxt.register_action( "disassemble" ); - ctxt.register_action( "sleep" ); - ctxt.register_action( "control_vehicle" ); - ctxt.register_action( "safemode" ); - ctxt.register_action( "autosafe" ); - ctxt.register_action( "autoattack" ); - ctxt.register_action( "ignore_enemy" ); - ctxt.register_action( "whitelist_enemy" ); - ctxt.register_action( "save" ); - ctxt.register_action( "quicksave" ); -#ifndef RELEASE - ctxt.register_action( "quickload" ); -#endif - ctxt.register_action( "quit" ); - ctxt.register_action( "player_data" ); - ctxt.register_action( "map" ); - ctxt.register_action( "missions" ); - ctxt.register_action( "factions" ); - ctxt.register_action( "kills" ); - ctxt.register_action( "morale" ); - ctxt.register_action( "messages" ); - ctxt.register_action( "help" ); - ctxt.register_action( "open_keybindings" ); - ctxt.register_action( "open_options" ); - ctxt.register_action( "open_autopickup" ); - ctxt.register_action( "open_safemode" ); - ctxt.register_action( "open_color" ); - ctxt.register_action( "open_world_mods" ); - ctxt.register_action( "debug" ); - ctxt.register_action( "debug_scent" ); - ctxt.register_action( "debug_mode" ); - ctxt.register_action( "zoom_out" ); - ctxt.register_action( "zoom_in" ); - ctxt.register_action( "toggle_sidebar_style" ); -#ifndef __ANDROID__ - ctxt.register_action( "toggle_fullscreen" ); -#endif - ctxt.register_action( "toggle_pixel_minimap" ); - ctxt.register_action( "toggle_auto_pulp_butcher" ); - ctxt.register_action( "action_menu" ); - ctxt.register_action( "main_menu" ); - ctxt.register_action( "item_action_menu" ); - ctxt.register_action( "ANY_INPUT" ); - ctxt.register_action( "COORDINATE" ); - ctxt.register_action( "MOUSE_MOVE" ); - ctxt.register_action( "SELECT" ); - ctxt.register_action( "SEC_SELECT" ); - return ctxt; -} - -input_context game::get_player_input( std::string &action ) -{ - input_context ctxt = get_default_mode_input_context(); - // register QUIT action so it catches q/Q/etc instead of just Q - if( uquit == QUIT_WATCH ) { - ctxt.register_action( "QUIT" ); - } - - m.update_visibility_cache( u.posz() ); - const visibility_variables &cache = g->m.get_visibility_variables_cache(); - const level_cache &map_cache = m.get_cache_ref( u.posz() ); - const auto &visibility_cache = map_cache.visibility_cache; - - user_turn current_turn; - - if( get_option( "ANIMATIONS" ) ) { - int iStartX = ( TERRAIN_WINDOW_WIDTH > 121 ) ? ( TERRAIN_WINDOW_WIDTH - 121 ) / 2 : 0; - int iStartY = ( TERRAIN_WINDOW_HEIGHT > 121 ) ? ( TERRAIN_WINDOW_HEIGHT - 121 ) / 2 : 0; - int iEndX = ( TERRAIN_WINDOW_WIDTH > 121 ) ? TERRAIN_WINDOW_WIDTH - ( TERRAIN_WINDOW_WIDTH - 121 ) / - 2 : - TERRAIN_WINDOW_WIDTH; - int iEndY = ( TERRAIN_WINDOW_HEIGHT > 121 ) ? TERRAIN_WINDOW_HEIGHT - - ( TERRAIN_WINDOW_HEIGHT - 121 ) / - 2 : TERRAIN_WINDOW_HEIGHT; - - if( fullscreen ) { - iStartX = 0; - iStartY = 0; - iEndX = TERMX; - iEndY = TERMY; - } - - //x% of the Viewport, only shown on visible areas - auto const weather_info = get_weather_animation( weather ); - int offset_x = ( u.posx() + u.view_offset.x ) - getmaxx( w_terrain ) / 2; - int offset_y = ( u.posy() + u.view_offset.y ) - getmaxy( w_terrain ) / 2; - -#ifdef TILES - if( tile_iso && use_tiles ) { - iStartX = 0; - iStartY = 0; - iEndX = MAPSIZE * SEEX; - iEndY = MAPSIZE * SEEY; - offset_x = 0; - offset_y = 0; - } -#endif //TILES - - // TODO: Move the weather calculations out of here. - const bool bWeatherEffect = ( weather_info.glyph != '?' ); - const int dropCount = int( iEndX * iEndY * weather_info.factor ); - - weather_printable wPrint; - wPrint.colGlyph = weather_info.color; - wPrint.cGlyph = weather_info.glyph; - wPrint.wtype = weather; - wPrint.vdrops.clear(); - wPrint.startx = iStartX; - wPrint.starty = iStartY; - wPrint.endx = iEndX; - wPrint.endy = iEndY; - - inp_mngr.set_timeout( 125 ); - // Force at least one animation frame if the player is dead. - while( handle_mouseview( ctxt, action ) || uquit == QUIT_WATCH ) { - if( action == "TIMEOUT" && current_turn.has_timeout_elapsed() ) { - break; - } - - if( bWeatherEffect && get_option( "ANIMATION_RAIN" ) ) { - /* - Location to add rain drop animation bits! Since it refreshes w_terrain it can be added to the animation section easily - Get tile information from above's weather information: - WEATHER_ACID_DRIZZLE | WEATHER_ACID_RAIN = "weather_acid_drop" - WEATHER_DRIZZLE | WEATHER_RAINY | WEATHER_THUNDER | WEATHER_LIGHTNING = "weather_rain_drop" - WEATHER_FLURRIES | WEATHER_SNOW | WEATHER_SNOWSTORM = "weather_snowflake" - */ - -#ifdef TILES - if( !use_tiles ) { -#endif //TILES - //If not using tiles, erase previous drops from w_terrain - for( auto &elem : wPrint.vdrops ) { - const tripoint location( elem.first + offset_x, elem.second + offset_y, get_levz() ); - const lit_level lighting = visibility_cache[location.x][location.y]; - wmove( w_terrain, location.y - offset_y, location.x - offset_x ); - if( !m.apply_vision_effects( w_terrain, lighting, cache ) ) { - m.drawsq( w_terrain, u, location, false, true, - u.pos() + u.view_offset, - lighting == LL_LOW, lighting == LL_BRIGHT ); - } - } -#ifdef TILES - } -#endif //TILES - wPrint.vdrops.clear(); - - for( int i = 0; i < dropCount; i++ ) { - const int iRandX = rng( iStartX, iEndX - 1 ); - const int iRandY = rng( iStartY, iEndY - 1 ); - const int mapx = iRandX + offset_x; - const int mapy = iRandY + offset_y; - - const tripoint mapp( mapx, mapy, u.posz() ); - - const lit_level lighting = visibility_cache[mapp.x][mapp.y]; - - if( m.is_outside( mapp ) && m.get_visibility( lighting, cache ) == VIS_CLEAR && - !critter_at( mapp, true ) ) { - // Suppress if a critter is there - wPrint.vdrops.emplace_back( std::make_pair( iRandX, iRandY ) ); - } - } - } - // don't bother calculating SCT if we won't show it - if( uquit != QUIT_WATCH && get_option( "ANIMATION_SCT" ) ) { -#ifdef TILES - if( !use_tiles ) { -#endif - for( auto &elem : SCT.vSCT ) { - //Erase previous text from w_terrain - if( elem.getStep() > 0 ) { - for( size_t i = 0; i < elem.getText().length(); ++i ) { - const tripoint location( elem.getPosX() + i, elem.getPosY(), get_levz() ); - const lit_level lighting = visibility_cache[location.x][location.y]; - wmove( w_terrain, location.y - offset_y, location.x - offset_x ); - if( !m.apply_vision_effects( w_terrain, lighting, cache ) ) { - m.drawsq( w_terrain, u, location, false, true, - u.pos() + u.view_offset, - lighting == LL_LOW, lighting == LL_BRIGHT ); - } - } - } - } -#ifdef TILES - } -#endif - - SCT.advanceAllSteps(); - - //Check for creatures on all drawing positions and offset if necessary - for( auto iter = SCT.vSCT.rbegin(); iter != SCT.vSCT.rend(); ++iter ) { - const direction oCurDir = iter->getDirecton(); - - for( int i = 0; i < static_cast( iter->getText().length() ); ++i ) { - tripoint tmp( iter->getPosX() + i, iter->getPosY(), get_levz() ); - const Creature *critter = critter_at( tmp, true ); - - if( critter != nullptr && u.sees( *critter ) ) { - i = -1; - int iPos = iter->getStep() + iter->getStepOffset(); - for( auto iter2 = iter; iter2 != SCT.vSCT.rend(); ++iter2 ) { - if( iter2->getDirecton() == oCurDir && - iter2->getStep() + iter2->getStepOffset() <= iPos ) { - if( iter2->getType() == "hp" ) { - iter2->advanceStepOffset(); - } - - iter2->advanceStepOffset(); - iPos = iter2->getStep() + iter2->getStepOffset(); - } - } - } - } - } - } - - werase( w_terrain ); - - draw_ter(); - draw_weather( wPrint ); - - if( uquit != QUIT_WATCH ) { - draw_sct(); - } - - wrefresh( w_terrain ); - - if( uquit == QUIT_WATCH ) { - draw_sidebar(); - - catacurses::window popup = create_wait_popup_window( - string_format( _( "Press %s to accept your fate..." ), - ctxt.get_desc( "QUIT" ).c_str() ), - c_red - ); - - wrefresh( popup ); - - break; - } - - //updating the pixel minimap here allows red flashing indicators for enemies to actually flicker - draw_pixel_minimap(); - } - inp_mngr.reset_timeout(); - } else { - inp_mngr.set_timeout( 125 ); - while( handle_mouseview( ctxt, action ) ) { - if( action == "TIMEOUT" && current_turn.has_timeout_elapsed() ) { - break; - } - } - inp_mngr.reset_timeout(); - } - - return ctxt; -} - -void game::rcdrive( int dx, int dy ) -{ - std::stringstream car_location_string( u.get_value( "remote_controlling" ) ); - if( car_location_string.str().empty() ) { - //no turned radio car found - u.add_msg_if_player( m_warning, _( "No radio car connected." ) ); - return; - } - int cx = 0; - int cy = 0; - int cz = 0; - car_location_string >> cx >> cy >> cz; - - auto rc_pairs = m.get_rc_items( cx, cy, cz ); - auto rc_pair = rc_pairs.begin(); - for( ; rc_pair != rc_pairs.end(); ++rc_pair ) { - if( rc_pair->second->typeId() == "radio_car_on" && rc_pair->second->active ) { - break; - } - } - if( rc_pair == rc_pairs.end() ) { - u.add_msg_if_player( m_warning, _( "No radio car connected." ) ); - u.remove_value( "remote_controlling" ); - return; - } - item *rc_car = rc_pair->second; - - if( tile_iso && use_tiles ) { - rotate_direction_cw( dx, dy ); - } - - tripoint src( cx, cy, cz ); - tripoint dest( cx + dx, cy + dy, cz ); - if( m.impassable( dest ) || !m.can_put_items_ter_furn( dest ) || - m.has_furn( dest ) ) { - sounds::sound( dest, 7, _( "sound of a collision with an obstacle." ) ); - return; - } else if( !m.add_item_or_charges( dest, *rc_car ).is_null() ) { - //~ Sound of moving a remote controlled car - sounds::sound( src, 6, _( "zzz..." ) ); - u.moves -= 50; - m.i_rem( src, rc_car ); - car_location_string.clear(); - car_location_string << dest.x << ' ' << dest.y << ' ' << dest.z; - u.set_value( "remote_controlling", car_location_string.str() ); - return; - } -} - -vehicle *game::remoteveh() -{ - if( calendar::turn == remoteveh_cache_time ) { - return remoteveh_cache; - } - remoteveh_cache_time = calendar::turn; - std::stringstream remote_veh_string( u.get_value( "remote_controlling_vehicle" ) ); - if( remote_veh_string.str().empty() || - ( !u.has_active_bionic( bio_remote ) && !u.has_active_item( "remotevehcontrol" ) ) ) { - remoteveh_cache = nullptr; - } else { - tripoint vp; - remote_veh_string >> vp.x >> vp.y >> vp.z; - vehicle *veh = veh_pointer_or_null( m.veh_at( vp ) ); - if( veh && veh->fuel_left( "battery", true ) > 0 ) { - remoteveh_cache = veh; - } else { - remoteveh_cache = nullptr; - } - } - return remoteveh_cache; -} - -void game::setremoteveh( vehicle *veh ) -{ - remoteveh_cache_time = calendar::turn; - remoteveh_cache = veh; - if( veh != nullptr && !u.has_active_bionic( bio_remote ) && - !u.has_active_item( "remotevehcontrol" ) ) { - debugmsg( "Tried to set remote vehicle without bio_remote or remotevehcontrol" ); - veh = nullptr; - } - - if( veh == nullptr ) { - u.remove_value( "remote_controlling_vehicle" ); - return; - } - - std::stringstream remote_veh_string; - const tripoint vehpos = veh->global_pos3(); - remote_veh_string << vehpos.x << ' ' << vehpos.y << ' ' << vehpos.z; - u.set_value( "remote_controlling_vehicle", remote_veh_string.str() ); -} - -bool game::handle_action() -{ - std::string action; - input_context ctxt; - action_id act = ACTION_NULL; - // Check if we have an auto-move destination - if( u.has_destination() ) { - act = u.get_next_auto_move_direction(); - if( act == ACTION_NULL ) { - add_msg( m_info, _( "Auto-move canceled" ) ); - u.clear_destination(); - return false; - } - } else if( u.has_destination_activity() ) { - // starts destination activity after the player successfully reached his destination - u.start_destination_activity(); - return false; - } else { - // No auto-move, ask player for input - ctxt = get_player_input( action ); - } - - const optional_vpart_position vp = m.veh_at( u.pos() ); - bool veh_ctrl = !u.is_dead_state() && - ( ( vp && vp->vehicle().player_in_control( u ) ) || remoteveh() != nullptr ); - - // If performing an action with right mouse button, co-ordinates - // of location clicked. - tripoint mouse_target = tripoint_min; - - // quit prompt check (ACTION_QUIT only grabs 'Q') - if( uquit == QUIT_WATCH && action == "QUIT" ) { - uquit = QUIT_DIED; - return false; - } - - if( act == ACTION_NULL ) { - act = look_up_action( action ); - - if( act == ACTION_MAIN_MENU ) { - // No auto-move actions have or can be set at this point. - u.clear_destination(); - destination_preview.clear(); - act = handle_main_menu(); - if( act == ACTION_NULL ) { - return false; - } - } - - if( act == ACTION_ACTIONMENU ) { - // No auto-move actions have or can be set at this point. - u.clear_destination(); - destination_preview.clear(); - act = handle_action_menu(); - if( act == ACTION_NULL ) { - return false; - } -#ifdef __ANDROID__ - if( get_option( "ANDROID_ACTIONMENU_AUTOADD" ) && ctxt.get_category() == "DEFAULTMODE" ) { - add_best_key_for_action_to_quick_shortcuts( act, ctxt.get_category(), false ); - } -#endif - } - - if( can_action_change_worldstate( act ) ) { - user_action_counter += 1; - } - - if( act == ACTION_SELECT || act == ACTION_SEC_SELECT ) { - // Mouse button click - if( veh_ctrl ) { - // No mouse use in vehicle - return false; - } - - if( u.is_dead_state() ) { - // do not allow mouse actions while dead - return false; - } - - int mx = 0; - int my = 0; - if( !ctxt.get_coordinates( w_terrain, mx, my ) || !u.sees( tripoint( mx, my, u.posz() ) ) ) { - // Not clicked in visible terrain - return false; - } - mouse_target = tripoint( mx, my, u.posz() ); - - if( act == ACTION_SELECT ) { - // Note: The following has the potential side effect of - // setting auto-move destination state in addition to setting - // act. - if( !try_get_left_click_action( act, mouse_target ) ) { - return false; - } - } else if( act == ACTION_SEC_SELECT ) { - if( !try_get_right_click_action( act, mouse_target ) ) { - return false; - } - } - } else if( act != ACTION_TIMEOUT ) { - // act has not been set for an auto-move, so clearing possible - // auto-move destinations. Since initializing an auto-move with - // the mouse may span across multiple actions, we do not clear the - // auto-move destination if the action is only a timeout, as this - // would require the user to double click quicker than the - // timeout delay. - u.clear_destination(); - destination_preview.clear(); - } - } - - if( act == ACTION_NULL ) { - const input_event &&evt = ctxt.get_raw_input(); - if( !evt.sequence.empty() ) { - const long ch = evt.get_first_input(); - const std::string &&name = inp_mngr.get_keyname( ch, evt.type, true ); - if( !get_option( "NO_UNKNOWN_COMMAND_MSG" ) ) { - add_msg( m_info, _( "Unknown command: \"%s\" (%ld)" ), name, ch ); - } - } - return false; - } - - // This has no action unless we're in a special game mode. - gamemode->pre_action( act ); - - int soffset = get_option( "MOVE_VIEW_OFFSET" ); - int soffsetr = 0 - soffset; - - int before_action_moves = u.moves; - - // Use to track if auto-move should be canceled due to a failed - // move or obstacle - bool continue_auto_move = true; - - // These actions are allowed while deathcam is active. - if( uquit == QUIT_WATCH || !u.is_dead_state() ) { - switch( act ) { - case ACTION_CENTER: - u.view_offset.x = driving_view_offset.x; - u.view_offset.y = driving_view_offset.y; - break; - - case ACTION_SHIFT_N: - u.view_offset.y += soffsetr; - break; - - case ACTION_SHIFT_NE: - u.view_offset.x += soffset; - u.view_offset.y += soffsetr; - break; - - case ACTION_SHIFT_E: - u.view_offset.x += soffset; - break; - - case ACTION_SHIFT_SE: - u.view_offset.x += soffset; - u.view_offset.y += soffset; - break; - - case ACTION_SHIFT_S: - u.view_offset.y += soffset; - break; - - case ACTION_SHIFT_SW: - u.view_offset.x += soffsetr; - u.view_offset.y += soffset; - break; - - case ACTION_SHIFT_W: - u.view_offset.x += soffsetr; - break; - - case ACTION_SHIFT_NW: - u.view_offset.x += soffsetr; - u.view_offset.y += soffsetr; - break; - - case ACTION_LOOK: - look_around(); - break; - - default: - break; - } - } - - // actions allowed only while alive - if( !u.is_dead_state() ) { - switch( act ) { - case ACTION_NULL: - case NUM_ACTIONS: - break; // dummy entries - case ACTION_ACTIONMENU: - case ACTION_MAIN_MENU: - break; // handled above - - case ACTION_TIMEOUT: - if( check_safe_mode_allowed( false ) ) { - u.pause(); - } - break; - - case ACTION_PAUSE: - if( check_safe_mode_allowed() ) { - u.pause(); - } - break; - - case ACTION_TOGGLE_MOVE: - u.toggle_move_mode(); - break; - - case ACTION_MOVE_N: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( 0, -1 ); - } else if( veh_ctrl ) { - pldrive( 0, -1 ); - } else { - continue_auto_move = plmove( 0, -1 ); - } - break; - - case ACTION_MOVE_NE: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( 1, -1 ); - } else if( veh_ctrl ) { - pldrive( 1, -1 ); - } else { - continue_auto_move = plmove( 1, -1 ); - } - break; - - case ACTION_MOVE_E: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( 1, 0 ); - } else if( veh_ctrl ) { - pldrive( 1, 0 ); - } else { - continue_auto_move = plmove( 1, 0 ); - } - break; - - case ACTION_MOVE_SE: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( 1, 1 ); - } else if( veh_ctrl ) { - pldrive( 1, 1 ); - } else { - continue_auto_move = plmove( 1, 1 ); - } - break; - - case ACTION_MOVE_S: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( 0, 1 ); - } else if( veh_ctrl ) { - pldrive( 0, 1 ); - } else { - continue_auto_move = plmove( 0, 1 ); - } - break; - - case ACTION_MOVE_SW: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( -1, 1 ); - } else if( veh_ctrl ) { - pldrive( -1, 1 ); - } else { - continue_auto_move = plmove( -1, 1 ); - } - break; - - case ACTION_MOVE_W: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( -1, 0 ); - } else if( veh_ctrl ) { - pldrive( -1, 0 ); - } else { - continue_auto_move = plmove( -1, 0 ); - } - break; - - case ACTION_MOVE_NW: - if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || - ( u.has_active_bionic( bio_remote ) ) ) ) { - rcdrive( -1, -1 ); - } else if( veh_ctrl ) { - pldrive( -1, -1 ); - } else { - continue_auto_move = plmove( -1, -1 ); - } - break; - - case ACTION_MOVE_DOWN: - if( !u.in_vehicle ) { - vertical_move( -1, false ); - } - break; - - case ACTION_MOVE_UP: - if( !u.in_vehicle ) { - vertical_move( 1, false ); - } - break; - - case ACTION_OPEN: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't open things while you're in your shell." ) ); - } else { - open(); - } - break; - - case ACTION_CLOSE: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't close things while you're in your shell." ) ); - } else if( mouse_target != tripoint_min ) { - doors::close_door( m, u, mouse_target ); - } else { - close(); - } - break; - - case ACTION_SMASH: - if( veh_ctrl ) { - handbrake(); - } else if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't smash things while you're in your shell." ) ); - } else { - smash(); - } - break; - - case ACTION_EXAMINE: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't examine your surroundings while you're in your shell." ) ); - } else if( mouse_target != tripoint_min ) { - examine( mouse_target ); - } else { - examine(); - } - break; - - case ACTION_ADVANCEDINV: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't move mass quantities while you're in your shell." ) ); - } else { - advanced_inv(); - } - break; - - case ACTION_PICKUP: - Pickup::pick_up( u.pos(), 1 ); - break; - - case ACTION_GRAB: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't grab things while you're in your shell." ) ); - } else { - grab(); - } - break; - - case ACTION_BUTCHER: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't butcher while you're in your shell." ) ); - } else { - butcher(); - } - break; - - case ACTION_CHAT: - chat(); - break; - - case ACTION_PEEK: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't peek around corners while you're in your shell." ) ); - } else { - peek(); - } - break; - - case ACTION_LIST_ITEMS: - list_items_monsters(); - break; - - case ACTION_ZONES: - zones_manager(); - break; - - case ACTION_LOOT: - loot(); - break; - - case ACTION_INVENTORY: - game_menus::inv::common( u ); - break; - - case ACTION_COMPARE: - game_menus::inv::compare( u ); - break; - - case ACTION_ORGANIZE: - game_menus::inv::swap_letters( u ); - break; - - case ACTION_USE: - // Shell-users are presumed to be able to mess with their inventories, etc - // while in the shell. Eating, gear-changing, and item use are OK. - use_item(); - break; - - case ACTION_USE_WIELDED: - use_wielded_item(); - break; - - case ACTION_WEAR: - wear(); - break; - - case ACTION_TAKE_OFF: - takeoff(); - break; - - case ACTION_EAT: - eat(); - break; - - case ACTION_READ: - // Shell-users are presumed to have the book just at an opening and read it that way - read(); - break; - - case ACTION_WIELD: - wield(); - break; - - case ACTION_PICK_STYLE: - u.pick_style(); - break; - - case ACTION_RELOAD: - reload(); - break; - - case ACTION_UNLOAD: - unload(); - break; - - case ACTION_MEND: - mend(); - break; - - case ACTION_THROW: - plthrow(); - break; - - case ACTION_FIRE: - // @todo: Move handling ACTION_FIRE to a new function. - // Use vehicle turret or draw a pistol from a holster if unarmed - if( !u.is_armed() ) { - - const optional_vpart_position vp = m.veh_at( u.pos() ); - - turret_data turret; - // @todo: move direct turret firing from ACTION_FIRE to separate function. - if( vp && ( turret = vp->vehicle().turret_query( u.pos() ) ) ) { - switch( turret.query() ) { - case turret_data::status::no_ammo: - add_msg( m_bad, _( "The %s is out of ammo." ), turret.name().c_str() ); - break; - - case turret_data::status::no_power: - add_msg( m_bad, _( "The %s is not powered." ), turret.name().c_str() ); - break; - - case turret_data::status::ready: { - // if more than one firing mode provide callback to cycle through them - target_callback switch_mode; - if( turret.base()->gun_all_modes().size() > 1 ) { - switch_mode = [&turret]( item * obj ) { - obj->gun_cycle_mode(); - // currently gun modes do not change ammo but they may in the future - return turret.ammo_current() == "null" ? nullptr : - item::find_type( turret.ammo_current() ); - }; - } - - // if multiple ammo types available provide callback to cycle alternatives - target_callback switch_ammo; - if( turret.ammo_options().size() > 1 ) { - switch_ammo = [&turret]( item * ) { - const auto opts = turret.ammo_options(); - auto iter = opts.find( turret.ammo_current() ); - turret.ammo_select( ++iter != opts.end() ? *iter : *opts.begin() ); - return item::find_type( turret.ammo_current() ); - }; - } - - // callbacks for handling setup and cleanup of turret firing - firing_callback prepare_fire = [this, &turret]( const int ) { - turret.prepare_fire( u ); - }; - firing_callback post_fire = [this, &turret]( const int shots ) { - turret.post_fire( u, shots ); - }; - - targeting_data args = { - TARGET_MODE_TURRET_MANUAL, & *turret.base(), - turret.range(), 0, false, turret.ammo_data(), - switch_mode, switch_ammo, prepare_fire, post_fire - }; - u.set_targeting_data( args ); - plfire(); - - break; - } - - default: - debugmsg( "unknown turret status" ); - break; - } - break; - } - - if( vp.part_with_feature( "CONTROLS", true ) ) { - if( vp->vehicle().turrets_aim_and_fire() ) { - break; - } - } - - std::vector options( 1, _( "Cancel" ) ); - std::vector> actions( 1, [] {} ); - - for( auto &w : u.worn ) { - if( w.type->can_use( "holster" ) && !w.has_flag( "NO_QUICKDRAW" ) && - !w.contents.empty() && w.contents.front().is_gun() ) { - // draw (first) gun contained in holster - options.push_back( string_format( _( "%s from %s (%d)" ), - w.contents.front().tname().c_str(), - w.type_name().c_str(), - w.contents.front().ammo_remaining() ) ); - - actions.emplace_back( [&] { u.invoke_item( &w, "holster" ); } ); - - } else if( w.is_gun() && w.gunmod_find( "shoulder_strap" ) ) { - // wield item currently worn using shoulder strap - options.push_back( w.display_name() ); - actions.emplace_back( [&] { u.wield( w ); } ); - } - } - if( options.size() > 1 ) { - actions[( uimenu( false, _( "Draw what?" ), options ) ) - 1 ](); - } - } - - if( u.weapon.is_gun() && !u.weapon.gun_current_mode().melee() ) { - plfire( u.weapon ); - } else if( u.weapon.has_flag( "REACH_ATTACK" ) ) { - int range = u.weapon.has_flag( "REACH3" ) ? 3 : 2; - temp_exit_fullscreen(); - m.draw( w_terrain, u.pos() ); - std::vector trajectory; - trajectory = target_handler().target_ui( u, TARGET_MODE_REACH, &u.weapon, range ); - if( !trajectory.empty() ) { - u.reach_attack( trajectory.back() ); - } - draw_ter(); - wrefresh( w_terrain ); - reenter_fullscreen(); - } - break; - - case ACTION_FIRE_BURST: { - gun_mode_id original_mode = u.weapon.gun_get_mode_id(); - if( u.weapon.gun_set_mode( gun_mode_id( "AUTO" ) ) ) { - plfire( u.weapon ); - u.weapon.gun_set_mode( original_mode ); - } - break; - } - - case ACTION_SELECT_FIRE_MODE: - if( u.is_armed() ) { - u.weapon.gun_cycle_mode(); - } - break; - - case ACTION_DROP: - // You CAN drop things to your own tile while in the shell. - drop(); - break; - - case ACTION_DIR_DROP: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't drop things to another tile while you're in your shell." ) ); - } else { - drop_in_direction(); - } - break; - case ACTION_BIONICS: - u.power_bionics(); - refresh_all(); - break; - case ACTION_MUTATIONS: - u.power_mutations(); - refresh_all(); - break; - - case ACTION_SORT_ARMOR: - u.sort_armor(); - refresh_all(); - break; - - case ACTION_WAIT: - wait(); - break; - - case ACTION_CRAFT: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't craft while you're in your shell." ) ); - } else { - u.craft(); - } - break; - - case ACTION_RECRAFT: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't craft while you're in your shell." ) ); - } else { - u.recraft(); - } - break; - - case ACTION_LONGCRAFT: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't craft while you're in your shell." ) ); - } else { - u.long_craft(); - } - break; - - case ACTION_DISASSEMBLE: - if( u.controlling_vehicle ) { - add_msg( m_info, _( "You can't disassemble items while driving." ) ); - } else { - u.disassemble(); - refresh_all(); - } - break; - - case ACTION_CONSTRUCT: - if( u.in_vehicle ) { - add_msg( m_info, _( "You can't construct while in a vehicle." ) ); - } else if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't construct while you're in your shell." ) ); - } else { - construction_menu(); - } - break; - - case ACTION_SLEEP: - if( veh_ctrl ) { - add_msg( m_info, _( "Vehicle control has moved, %s" ), - press_x( ACTION_CONTROL_VEHICLE, _( "new binding is " ), - _( "new default binding is '^'." ) ).c_str() ); - } else { - uimenu as_m; - // Only accept valid input - as_m.return_invalid = false; - as_m.text = _( "Are you sure you want to sleep?" ); - // (Y)es/(S)ave before sleeping/(N)o - as_m.entries.emplace_back( uimenu_entry( 0, true, - ( get_option( "FORCE_CAPITAL_YN" ) ? 'Y' : 'y' ), - _( "Yes." ) ) ); - as_m.entries.emplace_back( uimenu_entry( 1, ( moves_since_last_save ), - ( get_option( "FORCE_CAPITAL_YN" ) ? 'S' : 's' ), - _( "Yes, and save game before sleeping." ) ) ); - as_m.entries.emplace_back( uimenu_entry( 2, true, - ( get_option( "FORCE_CAPITAL_YN" ) ? 'N' : 'n' ), - _( "No." ) ) ); - - // List all active items, bionics or mutations so player can deactivate them - std::vector active; - for( auto &it : g->u.inv_dump() ) { - if( it->active && it->charges > 0 && it->is_tool_reversible() ) { - active.push_back( it->tname() ); - } - } - for( int i = 0; i < g->u.num_bionics(); i++ ) { - bionic const &bio = g->u.bionic_at_index( i ); - if( !bio.powered ) { - continue; - } - - // bio_alarm is useful for waking up during sleeping - // turning off bio_leukocyte has 'unpleasant side effects' - if( bio.id == bionic_id( "bio_alarm" ) || bio.id == bionic_id( "bio_leukocyte" ) ) { - continue; - } - - auto const &info = bio.info(); - if( info.power_over_time > 0 ) { - active.push_back( info.name ); - } - } - for( auto &mut : g->u.get_mutations() ) { - const auto &mdata = mut.obj(); - if( mdata.cost > 0 && u.has_active_mutation( mut ) ) { - active.push_back( mdata.name ); - } - } - std::stringstream data; - if( !active.empty() ) { - data << as_m.text << std::endl; - data << _( "You may want to deactivate these before you sleep." ) << std::endl; - data << " " << std::endl; - for( auto &a : active ) { - data << a << std::endl; - } - as_m.text = data.str(); - } - - /* Calculate key and window variables, generate window, - and loop until we get a valid answer. */ - as_m.query(); - - if( as_m.ret == 1 ) { - quicksave(); - } else if( as_m.ret == 2 ) { - break; - } - - /* Reuse menu to ask player whether they want to set an alarm. */ - bool can_hibernate = u.get_hunger() < -60 && u.has_active_mutation( trait_HIBERNATE ); - - as_m.reset(); - as_m.text = can_hibernate ? - _( "You're engorged to hibernate. The alarm would only attract attention. Set an alarm anyway?" ) : - _( "You have an alarm clock. Set an alarm?" ); - - if( u.has_alarm_clock() ) { - as_m.entries.emplace_back( uimenu_entry( 0, true, - ( get_option( "FORCE_CAPITAL_YN" ) ? 'N' : 'n' ), - _( "No, don't set an alarm." ) ) ); - - for( int i = 3; i <= 9; ++i ) { - as_m.entries.emplace_back( uimenu_entry( i, true, '0' + i, - string_format( _( "Set alarm to wake up in %i hours." ), i ) ) ); - } - } - - as_m.query(); - if( as_m.ret >= 3 && as_m.ret <= 9 ) { - u.add_effect( effect_alarm_clock, 1_hours * as_m.ret ); - } - - u.moves = 0; - u.try_to_sleep(); - } - break; - - case ACTION_CONTROL_VEHICLE: - if( u.has_active_mutation( trait_SHELL2 ) ) { - add_msg( m_info, _( "You can't operate a vehicle while you're in your shell." ) ); - } else { - control_vehicle(); - } - break; - - case ACTION_TOGGLE_SAFEMODE: - if( safe_mode == SAFE_MODE_OFF ) { - set_safe_mode( SAFE_MODE_ON ); - mostseen = 0; - add_msg( m_info, _( "Safe mode ON!" ) ); - } else { - turnssincelastmon = 0; - set_safe_mode( SAFE_MODE_OFF ); - add_msg( m_info, get_option( "AUTOSAFEMODE" ) - ? _( "Safe mode OFF! (Auto safe mode still enabled!)" ) : _( "Safe mode OFF!" ) ); - } - if( u.has_effect( effect_laserlocked ) ) { - u.remove_effect( effect_laserlocked ); - safe_mode_warning_logged = false; - } - break; - - case ACTION_TOGGLE_AUTOSAFE: { - auto &autosafemode_option = get_options().get_option( "AUTOSAFEMODE" ); - add_msg( m_info, autosafemode_option.value_as() - ? _( "Auto safe mode OFF!" ) : _( "Auto safe mode ON!" ) ); - autosafemode_option.setNext(); - break; - } - - case ACTION_IGNORE_ENEMY: - if( safe_mode == SAFE_MODE_STOP ) { - add_msg( m_info, _( "Ignoring enemy!" ) ); - for( auto &elem : new_seen_mon ) { - monster &critter = *elem; - critter.ignoring = rl_dist( u.pos(), critter.pos() ); - } - set_safe_mode( SAFE_MODE_ON ); - } else if( u.has_effect( effect_laserlocked ) ) { - add_msg( m_info, _( "Ignoring laser targeting!" ) ); - u.remove_effect( effect_laserlocked ); - safe_mode_warning_logged = false; - } - break; - - case ACTION_WHITELIST_ENEMY: - if( safe_mode == SAFE_MODE_STOP && !get_safemode().empty() ) { - get_safemode().add_rule( get_safemode().lastmon_whitelist, Creature::A_ANY, 0, RULE_WHITELISTED ); - add_msg( m_info, _( "Creature whitelisted: %s" ), get_safemode().lastmon_whitelist.c_str() ); - set_safe_mode( SAFE_MODE_ON ); - mostseen = 0; - } else { - get_safemode().show(); - } - break; - - case ACTION_QUIT: - if( query_yn( _( "Commit suicide?" ) ) ) { - if( query_yn( _( "REALLY commit suicide?" ) ) ) { - u.moves = 0; - u.place_corpse(); - uquit = QUIT_SUICIDE; - } - } - refresh_all(); - break; - - case ACTION_SAVE: - if( query_yn( _( "Save and quit?" ) ) ) { - if( save() ) { - u.moves = 0; - uquit = QUIT_SAVED; - } - } - refresh_all(); - break; - - case ACTION_QUICKSAVE: - quicksave(); - return false; - - case ACTION_QUICKLOAD: - quickload(); - return false; - - case ACTION_PL_INFO: - u.disp_info(); - refresh_all(); - break; - - case ACTION_MAP: - werase( w_terrain ); - draw_overmap(); - break; - - case ACTION_MISSIONS: - list_missions(); - break; - - case ACTION_KILLS: - disp_kills(); - break; - - case ACTION_FACTIONS: - faction_manager_ptr->display(); - refresh_all(); - break; - - case ACTION_MORALE: - u.disp_morale(); - refresh_all(); - break; - - case ACTION_MESSAGES: - Messages::display_messages(); - refresh_all(); - break; - - case ACTION_HELP: - display_help(); - refresh_all(); - break; - - case ACTION_KEYBINDINGS: - ctxt.display_menu(); - refresh_all(); - break; - - case ACTION_OPTIONS: - get_options().show( true ); - refresh_all(); - break; - - case ACTION_AUTOPICKUP: - get_auto_pickup().show(); - refresh_all(); - break; - - case ACTION_SAFEMODE: - get_safemode().show(); - refresh_all(); - break; - - case ACTION_COLOR: - all_colors.show_gui(); - refresh_all(); - break; - - case ACTION_WORLD_MODS: - world_generator->show_active_world_mods( world_generator->active_world->active_mod_order ); - refresh_all(); - break; - - case ACTION_DEBUG: - if( MAP_SHARING::isCompetitive() && !MAP_SHARING::isDebugger() ) { - break; //don't do anything when sharing and not debugger - } - debug(); - refresh_all(); - break; - - case ACTION_TOGGLE_SIDEBAR_STYLE: - toggle_sidebar_style(); - break; - - case ACTION_TOGGLE_FULLSCREEN: - toggle_fullscreen(); - break; - - case ACTION_TOGGLE_PIXEL_MINIMAP: - toggle_pixel_minimap(); - break; - - case ACTION_TOGGLE_AUTO_PULP_BUTCHER: - get_options().get_option( "AUTO_PULP_BUTCHER" ).setNext(); - get_options().save(); - //~ Auto Pulp/Pulp Adjacent/Butcher is now ON/OFF - add_msg( string_format( _( "Auto %1$s is now %2$s." ), - get_options().get_option( "AUTO_PULP_BUTCHER_ACTION" ).getValueName(), - get_option( "AUTO_PULP_BUTCHER" ) ? _( "ON" ) : _( "OFF" ) ).c_str() ); - break; - - case ACTION_DISPLAY_SCENT: - if( MAP_SHARING::isCompetitive() && !MAP_SHARING::isDebugger() ) { - break; //don't do anything when sharing and not debugger - } - display_scent(); - break; - - case ACTION_TOGGLE_DEBUG_MODE: - if( MAP_SHARING::isCompetitive() && !MAP_SHARING::isDebugger() ) { - break; //don't do anything when sharing and not debugger - } - debug_mode = !debug_mode; - if( debug_mode ) { - add_msg( m_info, _( "Debug mode ON!" ) ); - } else { - add_msg( m_info, _( "Debug mode OFF!" ) ); - } - break; - - case ACTION_ZOOM_IN: - zoom_in(); - break; - - case ACTION_ZOOM_OUT: - zoom_out(); - break; - - case ACTION_ITEMACTION: - item_action_menu(); - break; - - case ACTION_AUTOATTACK: - autoattack(); - break; + ctxt.register_action( "zones" ); + ctxt.register_action( "inventory" ); + ctxt.register_action( "compare" ); + ctxt.register_action( "organize" ); + ctxt.register_action( "apply" ); + ctxt.register_action( "apply_wielded" ); + ctxt.register_action( "wear" ); + ctxt.register_action( "take_off" ); + ctxt.register_action( "eat" ); + ctxt.register_action( "read" ); + ctxt.register_action( "wield" ); + ctxt.register_action( "pick_style" ); + ctxt.register_action( "reload" ); + ctxt.register_action( "unload" ); + ctxt.register_action( "throw" ); + ctxt.register_action( "fire" ); + ctxt.register_action( "fire_burst" ); + ctxt.register_action( "select_fire_mode" ); + ctxt.register_action( "drop" ); + ctxt.register_action( "drop_adj" ); + ctxt.register_action( "bionics" ); + ctxt.register_action( "mutations" ); + ctxt.register_action( "sort_armor" ); + ctxt.register_action( "wait" ); + ctxt.register_action( "craft" ); + ctxt.register_action( "recraft" ); + ctxt.register_action( "long_craft" ); + ctxt.register_action( "construct" ); + ctxt.register_action( "disassemble" ); + ctxt.register_action( "sleep" ); + ctxt.register_action( "control_vehicle" ); + ctxt.register_action( "safemode" ); + ctxt.register_action( "autosafe" ); + ctxt.register_action( "autoattack" ); + ctxt.register_action( "ignore_enemy" ); + ctxt.register_action( "whitelist_enemy" ); + ctxt.register_action( "save" ); + ctxt.register_action( "quicksave" ); +#ifndef RELEASE + ctxt.register_action( "quickload" ); +#endif + ctxt.register_action( "quit" ); + ctxt.register_action( "player_data" ); + ctxt.register_action( "map" ); + ctxt.register_action( "missions" ); + ctxt.register_action( "factions" ); + ctxt.register_action( "kills" ); + ctxt.register_action( "morale" ); + ctxt.register_action( "messages" ); + ctxt.register_action( "help" ); + ctxt.register_action( "open_keybindings" ); + ctxt.register_action( "open_options" ); + ctxt.register_action( "open_autopickup" ); + ctxt.register_action( "open_safemode" ); + ctxt.register_action( "open_color" ); + ctxt.register_action( "open_world_mods" ); + ctxt.register_action( "debug" ); + ctxt.register_action( "debug_scent" ); + ctxt.register_action( "debug_mode" ); + ctxt.register_action( "zoom_out" ); + ctxt.register_action( "zoom_in" ); + ctxt.register_action( "toggle_sidebar_style" ); +#ifndef __ANDROID__ + ctxt.register_action( "toggle_fullscreen" ); +#endif + ctxt.register_action( "toggle_pixel_minimap" ); + ctxt.register_action( "toggle_auto_pulp_butcher" ); + ctxt.register_action( "action_menu" ); + ctxt.register_action( "main_menu" ); + ctxt.register_action( "item_action_menu" ); + ctxt.register_action( "ANY_INPUT" ); + ctxt.register_action( "COORDINATE" ); + ctxt.register_action( "MOUSE_MOVE" ); + ctxt.register_action( "SELECT" ); + ctxt.register_action( "SEC_SELECT" ); + return ctxt; +} - default: - break; +vehicle *game::remoteveh() +{ + if( calendar::turn == remoteveh_cache_time ) { + return remoteveh_cache; + } + remoteveh_cache_time = calendar::turn; + std::stringstream remote_veh_string( u.get_value( "remote_controlling_vehicle" ) ); + if( remote_veh_string.str().empty() || + ( !u.has_active_bionic( bio_remote ) && !u.has_active_item( "remotevehcontrol" ) ) ) { + remoteveh_cache = nullptr; + } else { + tripoint vp; + remote_veh_string >> vp.x >> vp.y >> vp.z; + vehicle *veh = veh_pointer_or_null( m.veh_at( vp ) ); + if( veh && veh->fuel_left( "battery", true ) > 0 ) { + remoteveh_cache = veh; + } else { + remoteveh_cache = nullptr; } } - if( !continue_auto_move ) { - u.clear_destination(); + return remoteveh_cache; +} + +void game::setremoteveh( vehicle *veh ) +{ + remoteveh_cache_time = calendar::turn; + remoteveh_cache = veh; + if( veh != nullptr && !u.has_active_bionic( bio_remote ) && + !u.has_active_item( "remotevehcontrol" ) ) { + debugmsg( "Tried to set remote vehicle without bio_remote or remotevehcontrol" ); + veh = nullptr; } - gamemode->post_action( act ); + if( veh == nullptr ) { + u.remove_value( "remote_controlling_vehicle" ); + return; + } - u.movecounter = ( !u.is_dead_state() ? ( before_action_moves - u.moves ) : 0 ); - dbg( D_INFO ) << string_format( "%s: [%d] %d - %d = %d", action_ident( act ).c_str(), - int( calendar::turn ), before_action_moves, u.movecounter, u.moves ); - return ( !u.is_dead_state() ); + std::stringstream remote_veh_string; + const tripoint vehpos = veh->global_pos3(); + remote_veh_string << vehpos.x << ' ' << vehpos.y << ' ' << vehpos.z; + u.set_value( "remote_controlling_vehicle", remote_veh_string.str() ); } bool game::try_get_left_click_action( action_id &act, const tripoint &mouse_target ) @@ -4628,11 +3344,6 @@ void game::debug() refresh_all(); } -void game::draw_overmap() -{ - ui::omap::display(); -} - void game::disp_kills() { catacurses::window w = catacurses::newwin( FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, @@ -6504,16 +5215,22 @@ void game::emp_blast( const tripoint &p ) critter.make_friendly(); } } - } else if( critter.has_flag( MF_ELECTRIC_FIELD ) && !critter.has_effect( effect_emp ) ) { - if( sight ) { + } else if( critter.has_flag( MF_ELECTRIC_FIELD ) ) { + if( sight && !critter.has_effect( effect_emp ) ) { add_msg( m_good, _( "The %s's electrical field momentarily goes out!" ), critter.name().c_str() ); + critter.add_effect( effect_emp, 3_minutes ); + } else if( sight && critter.has_effect( effect_emp ) ) { + int dam = dice( 3, 5 ); + add_msg( m_good, _( "The %s's disabled electrical field reverses polarity!" ), + critter.name().c_str() ); + add_msg( m_good, _( "It takes %d damage." ), dam ); + critter.add_effect( effect_emp, 1_minutes ); + critter.apply_damage( nullptr, bp_torso, dam ); + critter.check_dead_state(); } } else if( sight ) { add_msg( _( "The %s is unaffected by the EMP blast." ), critter.name().c_str() ); } - if( !critter.has_effect( effect_emp ) ) { - critter.add_effect( effect_emp, 3_minutes ); - } } if( u.posx() == x && u.posy() == y ) { if( u.power_level > 0 ) { @@ -6755,324 +5472,81 @@ bool game::swap_critters( Creature &a, Creature &b ) if( g->m.veh_at( other_npc->pos() ).part_with_feature( VPFLAG_BOARDABLE ) ) { g->m.board_vehicle( other_npc->pos(), other_npc ); } - - if( first.is_player() ) { - update_map( *u_or_npc ); - } - - return true; -} - -bool game::is_empty( const tripoint &p ) -{ - return ( m.passable( p ) || m.has_flag( "LIQUID", p ) ) && - critter_at( p ) == nullptr; -} - -bool game::is_in_sunlight( const tripoint &p ) -{ - return ( m.is_outside( p ) && light_level( p.z ) >= 40 && - ( weather == WEATHER_CLEAR || weather == WEATHER_SUNNY ) ); -} - -bool game::is_sheltered( const tripoint &p ) -{ - const optional_vpart_position vp = m.veh_at( p ); - - return ( !m.is_outside( p ) || - p.z < 0 || - ( vp && vp->is_inside() ) ); -} - -bool game::revive_corpse( const tripoint &p, item &it ) -{ - if( !it.is_corpse() ) { - debugmsg( "Tried to revive a non-corpse." ); - return false; - } - if( critter_at( p ) != nullptr ) { - // Someone is in the way, try again later - return false; - } - monster critter( it.get_mtype()->id, p ); - critter.init_from_item( it ); - if( critter.get_hp() < 1 ) { - // Failed reanimation due to corpse being too burned - it.active = false; - return false; - } - if( it.has_flag( "FIELD_DRESS" ) || it.has_flag( "FIELD_DRESS_FAILED" ) || - it.has_flag( "QUARTERED" ) ) { - // Failed reanimation due to corpse being butchered - it.active = false; - return false; - } - - critter.no_extra_death_drops = true; - critter.add_effect( effect_downed, 5_turns, num_bp, true ); - - if( it.get_var( "zlave" ) == "zlave" ) { - critter.add_effect( effect_pacified, 1_turns, num_bp, true ); - critter.add_effect( effect_pet, 1_turns, num_bp, true ); - } - - if( it.get_var( "no_ammo" ) == "no_ammo" ) { - for( auto &ammo : critter.ammo ) { - ammo.second = 0; - } - } - - const bool ret = add_zombie( critter ); - if( !ret ) { - debugmsg( "Couldn't add a revived monster" ); - } - if( ret && !critter_at( p ) ) { - debugmsg( "Revived monster is not where it's supposed to be. Prepare for crash." ); - } - return ret; -} - -void game::open() -{ - tripoint openp; - if( !choose_adjacent_highlight( _( "Open where?" ), openp, ACTION_OPEN ) ) { - return; - } - - u.moves -= 100; - - if( const optional_vpart_position vp = m.veh_at( openp ) ) { - vehicle *const veh = &vp->vehicle(); - int openable = veh->next_part_to_open( vp->part_index() ); - if( openable >= 0 ) { - const vehicle *player_veh = veh_pointer_or_null( m.veh_at( u.pos() ) ); - bool outside = !player_veh || player_veh != veh; - if( !outside ) { - veh->open( openable ); - } else { - // Outside means we check if there's anything in that tile outside-openable. - // If there is, we open everything on tile. This means opening a closed, - // curtained door from outside is possible, but it will magically open the - // curtains as well. - int outside_openable = veh->next_part_to_open( vp->part_index(), true ); - if( outside_openable == -1 ) { - const std::string name = veh->part_info( openable ).name(); - add_msg( m_info, _( "That %s can only opened from the inside." ), name.c_str() ); - u.moves += 100; - } else { - veh->open_all_at( openable ); - } - } - } else { - // If there are any OPENABLE parts here, they must be already open - if( const cata::optional already_open = vp.part_with_feature( "OPENABLE" ) ) { - const std::string name = veh->part_info( already_open->part_index() ).name(); - add_msg( m_info, _( "That %s is already open." ), name.c_str() ); - } - u.moves += 100; - } - return; - } - - bool didit = m.open_door( openp, !m.is_outside( u.pos() ) ); - - if( !didit ) { - const ter_str_id tid = m.ter( openp ).id(); - - if( m.has_flag( "LOCKED", openp ) ) { - add_msg( m_info, _( "The door is locked!" ) ); - return; - } else if( tid.obj().close ) { - // if the following message appears unexpectedly, the prior check was for t_door_o - add_msg( m_info, _( "That door is already open." ) ); - u.moves += 100; - return; - } - add_msg( m_info, _( "No door there." ) ); - u.moves += 100; - } -} - -void game::close() -{ - tripoint closep; - if( choose_adjacent_highlight( _( "Close where?" ), closep, ACTION_CLOSE ) ) { - doors::close_door( m, u, closep ); - } -} - -void game::smash() -{ - const int move_cost = !u.is_armed() ? 80 : u.weapon.attack_time() * 0.8; - bool didit = false; - ///\EFFECT_STR increases smashing capability - int smashskill = u.str_cur + u.weapon.damage_melee( DT_BASH ); - tripoint smashp; - - const bool allow_floor_bash = debug_mode; // Should later become "true" - if( !choose_adjacent( _( "Smash where?" ), smashp, allow_floor_bash ) ) { - return; - } - - bool smash_floor = false; - if( smashp.z != u.posz() ) { - if( smashp.z > u.posz() ) { - // TODO: Knock on the ceiling - return; - } - - smashp.z = u.posz(); - smash_floor = true; - } - - if( m.get_field( smashp, fd_web ) != nullptr ) { - m.remove_field( smashp, fd_web ); - sounds::sound( smashp, 2, "" ); - add_msg( m_info, _( "You brush aside some webs." ) ); - u.moves -= 100; - return; - } - - for( const auto &maybe_corpse : m.i_at( smashp ) ) { - if( maybe_corpse.is_corpse() && maybe_corpse.damage() < maybe_corpse.max_damage() && - maybe_corpse.get_mtype()->has_flag( MF_REVIVES ) ) { - // do activity forever. ACT_PULP stops itself - u.assign_activity( activity_id( "ACT_PULP" ), calendar::INDEFINITELY_LONG, 0 ); - u.activity.placement = smashp; - return; // don't smash terrain if we've smashed a corpse - } - } - - didit = m.bash( smashp, smashskill, false, false, smash_floor ).did_bash; - if( didit ) { - u.handle_melee_wear( u.weapon ); - u.moves -= move_cost; - const int mod_sta = ( ( u.weapon.weight() / 100_gram ) + 20 ) * -1; - u.mod_stat( "stamina", mod_sta ); - - if( u.get_skill_level( skill_melee ) == 0 ) { - u.practice( skill_melee, rng( 0, 1 ) * rng( 0, 1 ) ); - } - const int vol = u.weapon.volume() / units::legacy_volume_factor; - if( u.weapon.made_of( material_id( "glass" ) ) && - rng( 0, vol + 3 ) < vol ) { - add_msg( m_bad, _( "Your %s shatters!" ), u.weapon.tname().c_str() ); - for( auto &elem : u.weapon.contents ) { - m.add_item_or_charges( u.pos(), elem ); - } - sounds::sound( u.pos(), 24, "" ); - u.deal_damage( nullptr, bp_hand_r, damage_instance( DT_CUT, rng( 0, vol ) ) ); - if( vol > 20 ) { - // Hurt left arm too, if it was big - u.deal_damage( nullptr, bp_hand_l, damage_instance( DT_CUT, rng( 0, long( vol * .5 ) ) ) ); - } - u.remove_weapon(); - u.check_dead_state(); - } - if( smashskill < m.bash_resistance( smashp ) && one_in( 10 ) ) { - if( m.has_furn( smashp ) && m.furn( smashp ).obj().bash.str_min != -1 ) { - // %s is the smashed furniture - add_msg( m_neutral, _( "You don't seem to be damaging the %s." ), m.furnname( smashp ).c_str() ); - } else { - // %s is the smashed terrain - add_msg( m_neutral, _( "You don't seem to be damaging the %s." ), m.tername( smashp ).c_str() ); - } - } - } else { - add_msg( _( "There's nothing there to smash!" ) ); + + if( first.is_player() ) { + update_map( *u_or_npc ); } + + return true; } -void game::loot() +bool game::is_empty( const tripoint &p ) { - enum ZoneFlags { - None = 1, - SortLoot = 2, - TillPlots = 4, - PlantPlots = 8 - }; + return ( m.passable( p ) || m.has_flag( "LIQUID", p ) ) && + critter_at( p ) == nullptr; +} - auto just_one = []( int flags ) { - return flags && !( flags & ( flags - 1 ) ); - }; +bool game::is_in_sunlight( const tripoint &p ) +{ + return ( m.is_outside( p ) && light_level( p.z ) >= 40 && + ( weather == WEATHER_CLEAR || weather == WEATHER_SUNNY ) ); +} - int flags = 0; - const auto &mgr = zone_manager::get_manager(); - const bool has_hoe = u.has_quality( quality_id( "DIG" ), 1 ); - const bool has_seeds = u.has_item_with( []( const item & itm ) { - return itm.is_seed(); - } ); +bool game::is_sheltered( const tripoint &p ) +{ + const optional_vpart_position vp = m.veh_at( p ); - flags |= check_near_zone( zone_type_id( "LOOT_UNSORTED" ), u.pos() ) ? SortLoot : 0; - if( check_near_zone( zone_type_id( "FARM_PLOT" ), u.pos() ) ) { - flags |= TillPlots; - flags |= PlantPlots; - } + return ( !m.is_outside( p ) || + p.z < 0 || + ( vp && vp->is_inside() ) ); +} - if( flags == 0 ) { - add_msg( m_info, _( "There is no compatible zone nearby." ) ); - add_msg( m_info, _( "Compatible zones are %s and %s" ), - mgr.get_name_from_type( zone_type_id( "LOOT_UNSORTED" ) ), - mgr.get_name_from_type( zone_type_id( "FARM_PLOT" ) ) ); - return; +bool game::revive_corpse( const tripoint &p, item &it ) +{ + if( !it.is_corpse() ) { + debugmsg( "Tried to revive a non-corpse." ); + return false; + } + if( critter_at( p ) != nullptr ) { + // Someone is in the way, try again later + return false; + } + monster critter( it.get_mtype()->id, p ); + critter.init_from_item( it ); + if( critter.get_hp() < 1 ) { + // Failed reanimation due to corpse being too burned + it.active = false; + return false; + } + if( it.has_flag( "FIELD_DRESS" ) || it.has_flag( "FIELD_DRESS_FAILED" ) || + it.has_flag( "QUARTERED" ) ) { + // Failed reanimation due to corpse being butchered + it.active = false; + return false; } - if( !just_one( flags ) ) { - uimenu menu; - menu.text = _( "Pick action:" ); - menu.desc_enabled = true; - - if( flags & SortLoot ) { - menu.addentry_desc( SortLoot, true, 'o', _( "Sort out my loot" ), - _( "Sorts out the loot from Loot: Unsorted zone to nerby appropriate Loot zones. Uses empty space in your inventory or utilizes a cart, if you are holding one." ) ); - } + critter.no_extra_death_drops = true; + critter.add_effect( effect_downed, 5_turns, num_bp, true ); - if( flags & TillPlots ) { - menu.addentry_desc( TillPlots, has_hoe, 't', - has_hoe ? _( "Till farm plots" ) : _( "Till farm plots... you need a tool to dig with" ), - _( "Tills nearby Farm: Plot zones." ) ); - } + if( it.get_var( "zlave" ) == "zlave" ) { + critter.add_effect( effect_pacified, 1_turns, num_bp, true ); + critter.add_effect( effect_pet, 1_turns, num_bp, true ); + } - if( flags & PlantPlots ) { - menu.addentry_desc( PlantPlots, warm_enough_to_plant() && has_seeds, 'p', - !warm_enough_to_plant() ? _( "Plant seeds... it is too cold for planting" ) : - !has_seeds ? _( "Plant seeds... you don't have any" ) : _( "Plant seeds" ), - _( "Plant seeds into nearby Farm: Plot zones. Farm plot has to be set to specific plant seed and you must have seeds in your inventory." ) ); + if( it.get_var( "no_ammo" ) == "no_ammo" ) { + for( auto &ammo : critter.ammo ) { + ammo.second = 0; } - - menu.addentry( None, true, 'q', _( "Cancel" ) ); - - menu.query(); - flags = ( menu.ret >= 0 ) ? menu.ret : None; } - switch( flags ) { - case None: - add_msg( _( "Never mind." ) ); - break; - case SortLoot: - u.assign_activity( activity_id( "ACT_MOVE_LOOT" ) ); - break; - case TillPlots: - if( has_hoe ) { - u.assign_activity( activity_id( "ACT_TILL_PLOT" ) ); - } else { - add_msg( _( "You need a tool to dig with." ) ); - } - break; - case PlantPlots: - if( !warm_enough_to_plant() ) { - add_msg( m_info, _( "It is too cold to plant anything now." ) ); - } else if( !has_seeds ) { - add_msg( m_info, _( "You don't have any seeds." ) ); - } else { - u.assign_activity( activity_id( "ACT_PLANT_PLOT" ) ); - } - break; - default: - debugmsg( "Unsupported flag" ); - break; + const bool ret = add_zombie( critter ); + if( !ret ) { + debugmsg( "Couldn't add a revived monster" ); } + if( ret && !critter_at( p ) ) { + debugmsg( "Revived monster is not where it's supposed to be. Prepare for crash." ); + } + return ret; } static void make_active( item_location loc ) @@ -7139,36 +5613,6 @@ void game::use_item( int pos ) u.invalidate_crafting_inventory(); } -void game::use_wielded_item() -{ - u.use_wielded(); -} - -void game::handbrake() -{ - const optional_vpart_position vp = m.veh_at( u.pos() ); - if( !vp ) { - return; - } - vehicle *const veh = &vp->vehicle(); - add_msg( _( "You pull a handbrake." ) ); - veh->cruise_velocity = 0; - if( veh->last_turn != 0 && rng( 15, 60 ) * 100 < abs( veh->velocity ) ) { - veh->skidding = true; - add_msg( m_warning, _( "You lose control of %s." ), veh->name.c_str() ); - veh->turn( veh->last_turn > 0 ? 60 : -60 ); - } else { - int braking_power = abs( veh->velocity ) / 2 + 10 * 100; - if( abs( veh->velocity ) < braking_power ) { - veh->stop(); - } else { - int sgn = veh->velocity > 0 ? 1 : -1; - veh->velocity = sgn * ( abs( veh->velocity ) - braking_power ); - } - } - u.moves = 0; -} - void game::exam_vehicle( vehicle &veh, int cx, int cy ) { auto act = veh_interact::run( veh, cx, cy ); @@ -8229,12 +6673,12 @@ bool game::check_near_zone( const zone_type_id &type, const tripoint &where ) co return zone_manager::get_manager().has_near( type, m.getabs( where ) ); } -bool game::is_zone_manager_open() +bool game::is_zones_manager_open() const { - return zone_manager_open; -}; + return zones_manager_open; +} -void game::zones_manager_shortcuts( const catacurses::window &w_info ) +static void zones_manager_shortcuts( const catacurses::window &w_info ) { werase( w_info ); @@ -8256,9 +6700,9 @@ void game::zones_manager_shortcuts( const catacurses::window &w_info ) wrefresh( w_info ); } -void game::zones_manager_draw_borders( const catacurses::window &w_border, - const catacurses::window &w_info_border, - const int iInfoHeight, const int width ) +static void zones_manager_draw_borders( const catacurses::window &w_border, + const catacurses::window &w_info_border, + const int iInfoHeight, const int width ) { for( int i = 1; i < TERMX; ++i ) { if( i < width ) { @@ -8439,26 +6883,46 @@ void game::zones_manager() return std::pair( tripoint_min, tripoint_min ); }; - zone_manager_open = true; + zones_manager_open = true; do { if( action == "ADD_ZONE" ) { zones_manager_draw_borders( w_zones_border, w_zones_info_border, zone_ui_height, width ); - const auto id = mgr.query_type(); - auto options = zone_options::create( id ); - options->query_at_creation(); - const auto name = mgr.query_name( options->get_zone_name_suggestion() == "" ? - mgr.get_name_from_type( id ) : options->get_zone_name_suggestion() ); - const auto position = query_position(); + do { // not a loop, just for quick bailing out if canceled + const auto maybe_id = mgr.query_type(); + if( !maybe_id.has_value() ) { + break; + } + + const auto id = maybe_id.value(); + auto options = zone_options::create( id ); + + if( !options->query_at_creation() ) { + break; + } + + auto default_name = options->get_zone_name_suggestion(); + if( default_name.empty() ) { + default_name = mgr.get_name_from_type( id ); + } + const auto maybe_name = mgr.query_name( default_name ); + if( !maybe_name.has_value() ) { + break; + } + const auto name = maybe_name.value(); + + const auto position = query_position(); + if( position.first == tripoint_min ) { + break; + } - if( position.first != tripoint_min ) { mgr.add( name, id, false, true, position.first, position.second, options ); zones = get_zones(); active_index = zone_cnt - 1; stuff_changed = true; - } + } while( false ); draw_ter(); blink = false; @@ -8495,7 +6959,7 @@ void game::zones_manager() } else if( action == "REMOVE_ZONE" ) { if( active_index < zone_cnt ) { - mgr.remove( active_index ); + mgr.remove( zones[active_index] ); zones = get_zones(); active_index--; @@ -8513,39 +6977,45 @@ void game::zones_manager() } else if( action == "CONFIRM" ) { auto &zone = zones[active_index].get(); - uimenu as_m; + uilist as_m; as_m.text = _( "What do you want to change:" ); as_m.entries.emplace_back( uimenu_entry( 1, true, '1', _( "Edit name" ) ) ); as_m.entries.emplace_back( uimenu_entry( 2, true, '2', _( "Edit type" ) ) ); as_m.entries.emplace_back( uimenu_entry( 3, zone.get_options().has_options(), '3', _( "Edit options" ) ) ); as_m.entries.emplace_back( uimenu_entry( 4, true, '4', _( "Edit position" ) ) ); - as_m.entries.emplace_back( uimenu_entry( 5, true, 'q', _( "Cancel" ) ) ); as_m.query(); switch( as_m.ret ) { case 1: - zone.set_name(); - stuff_changed = true; + if( zone.set_name() ) { + stuff_changed = true; + } break; case 2: - zone.set_type(); - stuff_changed = true; + if( zone.set_type() ) { + stuff_changed = true; + } break; case 3: - zone.get_options().query(); - stuff_changed = true; - break; - case 4: - zone.set_position( query_position() ); - stuff_changed = true; + if( zone.get_options().query() ) { + stuff_changed = true; + } break; + case 4: { + const auto pos = query_position(); + if( pos.first != tripoint_min && + ( pos.first != zone.get_start_point() || pos.second != zone.get_end_point() ) ) { + + zone.set_position( pos ); + stuff_changed = true; + } + } + break; default: break; } - as_m.reset(); - draw_ter(); blink = false; @@ -8703,20 +7173,19 @@ void game::zones_manager() #endif } - wrefresh( w_terrain ); - inp_mngr.set_timeout( BLINK_SPEED ); } else { inp_mngr.reset_timeout(); } + wrefresh( w_terrain ); wrefresh( w_zones ); wrefresh( w_zones_border ); //Wait for input action = ctxt.handle_input(); } while( action != "QUIT" ); - zone_manager_open = false; + zones_manager_open = false; inp_mngr.reset_timeout(); if( stuff_changed ) { @@ -9966,50 +8435,6 @@ game::vmenu_ret game::list_monsters( const std::vector &monster_list return game::vmenu_ret::QUIT; } -// Establish or release a grab on a vehicle -void game::grab() -{ - tripoint grabp( 0, 0, 0 ); - if( u.get_grab_type() != OBJECT_NONE ) { - if( const optional_vpart_position vp = m.veh_at( u.pos() + u.grab_point ) ) { - add_msg( _( "You release the %s." ), vp->vehicle().name ); - } else if( m.has_furn( u.pos() + u.grab_point ) ) { - add_msg( _( "You release the %s." ), m.furnname( u.pos() + u.grab_point ).c_str() ); - } - - u.grab( OBJECT_NONE ); - return; - } - - if( choose_adjacent( _( "Grab where?" ), grabp ) ) { - if( grabp == u.pos() ) { - add_msg( _( "You get a hold of yourself." ) ); - u.grab( OBJECT_NONE ); - return; - } - - if( const optional_vpart_position vp = m.veh_at( grabp ) ) { - u.grab( OBJECT_VEHICLE, grabp - u.pos() ); - add_msg( _( "You grab the %s." ), vp->vehicle().name ); - } else if( m.has_furn( grabp ) ) { // If not, grab furniture if present - if( m.furn( grabp ).obj().move_str_req < 0 ) { - add_msg( _( "You can not grab the %s" ), m.furnname( grabp ).c_str() ); - return; - } - u.grab( OBJECT_FURNITURE, grabp - u.pos() ); - if( !m.can_move_furniture( grabp, &u ) ) { - add_msg( _( "You grab the %s. It feels really heavy." ), m.furnname( grabp ).c_str() ); - } else { - add_msg( _( "You grab the %s." ), m.furnname( grabp ).c_str() ); - } - } else { // @todo: grab mob? Captured squirrel = pet (or meat that stays fresh longer). - add_msg( m_info, _( "There's nothing to grab there!" ) ); - } - } else { - add_msg( _( "Never mind." ) ); - } -} - std::vector nearby_vehicles_for( const itype_id &ft ) { std::vector result; @@ -10407,14 +8832,7 @@ void game::plthrow( int pos ) // you must wield the item to throw it if( pos != -1 ) { - // Throw a single charge of a stacking object. - if( thrown.count_by_charges() && thrown.charges > 1 ) { - u.i_at( pos ).charges--; - thrown.charges = 1; - } else { - u.i_rem( pos ); - } - + u.i_rem( pos ); if( !u.wield( thrown ) ) { // We have to remove the item before checking for wield because it // can invalidate our pos index. Which means we have to add it @@ -10435,7 +8853,12 @@ void game::plthrow( int pos ) return; } - u.i_rem( -1 ); + if( thrown.count_by_charges() && thrown.charges > 1 ) { + u.i_at( -1 ).charges--; + thrown.charges = 1; + } else { + u.i_rem( -1 ); + } u.throw_item( trajectory.back(), thrown ); reenter_fullscreen(); } @@ -11098,50 +9521,6 @@ void game::eat( int pos ) } } -void game::wear() -{ - item_location loc = game_menus::inv::wear( u ); - - if( loc ) { - wear( loc ); - } else { - add_msg( _( "Never mind." ) ); - } -} - -void game::wear( int pos ) -{ - item_location loc( u, &u.i_at( pos ) ); - wear( loc ); -} - -void game::wear( item_location &loc ) -{ - u.wear( u.i_at( loc.obtain( u ) ) ); -} - -void game::takeoff() -{ - item_location loc = game_menus::inv::take_off( u ); - - if( loc ) { - takeoff( loc ); - } else { - add_msg( _( "Never mind." ) ); - } -} - -void game::takeoff( int pos ) -{ - item_location loc( u, &u.i_at( pos ) ); - takeoff( loc ); -} - -void game::takeoff( item_location &loc ) -{ - u.takeoff( u.i_at( loc.obtain( u ) ) ); -} - void game::change_side( int pos ) { if( pos == INT_MIN ) { @@ -11539,18 +9918,6 @@ void game::wield() } } -void game::read() -{ - // Can read items from inventory or within one tile (including in vehicles) - auto loc = game_menus::inv::read( u ); - - if( loc ) { - u.read( loc.obtain( u ) ); - } else { - add_msg( _( "Never mind." ) ); - } -} - void game::chat() { const std::vector available = get_npcs_if( [&]( const npc & guy ) { @@ -11606,122 +9973,6 @@ void game::chat() refresh_all(); } -void game::pldrive( int x, int y ) -{ - if( !check_safe_mode_allowed() ) { - return; - } - vehicle *veh = remoteveh(); - bool remote = true; - int part = -1; - if( !veh ) { - if( const optional_vpart_position vp = m.veh_at( u.pos() ) ) { - veh = &vp->vehicle(); - part = vp->part_index(); - } - remote = false; - } - if( !veh ) { - dbg( D_ERROR ) << "game::pldrive: can't find vehicle! Drive mode is now off."; - debugmsg( "game::pldrive error: can't find vehicle! Drive mode is now off." ); - u.in_vehicle = false; - return; - } - if( !remote ) { - int pctr = veh->part_with_feature( part, "CONTROLS" ); - if( pctr < 0 ) { - add_msg( m_info, _( "You can't drive the vehicle from here. You need controls!" ) ); - u.controlling_vehicle = false; - return; - } - } else { - if( veh->all_parts_with_feature( "REMOTE_CONTROLS", true ).empty() ) { - add_msg( m_info, _( "Can't drive this vehicle remotely. It has no working controls." ) ); - return; - } - } - - int turn_delta = 15 * x; - const float handling_diff = veh->handling_difficulty(); - if( turn_delta != 0 ) { - float eff = veh->steering_effectiveness(); - if( eff < 0 ) { - add_msg( m_info, _( "This vehicle has no steering system installed, you can't turn it." ) ); - return; - } - - if( eff == 0 ) { - add_msg( m_bad, _( "The steering is completely broken!" ) ); - return; - } - - // If you've got more moves than speed, it's most likely time stop - // Let's get rid of that - u.moves = std::min( u.moves, u.get_speed() ); - - ///\EFFECT_DEX reduces chance of losing control of vehicle when turning - - ///\EFFECT_PER reduces chance of losing control of vehicle when turning - - ///\EFFECT_DRIVING reduces chance of losing control of vehicle when turning - float skill = std::min( 10.0f, - u.get_skill_level( skill_driving ) + ( u.get_dex() + u.get_per() ) / 10.0f ); - float penalty = rng_float( 0.0f, handling_diff ) - skill; - int cost; - if( penalty > 0.0f ) { - // At 10 penalty (rather hard to get), we're taking 4 turns per turn - cost = 100 * ( 1.0f + penalty / 2.5f ); - } else { - // At 10 skill, with a perfect vehicle, we could turn up to 3 times per turn - cost = std::max( u.get_speed(), 100 ) * ( 1.0f - ( -penalty / 10.0f ) * 2 / 3 ); - } - - if( penalty > skill || cost > 400 ) { - add_msg( m_warning, _( "You fumble with the %s's controls." ), veh->name.c_str() ); - // Anything from a wasted attempt to 2 turns in the intended direction - turn_delta *= rng( 0, 2 ); - // Also wastes next turn - cost = std::max( cost, u.moves + 100 ); - } else if( one_in( 10 ) ) { - // Don't warn all the time or it gets spammy - if( cost >= u.get_speed() * 2 ) { - add_msg( m_warning, _( "It takes you a very long time to steer that vehicle!" ) ); - } else if( cost >= u.get_speed() * 1.5f ) { - add_msg( m_warning, _( "It takes you a long time to steer that vehicle!" ) ); - } - } - - veh->turn( turn_delta ); - - // At most 3 turns per turn, because otherwise it looks really weird and jumpy - u.moves -= std::max( cost, u.get_speed() / 3 + 1 ); - } - - if( y != 0 ) { - int thr_amount = 10 * 100; - if( veh->cruise_on ) { - veh->cruise_thrust( -y * thr_amount ); - } else { - veh->thrust( -y ); - u.moves = std::min( u.moves, 0 ); - } - } - - // @todo: Actually check if we're on land on water (or disable water-skidding) - if( veh->skidding && ( veh->valid_wheel_config( false ) || veh->valid_wheel_config( true ) ) ) { - ///\EFFECT_DEX increases chance of regaining control of a vehicle - - ///\EFFECT_DRIVING increases chance of regaining control of a vehicle - if( handling_diff * rng( 1, 10 ) < u.dex_cur + u.get_skill_level( skill_driving ) * 2 ) { - add_msg( _( "You regain control of the %s." ), veh->name.c_str() ); - u.practice( skill_driving, veh->velocity / 5 ); - veh->velocity = int( veh->forward_velocity() ); - veh->skidding = false; - veh->move.init( veh->turn_dir ); - } - } -} - bool game::check_safe_mode_allowed( bool repeat_safe_mode_warnings ) { if( !repeat_safe_mode_warnings && safe_mode_warning_logged ) { @@ -14051,69 +12302,6 @@ void game::perhaps_add_random_npc() load_npcs(); } -void game::wait() -{ - std::map durations; - uimenu as_m; - - const bool has_watch = u.has_watch(); - const auto add_menu_item = [ &as_m, &durations, has_watch ] - ( int retval, int hotkey, const std::string &caption = "", - int duration = calendar::INDEFINITELY_LONG ) { - - std::string text( caption ); - - if( has_watch && duration != calendar::INDEFINITELY_LONG ) { - const std::string dur_str( to_string( time_duration::from_turns( duration ) ) ); - text += ( text.empty() ? dur_str : string_format( " (%s)", dur_str.c_str() ) ); - } - as_m.addentry( retval, true, hotkey, text ); - durations[retval] = duration; - }; - - add_menu_item( 1, '1', !has_watch ? _( "Wait 300 heartbeats" ) : "", MINUTES( 5 ) ); - add_menu_item( 2, '2', !has_watch ? _( "Wait 1800 heartbeats" ) : "", MINUTES( 30 ) ); - - if( has_watch ) { - add_menu_item( 3, '3', "", HOURS( 1 ) ); - add_menu_item( 4, '4', "", HOURS( 2 ) ); - add_menu_item( 5, '5', "", HOURS( 3 ) ); - add_menu_item( 6, '6', "", HOURS( 6 ) ); - } - - if( get_levz() >= 0 || has_watch ) { - const auto diurnal_time_before = []( const int turn ) { - const int remainder = turn % DAYS( 1 ) - calendar::turn % DAYS( 1 ); - return ( remainder > 0 ) ? remainder : DAYS( 1 ) + remainder; - }; - - add_menu_item( 7, 'd', _( "Wait till dawn" ), - diurnal_time_before( calendar::turn.sunrise() ) ); - add_menu_item( 8, 'n', _( "Wait till noon" ), diurnal_time_before( HOURS( 12 ) ) ); - add_menu_item( 9, 'k', _( "Wait till dusk" ), diurnal_time_before( calendar::turn.sunset() ) ); - add_menu_item( 10, 'm', _( "Wait till midnight" ), diurnal_time_before( HOURS( 0 ) ) ); - add_menu_item( 11, 'w', _( "Wait till weather changes" ) ); - } - - add_menu_item( 12, 'q', _( "Exit" ) ); - - as_m.text = ( has_watch ) ? string_format( _( "It's %s now. " ), - to_string_time_of_day( calendar::turn ) ) : ""; - as_m.text += _( "Wait for how long?" ); - as_m.return_invalid = true; - as_m.query(); /* calculate key and window variables, generate window, and loop until we get a valid answer */ - - if( as_m.ret == 12 || durations.count( as_m.ret ) == 0 ) { - return; - } - - activity_id actType = activity_id( as_m.ret == 11 ? "ACT_WAIT_WEATHER" : "ACT_WAIT" ); - - player_activity new_act( actType, 100 * ( durations[as_m.ret] - 1 ), 0 ); - - u.assign_activity( new_act, false ); -} - void game::teleport( player *p, bool add_teleglow ) { if( p == nullptr ) { diff --git a/src/game.h b/src/game.h index e5d28da0b8a2e..2955526aa29f0 100644 --- a/src/game.h +++ b/src/game.h @@ -554,11 +554,9 @@ class game bool check_zone( const zone_type_id &type, const tripoint &where ) const; /** Checks whether or not there is a zone of particular type nearby */ bool check_near_zone( const zone_type_id &type, const tripoint &where ) const; - bool is_zone_manager_open(); + bool is_zones_manager_open() const; void zones_manager(); - void zones_manager_shortcuts( const catacurses::window &w_info ); - void zones_manager_draw_borders( const catacurses::window &w_border, - const catacurses::window &w_info_border, const int iInfoHeight, const int width ); + // Look at nearby terrain ';', or select zone points tripoint look_around(); tripoint look_around( catacurses::window w_info, const tripoint &start_point, bool has_first_point, @@ -908,7 +906,6 @@ class game bool prompt_dangerous_tile( const tripoint &dest_loc ) const; /** Returns true if the menu handled stuff and player shouldn't do anything else */ bool npc_menu( npc &who ); - void pldrive( int x, int y ); // drive vehicle // Standard movement; handles attacks, traps, &c. Returns false if auto move // should be canceled bool plmove( int dx, int dy, int dz = 0 ); @@ -923,18 +920,11 @@ class game // Regular movement. Returns false if it failed for any reason bool walk_move( const tripoint &dest ); void on_move_effects(); - void wait(); // Long wait (player action) '^' - void open(); // Open a door 'o' - void close(); - void smash(); // Smash terrain - void loot(); // Sort out loot or perform other zone activity - void handbrake(); void control_vehicle(); // Use vehicle controls '^' void examine( const tripoint &p );// Examine nearby terrain 'e' void examine(); - void grab(); // Establish a grab on something. void drop( int pos = INT_MIN, const tripoint &where = tripoint_min ); // Drop an item 'd' void drop_in_direction(); // Drop w/ direction 'D' @@ -942,14 +932,6 @@ class game void butcher(); // Butcher a corpse 'B' void eat( int pos = INT_MIN ); // Eat food or fuel 'E' (or 'a') void use_item( int pos = INT_MIN ); // Use item; also tries E,R,W 'a' - void use_wielded_item(); - void wear(); // Wear armor 'W' (or 'a') - void wear( int pos ); - void wear( item_location &loc ); - - void takeoff(); // Remove armor 'T' - void takeoff( int pos ); - void takeoff( item_location &loc ); void change_side( int pos = INT_MIN ); // Change the side on which an item is worn 'c' void reload(); // Reload a wielded gun/tool 'r' @@ -976,7 +958,6 @@ class game void wield( int pos ); // Wield a weapon 'w' void wield( item_location &loc ); - void read(); // Read a book 'R' (or 'a') void chat(); // Talk to a nearby NPC 'C' void plthrow( int pos = INT_MIN ); // Throw an item 't' @@ -1036,7 +1017,6 @@ class game void item_action_menu(); // Displays item action menu - void rcdrive( int dx, int dy ); //driving radio car /** * If there is a robot (that can be disabled), query the player * and try to disable it. @@ -1057,13 +1037,9 @@ class game // int autosave_timeout(); // If autosave enabled, how long we should wait for user inaction before saving. void autosave(); // automatic quicksaves - Performs some checks before calling quicksave() -#ifdef __ANDROID__ public: -#endif void quicksave(); // Saves the game without quitting -#ifdef __ANDROID__ private: -#endif void quickload(); // Loads the previously saved game if it exists // Input related @@ -1071,7 +1047,6 @@ class game bool handle_mouseview( input_context &ctxt, std::string &action ); // On-request draw functions - void draw_overmap(); // Draws the overmap, allows note-taking etc. void disp_kills(); // Display the player's kill counts void disp_faction_ends(); // Display the faction endings void disp_NPC_epilogues(); // Display NPC endings @@ -1103,6 +1078,8 @@ class game // remoteveh() cache time_point remoteveh_cache_time; vehicle *remoteveh_cache; + /** temperature cache, cleared every turn, sparse map of map tripoints to temperatures */ + std::unordered_map< tripoint, int > temperature_cache; /** Has a NPC been spawned since last load? */ bool npcs_dirty; /** Has anything died in this turn and needs to be cleaned up? */ @@ -1110,7 +1087,7 @@ class game /** Was the player sleeping during this turn. */ bool player_was_sleeping; /** Is Zone manager open or not - changes graphics of some zone tiles */ - bool zone_manager_open = false; + bool zones_manager_open = false; std::unique_ptr gamemode; diff --git a/src/game_constants.h b/src/game_constants.h index f66a7eac09dbf..67250a2c471d7 100644 --- a/src/game_constants.h +++ b/src/game_constants.h @@ -70,14 +70,22 @@ /** Amount by which to charge an item for each unit of plutonium cell */ #define PLUTONIUM_CHARGES 500 +/** Temperature constants */ +namespace temperatures +{ /** Temperature inside an active fridge in Fahrenheit */ -#define FRIDGE_TEMPERATURE 37 // ~ 2.7 Celsius +constexpr int fridge = 37; // ~ 2.7 Celsius + +/** Temperature at which things are considered "cold" */ +constexpr int cold = 40; /** Temperature inside an active freezer in Fahrenheit */ -#define FREEZER_TEMPERATURE 23 // -5 Celsius +constexpr int freezer = 23; // -5 Celsius /** Temperature in which water freezes in Fahrenheit */ -#define FREEZING_TEMPERATURE 32 // 0 Celsius +constexpr int freezing = 32; // 0 Celsius +} + /** Weight per level of LIFT/JACK tool quality */ #define TOOL_LIFT_FACTOR 500_kilogram // 500kg/level diff --git a/src/game_inventory.cpp b/src/game_inventory.cpp index e3caaa39b3609..90a60230b0f7a 100644 --- a/src/game_inventory.cpp +++ b/src/game_inventory.cpp @@ -361,8 +361,9 @@ class comestible_inventory_preset : public inventory_selector_preset comestible_inventory_preset( const player &p ) : inventory_selector_preset(), p( p ) { append_cell( [ p, this ]( const item_location & loc ) { - return good_bad_none( p.nutrition_for( get_comestible_item( loc ) ) ); - }, _( "NUTRITION" ) ); + return good_bad_none( p.nutrition_for( get_comestible_item( loc ) ) * + islot_comestible::kcal_per_nutr ); + }, _( "CALORIES" ) ); append_cell( [ this ]( const item_location & loc ) { return good_bad_none( get_edible_comestible( loc ).quench ); diff --git a/src/handle_action.cpp b/src/handle_action.cpp new file mode 100644 index 0000000000000..07c86e76af99f --- /dev/null +++ b/src/handle_action.cpp @@ -0,0 +1,1835 @@ +#include "game.h" +#include "gamemode.h" +#include "gates.h" +#include "action.h" +#include "input.h" +#include "output.h" +#include "player.h" +#include "messages.h" +#include "vehicle.h" +#include "vpart_position.h" +#include "vpart_reference.h" +#include "map.h" +#include "options.h" +#include "mapsharing.h" +#include "safemode_ui.h" +#include "pickup.h" +#include "game_inventory.h" +#include "ranged.h" +#include "debug.h" +#include "worldfactory.h" +#include "faction.h" +#include "itype.h" +#include "auto_pickup.h" +#include "gun_mode.h" +#include "construction.h" +#include "bionics.h" +#include "mutation.h" +#include "monster.h" +#include "help.h" +#include "calendar.h" +#include "weather.h" +#include "sounds.h" +#include "veh_type.h" +#include "mapdata.h" +#include "mtype.h" +#include "field.h" +#include "clzones.h" +#include "cursesdef.h" +#include "overmap_ui.h" + +#include + +#define dbg(x) DebugLog((DebugLevel)(x),D_GAME) << __FILE__ << ":" << __LINE__ << ": " + +void advanced_inv(); + +const efftype_id effect_alarm_clock( "alarm_clock" ); +const efftype_id effect_laserlocked( "laserlocked" ); + +static const bionic_id bio_remote( "bio_remote" ); + +static const trait_id trait_HIBERNATE( "HIBERNATE" ); +static const trait_id trait_SHELL2( "SHELL2" ); + +const skill_id skill_driving( "driving" ); +const skill_id skill_melee( "melee" ); + +#ifdef __ANDROID__ +extern std::map> quick_shortcuts_map; +extern bool add_best_key_for_action_to_quick_shortcuts( action_id action, + const std::string &category, bool back ); +extern bool add_key_to_quick_shortcuts( long key, const std::string &category, bool back ); +#endif + +class user_turn +{ + + private: + std::chrono::time_point user_turn_start; + public: + user_turn() { + user_turn_start = std::chrono::steady_clock::now(); + } + + bool has_timeout_elapsed() { + float turn_duration = get_option( "TURN_DURATION" ); + // Magic number 0.005 chosen due to option menu's 2 digit precision and + // the option menu UI rounding <= 0.005 down to "0.00" in the display. + // This conditional will catch values (e.g. 0.003) that the options menu + // would round down to "0.00" in the options menu display. This prevents + // the user from being surprised by floating point rounding near zero. + if( turn_duration <= 0.005 ) { + return false; + } + + auto now = std::chrono::steady_clock::now(); + std::chrono::milliseconds elapsed_ms = + std::chrono::duration_cast( now - user_turn_start ); + return elapsed_ms.count() >= 1000.0 * turn_duration; + } +}; + +input_context game::get_player_input( std::string &action ) +{ + input_context ctxt = get_default_mode_input_context(); + // register QUIT action so it catches q/Q/etc instead of just Q + if( uquit == QUIT_WATCH ) { + ctxt.register_action( "QUIT" ); + } + + m.update_visibility_cache( u.posz() ); + const visibility_variables &cache = g->m.get_visibility_variables_cache(); + const level_cache &map_cache = m.get_cache_ref( u.posz() ); + const auto &visibility_cache = map_cache.visibility_cache; + + user_turn current_turn; + + if( get_option( "ANIMATIONS" ) ) { + int iStartX = ( TERRAIN_WINDOW_WIDTH > 121 ) ? ( TERRAIN_WINDOW_WIDTH - 121 ) / 2 : 0; + int iStartY = ( TERRAIN_WINDOW_HEIGHT > 121 ) ? ( TERRAIN_WINDOW_HEIGHT - 121 ) / 2 : 0; + int iEndX = ( TERRAIN_WINDOW_WIDTH > 121 ) ? TERRAIN_WINDOW_WIDTH - ( TERRAIN_WINDOW_WIDTH - 121 ) / + 2 : + TERRAIN_WINDOW_WIDTH; + int iEndY = ( TERRAIN_WINDOW_HEIGHT > 121 ) ? TERRAIN_WINDOW_HEIGHT - + ( TERRAIN_WINDOW_HEIGHT - 121 ) / + 2 : TERRAIN_WINDOW_HEIGHT; + + if( fullscreen ) { + iStartX = 0; + iStartY = 0; + iEndX = TERMX; + iEndY = TERMY; + } + + //x% of the Viewport, only shown on visible areas + auto const weather_info = get_weather_animation( weather ); + int offset_x = ( u.posx() + u.view_offset.x ) - getmaxx( w_terrain ) / 2; + int offset_y = ( u.posy() + u.view_offset.y ) - getmaxy( w_terrain ) / 2; + +#ifdef TILES + if( tile_iso && use_tiles ) { + iStartX = 0; + iStartY = 0; + iEndX = MAPSIZE * SEEX; + iEndY = MAPSIZE * SEEY; + offset_x = 0; + offset_y = 0; + } +#endif //TILES + + // TODO: Move the weather calculations out of here. + const bool bWeatherEffect = ( weather_info.glyph != '?' ); + const int dropCount = int( iEndX * iEndY * weather_info.factor ); + + weather_printable wPrint; + wPrint.colGlyph = weather_info.color; + wPrint.cGlyph = weather_info.glyph; + wPrint.wtype = weather; + wPrint.vdrops.clear(); + wPrint.startx = iStartX; + wPrint.starty = iStartY; + wPrint.endx = iEndX; + wPrint.endy = iEndY; + + inp_mngr.set_timeout( 125 ); + // Force at least one animation frame if the player is dead. + while( handle_mouseview( ctxt, action ) || uquit == QUIT_WATCH ) { + if( action == "TIMEOUT" && current_turn.has_timeout_elapsed() ) { + break; + } + + if( bWeatherEffect && get_option( "ANIMATION_RAIN" ) ) { + /* + Location to add rain drop animation bits! Since it refreshes w_terrain it can be added to the animation section easily + Get tile information from above's weather information: + WEATHER_ACID_DRIZZLE | WEATHER_ACID_RAIN = "weather_acid_drop" + WEATHER_DRIZZLE | WEATHER_RAINY | WEATHER_THUNDER | WEATHER_LIGHTNING = "weather_rain_drop" + WEATHER_FLURRIES | WEATHER_SNOW | WEATHER_SNOWSTORM = "weather_snowflake" + */ + +#ifdef TILES + if( !use_tiles ) { +#endif //TILES + //If not using tiles, erase previous drops from w_terrain + for( auto &elem : wPrint.vdrops ) { + const tripoint location( elem.first + offset_x, elem.second + offset_y, get_levz() ); + const lit_level lighting = visibility_cache[location.x][location.y]; + wmove( w_terrain, location.y - offset_y, location.x - offset_x ); + if( !m.apply_vision_effects( w_terrain, lighting, cache ) ) { + m.drawsq( w_terrain, u, location, false, true, + u.pos() + u.view_offset, + lighting == LL_LOW, lighting == LL_BRIGHT ); + } + } +#ifdef TILES + } +#endif //TILES + wPrint.vdrops.clear(); + + for( int i = 0; i < dropCount; i++ ) { + const int iRandX = rng( iStartX, iEndX - 1 ); + const int iRandY = rng( iStartY, iEndY - 1 ); + const int mapx = iRandX + offset_x; + const int mapy = iRandY + offset_y; + + const tripoint mapp( mapx, mapy, u.posz() ); + + const lit_level lighting = visibility_cache[mapp.x][mapp.y]; + + if( m.is_outside( mapp ) && m.get_visibility( lighting, cache ) == VIS_CLEAR && + !critter_at( mapp, true ) ) { + // Suppress if a critter is there + wPrint.vdrops.emplace_back( std::make_pair( iRandX, iRandY ) ); + } + } + } + // don't bother calculating SCT if we won't show it + if( uquit != QUIT_WATCH && get_option( "ANIMATION_SCT" ) ) { +#ifdef TILES + if( !use_tiles ) { +#endif + for( auto &elem : SCT.vSCT ) { + //Erase previous text from w_terrain + if( elem.getStep() > 0 ) { + for( size_t i = 0; i < elem.getText().length(); ++i ) { + const tripoint location( elem.getPosX() + i, elem.getPosY(), get_levz() ); + const lit_level lighting = visibility_cache[location.x][location.y]; + wmove( w_terrain, location.y - offset_y, location.x - offset_x ); + if( !m.apply_vision_effects( w_terrain, lighting, cache ) ) { + m.drawsq( w_terrain, u, location, false, true, + u.pos() + u.view_offset, + lighting == LL_LOW, lighting == LL_BRIGHT ); + } + } + } + } +#ifdef TILES + } +#endif + + SCT.advanceAllSteps(); + + //Check for creatures on all drawing positions and offset if necessary + for( auto iter = SCT.vSCT.rbegin(); iter != SCT.vSCT.rend(); ++iter ) { + const direction oCurDir = iter->getDirecton(); + + for( int i = 0; i < static_cast( iter->getText().length() ); ++i ) { + tripoint tmp( iter->getPosX() + i, iter->getPosY(), get_levz() ); + const Creature *critter = critter_at( tmp, true ); + + if( critter != nullptr && u.sees( *critter ) ) { + i = -1; + int iPos = iter->getStep() + iter->getStepOffset(); + for( auto iter2 = iter; iter2 != SCT.vSCT.rend(); ++iter2 ) { + if( iter2->getDirecton() == oCurDir && + iter2->getStep() + iter2->getStepOffset() <= iPos ) { + if( iter2->getType() == "hp" ) { + iter2->advanceStepOffset(); + } + + iter2->advanceStepOffset(); + iPos = iter2->getStep() + iter2->getStepOffset(); + } + } + } + } + } + } + + werase( w_terrain ); + + draw_ter(); + draw_weather( wPrint ); + + if( uquit != QUIT_WATCH ) { + draw_sct(); + } + + wrefresh( w_terrain ); + + if( uquit == QUIT_WATCH ) { + draw_sidebar(); + + catacurses::window popup = create_wait_popup_window( + string_format( _( "Press %s to accept your fate..." ), + ctxt.get_desc( "QUIT" ).c_str() ), + c_red + ); + + wrefresh( popup ); + + break; + } + + //updating the pixel minimap here allows red flashing indicators for enemies to actually flicker + draw_pixel_minimap(); + } + inp_mngr.reset_timeout(); + } else { + inp_mngr.set_timeout( 125 ); + while( handle_mouseview( ctxt, action ) ) { + if( action == "TIMEOUT" && current_turn.has_timeout_elapsed() ) { + break; + } + } + inp_mngr.reset_timeout(); + } + + return ctxt; +} + +static void rcdrive( int dx, int dy ) +{ + player &u = g->u; + map &m = g->m; + std::stringstream car_location_string( u.get_value( "remote_controlling" ) ); + + if( car_location_string.str().empty() ) { + //no turned radio car found + u.add_msg_if_player( m_warning, _( "No radio car connected." ) ); + return; + } + int cx = 0; + int cy = 0; + int cz = 0; + car_location_string >> cx >> cy >> cz; + + auto rc_pairs = m.get_rc_items( cx, cy, cz ); + auto rc_pair = rc_pairs.begin(); + for( ; rc_pair != rc_pairs.end(); ++rc_pair ) { + if( rc_pair->second->typeId() == "radio_car_on" && rc_pair->second->active ) { + break; + } + } + if( rc_pair == rc_pairs.end() ) { + u.add_msg_if_player( m_warning, _( "No radio car connected." ) ); + u.remove_value( "remote_controlling" ); + return; + } + item *rc_car = rc_pair->second; + + if( tile_iso && use_tiles ) { + rotate_direction_cw( dx, dy ); + } + + tripoint src( cx, cy, cz ); + tripoint dest( cx + dx, cy + dy, cz ); + if( m.impassable( dest ) || !m.can_put_items_ter_furn( dest ) || + m.has_furn( dest ) ) { + sounds::sound( dest, 7, _( "sound of a collision with an obstacle." ) ); + return; + } else if( !m.add_item_or_charges( dest, *rc_car ).is_null() ) { + //~ Sound of moving a remote controlled car + sounds::sound( src, 6, _( "zzz..." ) ); + u.moves -= 50; + m.i_rem( src, rc_car ); + car_location_string.clear(); + car_location_string << dest.x << ' ' << dest.y << ' ' << dest.z; + u.set_value( "remote_controlling", car_location_string.str() ); + return; + } +} + +static void pldrive( int x, int y ) +{ + if( !g->check_safe_mode_allowed() ) { + return; + } + player &u = g->u; + vehicle *veh = g->remoteveh(); + bool remote = true; + int part = -1; + if( !veh ) { + if( const optional_vpart_position vp = g->m.veh_at( u.pos() ) ) { + veh = &vp->vehicle(); + part = vp->part_index(); + } + remote = false; + } + if( !veh ) { + dbg( D_ERROR ) << "game::pldrive: can't find vehicle! Drive mode is now off."; + debugmsg( "game::pldrive error: can't find vehicle! Drive mode is now off." ); + u.in_vehicle = false; + return; + } + if( !remote ) { + int pctr = veh->part_with_feature( part, "CONTROLS" ); + if( pctr < 0 ) { + add_msg( m_info, _( "You can't drive the vehicle from here. You need controls!" ) ); + u.controlling_vehicle = false; + return; + } + } else { + if( veh->all_parts_with_feature( "REMOTE_CONTROLS", true ).empty() ) { + add_msg( m_info, _( "Can't drive this vehicle remotely. It has no working controls." ) ); + return; + } + } + + veh->pldrive( x, y ); +} + +static void open() +{ + player &u = g->u; + map &m = g->m; + + tripoint openp; + if( !choose_adjacent_highlight( _( "Open where?" ), openp, ACTION_OPEN ) ) { + return; + } + + u.moves -= 100; + + if( const optional_vpart_position vp = m.veh_at( openp ) ) { + vehicle *const veh = &vp->vehicle(); + int openable = veh->next_part_to_open( vp->part_index() ); + if( openable >= 0 ) { + const vehicle *player_veh = veh_pointer_or_null( m.veh_at( u.pos() ) ); + bool outside = !player_veh || player_veh != veh; + if( !outside ) { + veh->open( openable ); + } else { + // Outside means we check if there's anything in that tile outside-openable. + // If there is, we open everything on tile. This means opening a closed, + // curtained door from outside is possible, but it will magically open the + // curtains as well. + int outside_openable = veh->next_part_to_open( vp->part_index(), true ); + if( outside_openable == -1 ) { + const std::string name = veh->part_info( openable ).name(); + add_msg( m_info, _( "That %s can only opened from the inside." ), name.c_str() ); + u.moves += 100; + } else { + veh->open_all_at( openable ); + } + } + } else { + // If there are any OPENABLE parts here, they must be already open + if( const cata::optional already_open = vp.part_with_feature( "OPENABLE" ) ) { + const std::string name = veh->part_info( already_open->part_index() ).name(); + add_msg( m_info, _( "That %s is already open." ), name.c_str() ); + } + u.moves += 100; + } + return; + } + + bool didit = m.open_door( openp, !m.is_outside( u.pos() ) ); + + if( !didit ) { + const ter_str_id tid = m.ter( openp ).id(); + + if( m.has_flag( "LOCKED", openp ) ) { + add_msg( m_info, _( "The door is locked!" ) ); + return; + } else if( tid.obj().close ) { + // if the following message appears unexpectedly, the prior check was for t_door_o + add_msg( m_info, _( "That door is already open." ) ); + u.moves += 100; + return; + } + add_msg( m_info, _( "No door there." ) ); + u.moves += 100; + } +} + +static void close() +{ + tripoint closep; + if( choose_adjacent_highlight( _( "Close where?" ), closep, ACTION_CLOSE ) ) { + doors::close_door( g->m, g->u, closep ); + } +} + +static void handbrake() +{ + const optional_vpart_position vp = g->m.veh_at( g->u.pos() ); + if( !vp ) { + return; + } + vehicle *const veh = &vp->vehicle(); + add_msg( _( "You pull a handbrake." ) ); + veh->cruise_velocity = 0; + if( veh->last_turn != 0 && rng( 15, 60 ) * 100 < abs( veh->velocity ) ) { + veh->skidding = true; + add_msg( m_warning, _( "You lose control of %s." ), veh->name.c_str() ); + veh->turn( veh->last_turn > 0 ? 60 : -60 ); + } else { + int braking_power = abs( veh->velocity ) / 2 + 10 * 100; + if( abs( veh->velocity ) < braking_power ) { + veh->stop(); + } else { + int sgn = veh->velocity > 0 ? 1 : -1; + veh->velocity = sgn * ( abs( veh->velocity ) - braking_power ); + } + } + g->u.moves = 0; +} + +// Establish or release a grab on a vehicle +static void grab() +{ + player &u = g->u; + map &m = g->m; + + tripoint grabp( 0, 0, 0 ); + if( u.get_grab_type() != OBJECT_NONE ) { + if( const optional_vpart_position vp = m.veh_at( u.pos() + u.grab_point ) ) { + add_msg( _( "You release the %s." ), vp->vehicle().name ); + } else if( m.has_furn( u.pos() + u.grab_point ) ) { + add_msg( _( "You release the %s." ), m.furnname( u.pos() + u.grab_point ).c_str() ); + } + + u.grab( OBJECT_NONE ); + return; + } + + if( choose_adjacent( _( "Grab where?" ), grabp ) ) { + if( grabp == u.pos() ) { + add_msg( _( "You get a hold of yourself." ) ); + u.grab( OBJECT_NONE ); + return; + } + + if( const optional_vpart_position vp = m.veh_at( grabp ) ) { + u.grab( OBJECT_VEHICLE, grabp - u.pos() ); + add_msg( _( "You grab the %s." ), vp->vehicle().name ); + } else if( m.has_furn( grabp ) ) { // If not, grab furniture if present + if( m.furn( grabp ).obj().move_str_req < 0 ) { + add_msg( _( "You can not grab the %s" ), m.furnname( grabp ).c_str() ); + return; + } + u.grab( OBJECT_FURNITURE, grabp - u.pos() ); + if( !m.can_move_furniture( grabp, &u ) ) { + add_msg( _( "You grab the %s. It feels really heavy." ), m.furnname( grabp ).c_str() ); + } else { + add_msg( _( "You grab the %s." ), m.furnname( grabp ).c_str() ); + } + } else { // @todo: grab mob? Captured squirrel = pet (or meat that stays fresh longer). + add_msg( m_info, _( "There's nothing to grab there!" ) ); + } + } else { + add_msg( _( "Never mind." ) ); + } +} + +static void smash() +{ + player &u = g->u; + map &m = g->m; + + const int move_cost = !u.is_armed() ? 80 : u.weapon.attack_time() * 0.8; + bool didit = false; + ///\EFFECT_STR increases smashing capability + int smashskill = u.str_cur + u.weapon.damage_melee( DT_BASH ); + tripoint smashp; + + const bool allow_floor_bash = debug_mode; // Should later become "true" + if( !choose_adjacent( _( "Smash where?" ), smashp, allow_floor_bash ) ) { + return; + } + + bool smash_floor = false; + if( smashp.z != u.posz() ) { + if( smashp.z > u.posz() ) { + // TODO: Knock on the ceiling + return; + } + + smashp.z = u.posz(); + smash_floor = true; + } + + if( m.get_field( smashp, fd_web ) != nullptr ) { + m.remove_field( smashp, fd_web ); + sounds::sound( smashp, 2, "" ); + add_msg( m_info, _( "You brush aside some webs." ) ); + u.moves -= 100; + return; + } + + for( const auto &maybe_corpse : m.i_at( smashp ) ) { + if( maybe_corpse.is_corpse() && maybe_corpse.damage() < maybe_corpse.max_damage() && + maybe_corpse.get_mtype()->has_flag( MF_REVIVES ) ) { + // do activity forever. ACT_PULP stops itself + u.assign_activity( activity_id( "ACT_PULP" ), calendar::INDEFINITELY_LONG, 0 ); + u.activity.placement = smashp; + return; // don't smash terrain if we've smashed a corpse + } + } + + didit = m.bash( smashp, smashskill, false, false, smash_floor ).did_bash; + if( didit ) { + u.handle_melee_wear( u.weapon ); + u.moves -= move_cost; + const int mod_sta = ( ( u.weapon.weight() / 100_gram ) + 20 ) * -1; + u.mod_stat( "stamina", mod_sta ); + + if( u.get_skill_level( skill_melee ) == 0 ) { + u.practice( skill_melee, rng( 0, 1 ) * rng( 0, 1 ) ); + } + const int vol = u.weapon.volume() / units::legacy_volume_factor; + if( u.weapon.made_of( material_id( "glass" ) ) && + rng( 0, vol + 3 ) < vol ) { + add_msg( m_bad, _( "Your %s shatters!" ), u.weapon.tname().c_str() ); + for( auto &elem : u.weapon.contents ) { + m.add_item_or_charges( u.pos(), elem ); + } + sounds::sound( u.pos(), 24, "" ); + u.deal_damage( nullptr, bp_hand_r, damage_instance( DT_CUT, rng( 0, vol ) ) ); + if( vol > 20 ) { + // Hurt left arm too, if it was big + u.deal_damage( nullptr, bp_hand_l, damage_instance( DT_CUT, rng( 0, long( vol * .5 ) ) ) ); + } + u.remove_weapon(); + u.check_dead_state(); + } + if( smashskill < m.bash_resistance( smashp ) && one_in( 10 ) ) { + if( m.has_furn( smashp ) && m.furn( smashp ).obj().bash.str_min != -1 ) { + // %s is the smashed furniture + add_msg( m_neutral, _( "You don't seem to be damaging the %s." ), m.furnname( smashp ).c_str() ); + } else { + // %s is the smashed terrain + add_msg( m_neutral, _( "You don't seem to be damaging the %s." ), m.tername( smashp ).c_str() ); + } + } + } else { + add_msg( _( "There's nothing there to smash!" ) ); + } +} + +static void wait() +{ + std::map durations; + uimenu as_m; + + const bool has_watch = g->u.has_watch(); + const auto add_menu_item = [ &as_m, &durations, has_watch ] + ( int retval, int hotkey, const std::string &caption = "", + int duration = calendar::INDEFINITELY_LONG ) { + + std::string text( caption ); + + if( has_watch && duration != calendar::INDEFINITELY_LONG ) { + const std::string dur_str( to_string( time_duration::from_turns( duration ) ) ); + text += ( text.empty() ? dur_str : string_format( " (%s)", dur_str.c_str() ) ); + } + as_m.addentry( retval, true, hotkey, text ); + durations[retval] = duration; + }; + + add_menu_item( 1, '1', !has_watch ? _( "Wait 300 heartbeats" ) : "", MINUTES( 5 ) ); + add_menu_item( 2, '2', !has_watch ? _( "Wait 1800 heartbeats" ) : "", MINUTES( 30 ) ); + + if( has_watch ) { + add_menu_item( 3, '3', "", HOURS( 1 ) ); + add_menu_item( 4, '4', "", HOURS( 2 ) ); + add_menu_item( 5, '5', "", HOURS( 3 ) ); + add_menu_item( 6, '6', "", HOURS( 6 ) ); + } + + if( g->get_levz() >= 0 || has_watch ) { + const auto diurnal_time_before = []( const int turn ) { + const int remainder = turn % DAYS( 1 ) - calendar::turn % DAYS( 1 ); + return ( remainder > 0 ) ? remainder : DAYS( 1 ) + remainder; + }; + + add_menu_item( 7, 'd', _( "Wait till dawn" ), + diurnal_time_before( calendar::turn.sunrise() ) ); + add_menu_item( 8, 'n', _( "Wait till noon" ), diurnal_time_before( HOURS( 12 ) ) ); + add_menu_item( 9, 'k', _( "Wait till dusk" ), diurnal_time_before( calendar::turn.sunset() ) ); + add_menu_item( 10, 'm', _( "Wait till midnight" ), diurnal_time_before( HOURS( 0 ) ) ); + add_menu_item( 11, 'w', _( "Wait till weather changes" ) ); + } + + add_menu_item( 12, 'q', _( "Exit" ) ); + + as_m.text = ( has_watch ) ? string_format( _( "It's %s now. " ), + to_string_time_of_day( calendar::turn ) ) : ""; + as_m.text += _( "Wait for how long?" ); + as_m.return_invalid = true; + as_m.query(); /* calculate key and window variables, generate window, and loop until we get a valid answer */ + + if( as_m.ret == 12 || durations.count( as_m.ret ) == 0 ) { + return; + } + + activity_id actType = activity_id( as_m.ret == 11 ? "ACT_WAIT_WEATHER" : "ACT_WAIT" ); + + player_activity new_act( actType, 100 * ( durations[as_m.ret] - 1 ), 0 ); + + g->u.assign_activity( new_act, false ); +} + +static void sleep() +{ + player &u = g->u; + + uimenu as_m; + // Only accept valid input + as_m.return_invalid = false; + as_m.text = _( "Are you sure you want to sleep?" ); + // (Y)es/(S)ave before sleeping/(N)o + as_m.entries.emplace_back( uimenu_entry( 0, true, + ( get_option( "FORCE_CAPITAL_YN" ) ? 'Y' : 'y' ), + _( "Yes." ) ) ); + as_m.entries.emplace_back( uimenu_entry( 1, ( g->get_moves_since_last_save() ), + ( get_option( "FORCE_CAPITAL_YN" ) ? 'S' : 's' ), + _( "Yes, and save game before sleeping." ) ) ); + as_m.entries.emplace_back( uimenu_entry( 2, true, + ( get_option( "FORCE_CAPITAL_YN" ) ? 'N' : 'n' ), + _( "No." ) ) ); + + // List all active items, bionics or mutations so player can deactivate them + std::vector active; + for( auto &it : u.inv_dump() ) { + if( it->active && it->charges > 0 && it->is_tool_reversible() ) { + active.push_back( it->tname() ); + } + } + for( int i = 0; i < g->u.num_bionics(); i++ ) { + bionic const &bio = u.bionic_at_index( i ); + if( !bio.powered ) { + continue; + } + + // bio_alarm is useful for waking up during sleeping + // turning off bio_leukocyte has 'unpleasant side effects' + if( bio.id == bionic_id( "bio_alarm" ) || bio.id == bionic_id( "bio_leukocyte" ) ) { + continue; + } + + auto const &info = bio.info(); + if( info.power_over_time > 0 ) { + active.push_back( info.name ); + } + } + for( auto &mut : u.get_mutations() ) { + const auto &mdata = mut.obj(); + if( mdata.cost > 0 && u.has_active_mutation( mut ) ) { + active.push_back( mdata.name ); + } + } + std::stringstream data; + if( !active.empty() ) { + data << as_m.text << std::endl; + data << _( "You may want to deactivate these before you sleep." ) << std::endl; + data << " " << std::endl; + for( auto &a : active ) { + data << a << std::endl; + } + as_m.text = data.str(); + } + + /* Calculate key and window variables, generate window, + and loop until we get a valid answer. */ + as_m.query(); + + if( as_m.ret == 1 ) { + g->quicksave(); + } else if( as_m.ret == 2 ) { + return; + } + + /* Reuse menu to ask player whether they want to set an alarm. */ + bool can_hibernate = u.get_hunger() < -60 && u.has_active_mutation( trait_HIBERNATE ); + + as_m.reset(); + as_m.text = can_hibernate ? + _( "You're engorged to hibernate. The alarm would only attract attention. Set an alarm anyway?" ) : + _( "You have an alarm clock. Set an alarm?" ); + + if( u.has_alarm_clock() ) { + as_m.entries.emplace_back( uimenu_entry( 0, true, + ( get_option( "FORCE_CAPITAL_YN" ) ? 'N' : 'n' ), + _( "No, don't set an alarm." ) ) ); + + for( int i = 3; i <= 9; ++i ) { + as_m.entries.emplace_back( uimenu_entry( i, true, '0' + i, + string_format( _( "Set alarm to wake up in %i hours." ), i ) ) ); + } + } + + as_m.query(); + if( as_m.ret >= 3 && as_m.ret <= 9 ) { + u.add_effect( effect_alarm_clock, 1_hours * as_m.ret ); + } + + u.moves = 0; + u.try_to_sleep(); +} + +static void loot() +{ + enum ZoneFlags { + None = 1, + SortLoot = 2, + TillPlots = 4, + PlantPlots = 8 + }; + + auto just_one = []( int flags ) { + return flags && !( flags & ( flags - 1 ) ); + }; + + player &u = g->u; + int flags = 0; + const auto &mgr = zone_manager::get_manager(); + const bool has_hoe = u.has_quality( quality_id( "DIG" ), 1 ); + const bool has_seeds = u.has_item_with( []( const item & itm ) { + return itm.is_seed(); + } ); + + flags |= g->check_near_zone( zone_type_id( "LOOT_UNSORTED" ), u.pos() ) ? SortLoot : 0; + if( g->check_near_zone( zone_type_id( "FARM_PLOT" ), u.pos() ) ) { + flags |= TillPlots; + flags |= PlantPlots; + } + + if( flags == 0 ) { + add_msg( m_info, _( "There is no compatible zone nearby." ) ); + add_msg( m_info, _( "Compatible zones are %s and %s" ), + mgr.get_name_from_type( zone_type_id( "LOOT_UNSORTED" ) ), + mgr.get_name_from_type( zone_type_id( "FARM_PLOT" ) ) ); + return; + } + + if( !just_one( flags ) ) { + uimenu menu; + menu.text = _( "Pick action:" ); + menu.desc_enabled = true; + + if( flags & SortLoot ) { + menu.addentry_desc( SortLoot, true, 'o', _( "Sort out my loot" ), + _( "Sorts out the loot from Loot: Unsorted zone to nerby appropriate Loot zones. Uses empty space in your inventory or utilizes a cart, if you are holding one." ) ); + } + + if( flags & TillPlots ) { + menu.addentry_desc( TillPlots, has_hoe, 't', + has_hoe ? _( "Till farm plots" ) : _( "Till farm plots... you need a tool to dig with" ), + _( "Tills nearby Farm: Plot zones." ) ); + } + + if( flags & PlantPlots ) { + menu.addentry_desc( PlantPlots, warm_enough_to_plant() && has_seeds, 'p', + !warm_enough_to_plant() ? _( "Plant seeds... it is too cold for planting" ) : + !has_seeds ? _( "Plant seeds... you don't have any" ) : _( "Plant seeds" ), + _( "Plant seeds into nearby Farm: Plot zones. Farm plot has to be set to specific plant seed and you must have seeds in your inventory." ) ); + } + + menu.addentry( None, true, 'q', _( "Cancel" ) ); + + menu.query(); + flags = ( menu.ret >= 0 ) ? menu.ret : None; + } + + switch( flags ) { + case None: + add_msg( _( "Never mind." ) ); + break; + case SortLoot: + u.assign_activity( activity_id( "ACT_MOVE_LOOT" ) ); + break; + case TillPlots: + if( has_hoe ) { + u.assign_activity( activity_id( "ACT_TILL_PLOT" ) ); + } else { + add_msg( _( "You need a tool to dig with." ) ); + } + break; + case PlantPlots: + if( !warm_enough_to_plant() ) { + add_msg( m_info, _( "It is too cold to plant anything now." ) ); + } else if( !has_seeds ) { + add_msg( m_info, _( "You don't have any seeds." ) ); + } else { + u.assign_activity( activity_id( "ACT_PLANT_PLOT" ) ); + } + break; + default: + debugmsg( "Unsupported flag" ); + break; + } +} + +static void wear() +{ + player &u = g->u; + item_location loc = game_menus::inv::wear( u ); + + if( loc ) { + u.wear( u.i_at( loc.obtain( u ) ) ); + } else { + add_msg( _( "Never mind." ) ); + } +} + +static void takeoff() +{ + player &u = g->u; + item_location loc = game_menus::inv::take_off( u ); + + if( loc ) { + u.takeoff( u.i_at( loc.obtain( u ) ) ); + } else { + add_msg( _( "Never mind." ) ); + } +} + +static void read() +{ + player &u = g->u; + // Can read items from inventory or within one tile (including in vehicles) + auto loc = game_menus::inv::read( u ); + + if( loc ) { + u.read( loc.obtain( u ) ); + } else { + add_msg( _( "Never mind." ) ); + } +} + +static void fire() +{ + player &u = g->u; + + // Use vehicle turret or draw a pistol from a holster if unarmed + if( !u.is_armed() ) { + + const optional_vpart_position vp = g->m.veh_at( u.pos() ); + + turret_data turret; + // @todo: move direct turret firing from ACTION_FIRE to separate function. + if( vp && ( turret = vp->vehicle().turret_query( u.pos() ) ) ) { + switch( turret.query() ) { + case turret_data::status::no_ammo: + add_msg( m_bad, _( "The %s is out of ammo." ), turret.name().c_str() ); + break; + + case turret_data::status::no_power: + add_msg( m_bad, _( "The %s is not powered." ), turret.name().c_str() ); + break; + + case turret_data::status::ready: { + // if more than one firing mode provide callback to cycle through them + target_callback switch_mode; + if( turret.base()->gun_all_modes().size() > 1 ) { + switch_mode = [&turret]( item * obj ) { + obj->gun_cycle_mode(); + // currently gun modes do not change ammo but they may in the future + return turret.ammo_current() == "null" ? nullptr : + item::find_type( turret.ammo_current() ); + }; + } + + // if multiple ammo types available provide callback to cycle alternatives + target_callback switch_ammo; + if( turret.ammo_options().size() > 1 ) { + switch_ammo = [&turret]( item * ) { + const auto opts = turret.ammo_options(); + auto iter = opts.find( turret.ammo_current() ); + turret.ammo_select( ++iter != opts.end() ? *iter : *opts.begin() ); + return item::find_type( turret.ammo_current() ); + }; + } + + // callbacks for handling setup and cleanup of turret firing + firing_callback prepare_fire = [&u, &turret]( const int ) { + turret.prepare_fire( u ); + }; + firing_callback post_fire = [&u, &turret]( const int shots ) { + turret.post_fire( u, shots ); + }; + + targeting_data args = { + TARGET_MODE_TURRET_MANUAL, & *turret.base(), + turret.range(), 0, false, turret.ammo_data(), + switch_mode, switch_ammo, prepare_fire, post_fire + }; + u.set_targeting_data( args ); + g->plfire(); + + break; + } + + default: + debugmsg( "unknown turret status" ); + break; + } + return; + } + + if( vp.part_with_feature( "CONTROLS", true ) ) { + if( vp->vehicle().turrets_aim_and_fire() ) { + return; + } + } + + std::vector options( 1, _( "Cancel" ) ); + std::vector> actions( 1, [] {} ); + + for( auto &w : u.worn ) { + if( w.type->can_use( "holster" ) && !w.has_flag( "NO_QUICKDRAW" ) && + !w.contents.empty() && w.contents.front().is_gun() ) { + // draw (first) gun contained in holster + options.push_back( string_format( _( "%s from %s (%d)" ), + w.contents.front().tname().c_str(), + w.type_name().c_str(), + w.contents.front().ammo_remaining() ) ); + + actions.emplace_back( [&] { u.invoke_item( &w, "holster" ); } ); + + } else if( w.is_gun() && w.gunmod_find( "shoulder_strap" ) ) { + // wield item currently worn using shoulder strap + options.push_back( w.display_name() ); + actions.emplace_back( [&] { u.wield( w ); } ); + } + } + if( options.size() > 1 ) { + actions[( uimenu( false, _( "Draw what?" ), options ) ) - 1 ](); + } + } + + if( u.weapon.is_gun() && !u.weapon.gun_current_mode().melee() ) { + g->plfire( u.weapon ); + } else if( u.weapon.has_flag( "REACH_ATTACK" ) ) { + int range = u.weapon.has_flag( "REACH3" ) ? 3 : 2; + g->temp_exit_fullscreen(); + g->m.draw( g->w_terrain, u.pos() ); + std::vector trajectory; + trajectory = target_handler().target_ui( u, TARGET_MODE_REACH, &u.weapon, range ); + if( !trajectory.empty() ) { + u.reach_attack( trajectory.back() ); + } + g->draw_ter(); + wrefresh( g->w_terrain ); + g->reenter_fullscreen(); + } +} + +bool game::handle_action() +{ + std::string action; + input_context ctxt; + action_id act = ACTION_NULL; + // Check if we have an auto-move destination + if( u.has_destination() ) { + act = u.get_next_auto_move_direction(); + if( act == ACTION_NULL ) { + add_msg( m_info, _( "Auto-move canceled" ) ); + u.clear_destination(); + return false; + } + } else if( u.has_destination_activity() ) { + // starts destination activity after the player successfully reached his destination + u.start_destination_activity(); + return false; + } else { + // No auto-move, ask player for input + ctxt = get_player_input( action ); + } + + const optional_vpart_position vp = m.veh_at( u.pos() ); + bool veh_ctrl = !u.is_dead_state() && + ( ( vp && vp->vehicle().player_in_control( u ) ) || remoteveh() != nullptr ); + + // If performing an action with right mouse button, co-ordinates + // of location clicked. + tripoint mouse_target = tripoint_min; + + // quit prompt check (ACTION_QUIT only grabs 'Q') + if( uquit == QUIT_WATCH && action == "QUIT" ) { + uquit = QUIT_DIED; + return false; + } + + if( act == ACTION_NULL ) { + act = look_up_action( action ); + + if( act == ACTION_MAIN_MENU ) { + // No auto-move actions have or can be set at this point. + u.clear_destination(); + destination_preview.clear(); + act = handle_main_menu(); + if( act == ACTION_NULL ) { + return false; + } + } + + if( act == ACTION_ACTIONMENU ) { + // No auto-move actions have or can be set at this point. + u.clear_destination(); + destination_preview.clear(); + act = handle_action_menu(); + if( act == ACTION_NULL ) { + return false; + } +#ifdef __ANDROID__ + if( get_option( "ANDROID_ACTIONMENU_AUTOADD" ) && ctxt.get_category() == "DEFAULTMODE" ) { + add_best_key_for_action_to_quick_shortcuts( act, ctxt.get_category(), false ); + } +#endif + } + + if( can_action_change_worldstate( act ) ) { + user_action_counter += 1; + } + + if( act == ACTION_SELECT || act == ACTION_SEC_SELECT ) { + // Mouse button click + if( veh_ctrl ) { + // No mouse use in vehicle + return false; + } + + if( u.is_dead_state() ) { + // do not allow mouse actions while dead + return false; + } + + int mx = 0; + int my = 0; + if( !ctxt.get_coordinates( w_terrain, mx, my ) || !u.sees( tripoint( mx, my, u.posz() ) ) ) { + // Not clicked in visible terrain + return false; + } + mouse_target = tripoint( mx, my, u.posz() ); + + if( act == ACTION_SELECT ) { + // Note: The following has the potential side effect of + // setting auto-move destination state in addition to setting + // act. + if( !try_get_left_click_action( act, mouse_target ) ) { + return false; + } + } else if( act == ACTION_SEC_SELECT ) { + if( !try_get_right_click_action( act, mouse_target ) ) { + return false; + } + } + } else if( act != ACTION_TIMEOUT ) { + // act has not been set for an auto-move, so clearing possible + // auto-move destinations. Since initializing an auto-move with + // the mouse may span across multiple actions, we do not clear the + // auto-move destination if the action is only a timeout, as this + // would require the user to double click quicker than the + // timeout delay. + u.clear_destination(); + destination_preview.clear(); + } + } + + if( act == ACTION_NULL ) { + const input_event &&evt = ctxt.get_raw_input(); + if( !evt.sequence.empty() ) { + const long ch = evt.get_first_input(); + const std::string &&name = inp_mngr.get_keyname( ch, evt.type, true ); + if( !get_option( "NO_UNKNOWN_COMMAND_MSG" ) ) { + add_msg( m_info, _( "Unknown command: \"%s\" (%ld)" ), name, ch ); + } + } + return false; + } + + // This has no action unless we're in a special game mode. + gamemode->pre_action( act ); + + int soffset = get_option( "MOVE_VIEW_OFFSET" ); + int soffsetr = 0 - soffset; + + int before_action_moves = u.moves; + + // Use to track if auto-move should be canceled due to a failed + // move or obstacle + bool continue_auto_move = true; + + // These actions are allowed while deathcam is active. + if( uquit == QUIT_WATCH || !u.is_dead_state() ) { + switch( act ) { + case ACTION_CENTER: + u.view_offset.x = driving_view_offset.x; + u.view_offset.y = driving_view_offset.y; + break; + + case ACTION_SHIFT_N: + u.view_offset.y += soffsetr; + break; + + case ACTION_SHIFT_NE: + u.view_offset.x += soffset; + u.view_offset.y += soffsetr; + break; + + case ACTION_SHIFT_E: + u.view_offset.x += soffset; + break; + + case ACTION_SHIFT_SE: + u.view_offset.x += soffset; + u.view_offset.y += soffset; + break; + + case ACTION_SHIFT_S: + u.view_offset.y += soffset; + break; + + case ACTION_SHIFT_SW: + u.view_offset.x += soffsetr; + u.view_offset.y += soffset; + break; + + case ACTION_SHIFT_W: + u.view_offset.x += soffsetr; + break; + + case ACTION_SHIFT_NW: + u.view_offset.x += soffsetr; + u.view_offset.y += soffsetr; + break; + + case ACTION_LOOK: + look_around(); + break; + + default: + break; + } + } + + // actions allowed only while alive + if( !u.is_dead_state() ) { + switch( act ) { + case ACTION_NULL: + case NUM_ACTIONS: + break; // dummy entries + case ACTION_ACTIONMENU: + case ACTION_MAIN_MENU: + break; // handled above + + case ACTION_TIMEOUT: + if( check_safe_mode_allowed( false ) ) { + u.pause(); + } + break; + + case ACTION_PAUSE: + if( check_safe_mode_allowed() ) { + u.pause(); + } + break; + + case ACTION_TOGGLE_MOVE: + u.toggle_move_mode(); + break; + + case ACTION_MOVE_N: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( 0, -1 ); + } else if( veh_ctrl ) { + pldrive( 0, -1 ); + } else { + continue_auto_move = plmove( 0, -1 ); + } + break; + + case ACTION_MOVE_NE: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( 1, -1 ); + } else if( veh_ctrl ) { + pldrive( 1, -1 ); + } else { + continue_auto_move = plmove( 1, -1 ); + } + break; + + case ACTION_MOVE_E: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( 1, 0 ); + } else if( veh_ctrl ) { + pldrive( 1, 0 ); + } else { + continue_auto_move = plmove( 1, 0 ); + } + break; + + case ACTION_MOVE_SE: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( 1, 1 ); + } else if( veh_ctrl ) { + pldrive( 1, 1 ); + } else { + continue_auto_move = plmove( 1, 1 ); + } + break; + + case ACTION_MOVE_S: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( 0, 1 ); + } else if( veh_ctrl ) { + pldrive( 0, 1 ); + } else { + continue_auto_move = plmove( 0, 1 ); + } + break; + + case ACTION_MOVE_SW: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( -1, 1 ); + } else if( veh_ctrl ) { + pldrive( -1, 1 ); + } else { + continue_auto_move = plmove( -1, 1 ); + } + break; + + case ACTION_MOVE_W: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( -1, 0 ); + } else if( veh_ctrl ) { + pldrive( -1, 0 ); + } else { + continue_auto_move = plmove( -1, 0 ); + } + break; + + case ACTION_MOVE_NW: + if( !( u.get_value( "remote_controlling" ).empty() ) && ( ( u.has_active_item( "radiocontrol" ) ) || + ( u.has_active_bionic( bio_remote ) ) ) ) { + rcdrive( -1, -1 ); + } else if( veh_ctrl ) { + pldrive( -1, -1 ); + } else { + continue_auto_move = plmove( -1, -1 ); + } + break; + + case ACTION_MOVE_DOWN: + if( !u.in_vehicle ) { + vertical_move( -1, false ); + } + break; + + case ACTION_MOVE_UP: + if( !u.in_vehicle ) { + vertical_move( 1, false ); + } + break; + + case ACTION_OPEN: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't open things while you're in your shell." ) ); + } else { + open(); + } + break; + + case ACTION_CLOSE: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't close things while you're in your shell." ) ); + } else if( mouse_target != tripoint_min ) { + doors::close_door( m, u, mouse_target ); + } else { + close(); + } + break; + + case ACTION_SMASH: + if( veh_ctrl ) { + handbrake(); + } else if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't smash things while you're in your shell." ) ); + } else { + smash(); + } + break; + + case ACTION_EXAMINE: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't examine your surroundings while you're in your shell." ) ); + } else if( mouse_target != tripoint_min ) { + examine( mouse_target ); + } else { + examine(); + } + break; + + case ACTION_ADVANCEDINV: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't move mass quantities while you're in your shell." ) ); + } else { + advanced_inv(); + } + break; + + case ACTION_PICKUP: + Pickup::pick_up( u.pos(), 1 ); + break; + + case ACTION_GRAB: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't grab things while you're in your shell." ) ); + } else { + grab(); + } + break; + + case ACTION_BUTCHER: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't butcher while you're in your shell." ) ); + } else { + butcher(); + } + break; + + case ACTION_CHAT: + chat(); + break; + + case ACTION_PEEK: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't peek around corners while you're in your shell." ) ); + } else { + peek(); + } + break; + + case ACTION_LIST_ITEMS: + list_items_monsters(); + break; + + case ACTION_ZONES: + zones_manager(); + break; + + case ACTION_LOOT: + loot(); + break; + + case ACTION_INVENTORY: + game_menus::inv::common( u ); + break; + + case ACTION_COMPARE: + game_menus::inv::compare( u ); + break; + + case ACTION_ORGANIZE: + game_menus::inv::swap_letters( u ); + break; + + case ACTION_USE: + // Shell-users are presumed to be able to mess with their inventories, etc + // while in the shell. Eating, gear-changing, and item use are OK. + use_item(); + break; + + case ACTION_USE_WIELDED: + u.use_wielded(); + break; + + case ACTION_WEAR: + wear(); + break; + + case ACTION_TAKE_OFF: + takeoff(); + break; + + case ACTION_EAT: + eat(); + break; + + case ACTION_READ: + // Shell-users are presumed to have the book just at an opening and read it that way + read(); + break; + + case ACTION_WIELD: + wield(); + break; + + case ACTION_PICK_STYLE: + u.pick_style(); + break; + + case ACTION_RELOAD: + reload(); + break; + + case ACTION_UNLOAD: + unload(); + break; + + case ACTION_MEND: + mend(); + break; + + case ACTION_THROW: + plthrow(); + break; + + case ACTION_FIRE: + fire(); + break; + + case ACTION_FIRE_BURST: { + gun_mode_id original_mode = u.weapon.gun_get_mode_id(); + if( u.weapon.gun_set_mode( gun_mode_id( "AUTO" ) ) ) { + plfire( u.weapon ); + u.weapon.gun_set_mode( original_mode ); + } + break; + } + + case ACTION_SELECT_FIRE_MODE: + if( u.is_armed() ) { + u.weapon.gun_cycle_mode(); + } + break; + + case ACTION_DROP: + // You CAN drop things to your own tile while in the shell. + drop(); + break; + + case ACTION_DIR_DROP: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't drop things to another tile while you're in your shell." ) ); + } else { + drop_in_direction(); + } + break; + case ACTION_BIONICS: + u.power_bionics(); + refresh_all(); + break; + case ACTION_MUTATIONS: + u.power_mutations(); + refresh_all(); + break; + + case ACTION_SORT_ARMOR: + u.sort_armor(); + refresh_all(); + break; + + case ACTION_WAIT: + wait(); + break; + + case ACTION_CRAFT: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't craft while you're in your shell." ) ); + } else { + u.craft(); + } + break; + + case ACTION_RECRAFT: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't craft while you're in your shell." ) ); + } else { + u.recraft(); + } + break; + + case ACTION_LONGCRAFT: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't craft while you're in your shell." ) ); + } else { + u.long_craft(); + } + break; + + case ACTION_DISASSEMBLE: + if( u.controlling_vehicle ) { + add_msg( m_info, _( "You can't disassemble items while driving." ) ); + } else { + u.disassemble(); + refresh_all(); + } + break; + + case ACTION_CONSTRUCT: + if( u.in_vehicle ) { + add_msg( m_info, _( "You can't construct while in a vehicle." ) ); + } else if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't construct while you're in your shell." ) ); + } else { + construction_menu(); + } + break; + + case ACTION_SLEEP: + if( veh_ctrl ) { + add_msg( m_info, _( "Vehicle control has moved, %s" ), + press_x( ACTION_CONTROL_VEHICLE, _( "new binding is " ), + _( "new default binding is '^'." ) ).c_str() ); + } else { + sleep(); + } + break; + + case ACTION_CONTROL_VEHICLE: + if( u.has_active_mutation( trait_SHELL2 ) ) { + add_msg( m_info, _( "You can't operate a vehicle while you're in your shell." ) ); + } else { + control_vehicle(); + } + break; + + case ACTION_TOGGLE_SAFEMODE: + if( safe_mode == SAFE_MODE_OFF ) { + set_safe_mode( SAFE_MODE_ON ); + mostseen = 0; + add_msg( m_info, _( "Safe mode ON!" ) ); + } else { + turnssincelastmon = 0; + set_safe_mode( SAFE_MODE_OFF ); + add_msg( m_info, get_option( "AUTOSAFEMODE" ) + ? _( "Safe mode OFF! (Auto safe mode still enabled!)" ) : _( "Safe mode OFF!" ) ); + } + if( u.has_effect( effect_laserlocked ) ) { + u.remove_effect( effect_laserlocked ); + safe_mode_warning_logged = false; + } + break; + + case ACTION_TOGGLE_AUTOSAFE: { + auto &autosafemode_option = get_options().get_option( "AUTOSAFEMODE" ); + add_msg( m_info, autosafemode_option.value_as() + ? _( "Auto safe mode OFF!" ) : _( "Auto safe mode ON!" ) ); + autosafemode_option.setNext(); + break; + } + + case ACTION_IGNORE_ENEMY: + if( safe_mode == SAFE_MODE_STOP ) { + add_msg( m_info, _( "Ignoring enemy!" ) ); + for( auto &elem : new_seen_mon ) { + monster &critter = *elem; + critter.ignoring = rl_dist( u.pos(), critter.pos() ); + } + set_safe_mode( SAFE_MODE_ON ); + } else if( u.has_effect( effect_laserlocked ) ) { + add_msg( m_info, _( "Ignoring laser targeting!" ) ); + u.remove_effect( effect_laserlocked ); + safe_mode_warning_logged = false; + } + break; + + case ACTION_WHITELIST_ENEMY: + if( safe_mode == SAFE_MODE_STOP && !get_safemode().empty() ) { + get_safemode().add_rule( get_safemode().lastmon_whitelist, Creature::A_ANY, 0, RULE_WHITELISTED ); + add_msg( m_info, _( "Creature whitelisted: %s" ), get_safemode().lastmon_whitelist.c_str() ); + set_safe_mode( SAFE_MODE_ON ); + mostseen = 0; + } else { + get_safemode().show(); + } + break; + + case ACTION_QUIT: + if( query_yn( _( "Commit suicide?" ) ) ) { + if( query_yn( _( "REALLY commit suicide?" ) ) ) { + u.moves = 0; + u.place_corpse(); + uquit = QUIT_SUICIDE; + } + } + refresh_all(); + break; + + case ACTION_SAVE: + if( query_yn( _( "Save and quit?" ) ) ) { + if( save() ) { + u.moves = 0; + uquit = QUIT_SAVED; + } + } + refresh_all(); + break; + + case ACTION_QUICKSAVE: + quicksave(); + return false; + + case ACTION_QUICKLOAD: + quickload(); + return false; + + case ACTION_PL_INFO: + u.disp_info(); + refresh_all(); + break; + + case ACTION_MAP: + werase( w_terrain ); + ui::omap::display(); + break; + + case ACTION_MISSIONS: + list_missions(); + break; + + case ACTION_KILLS: + disp_kills(); + break; + + case ACTION_FACTIONS: + faction_manager_ptr->display(); + refresh_all(); + break; + + case ACTION_MORALE: + u.disp_morale(); + refresh_all(); + break; + + case ACTION_MESSAGES: + Messages::display_messages(); + refresh_all(); + break; + + case ACTION_HELP: + display_help(); + refresh_all(); + break; + + case ACTION_KEYBINDINGS: + ctxt.display_menu(); + refresh_all(); + break; + + case ACTION_OPTIONS: + get_options().show( true ); + refresh_all(); + break; + + case ACTION_AUTOPICKUP: + get_auto_pickup().show(); + refresh_all(); + break; + + case ACTION_SAFEMODE: + get_safemode().show(); + refresh_all(); + break; + + case ACTION_COLOR: + all_colors.show_gui(); + refresh_all(); + break; + + case ACTION_WORLD_MODS: + world_generator->show_active_world_mods( world_generator->active_world->active_mod_order ); + refresh_all(); + break; + + case ACTION_DEBUG: + if( MAP_SHARING::isCompetitive() && !MAP_SHARING::isDebugger() ) { + break; //don't do anything when sharing and not debugger + } + debug(); + refresh_all(); + break; + + case ACTION_TOGGLE_SIDEBAR_STYLE: + toggle_sidebar_style(); + break; + + case ACTION_TOGGLE_FULLSCREEN: + toggle_fullscreen(); + break; + + case ACTION_TOGGLE_PIXEL_MINIMAP: + toggle_pixel_minimap(); + break; + + case ACTION_TOGGLE_AUTO_PULP_BUTCHER: + get_options().get_option( "AUTO_PULP_BUTCHER" ).setNext(); + get_options().save(); + //~ Auto Pulp/Pulp Adjacent/Butcher is now ON/OFF + add_msg( string_format( _( "Auto %1$s is now %2$s." ), + get_options().get_option( "AUTO_PULP_BUTCHER_ACTION" ).getValueName(), + get_option( "AUTO_PULP_BUTCHER" ) ? _( "ON" ) : _( "OFF" ) ).c_str() ); + break; + + case ACTION_DISPLAY_SCENT: + if( MAP_SHARING::isCompetitive() && !MAP_SHARING::isDebugger() ) { + break; //don't do anything when sharing and not debugger + } + display_scent(); + break; + + case ACTION_TOGGLE_DEBUG_MODE: + if( MAP_SHARING::isCompetitive() && !MAP_SHARING::isDebugger() ) { + break; //don't do anything when sharing and not debugger + } + debug_mode = !debug_mode; + if( debug_mode ) { + add_msg( m_info, _( "Debug mode ON!" ) ); + } else { + add_msg( m_info, _( "Debug mode OFF!" ) ); + } + break; + + case ACTION_ZOOM_IN: + zoom_in(); + break; + + case ACTION_ZOOM_OUT: + zoom_out(); + break; + + case ACTION_ITEMACTION: + item_action_menu(); + break; + + case ACTION_AUTOATTACK: + autoattack(); + break; + + default: + break; + } + } + if( !continue_auto_move ) { + u.clear_destination(); + } + + gamemode->post_action( act ); + + u.movecounter = ( !u.is_dead_state() ? ( before_action_moves - u.moves ) : 0 ); + dbg( D_INFO ) << string_format( "%s: [%d] %d - %d = %d", action_ident( act ).c_str(), + int( calendar::turn ), before_action_moves, u.movecounter, u.moves ); + return ( !u.is_dead_state() ); +} diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 17bfda0a6ee57..d6b33ac262e96 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -1674,13 +1674,7 @@ std::vector iexamine::get_seed_entries( const std::vector &s */ int iexamine::query_seed( const std::vector &seed_entries ) { - uimenu smenu; - - // if true, it works fine for normal planting, but closes immediately if called - // from parent uimenu when adding new planting zone - // caused by inp_mngr.set_timeout( BLINK_SPEED ); - // Unify uimenu behavior #25178 will fix the issue, can be set to true, once PR is merged - smenu.return_invalid = false; + uilist smenu; smenu.text = _( "Use which seed?" ); int count = 0; @@ -1693,11 +1687,14 @@ int iexamine::query_seed( const std::vector &seed_entries ) smenu.addentry( count++, true, MENU_AUTOASSIGN, format.c_str(), seed_name.c_str(), seed_count ); } - smenu.addentry( count++, true, 'q', ( "%s" ), _( "Cancel" ) ); smenu.query(); - return smenu.ret; + if( smenu.ret >= 0 ) { + return smenu.ret; + } else { + return seed_entries.size(); + } } /** @@ -3672,6 +3669,19 @@ void iexamine::autodoc( player &p, const tripoint &examp ) } } +namespace sm_rack { + const int MIN_CHARCOAL = 100; + const int CHARCOAL_PER_LITER = 100; + const units::volume MAX_FOOD_VOLUME = units::from_liter( 20 ); +} + +static int get_charcoal_charges( units::volume food ) +{ + const int charcoal = to_liter( food ) * sm_rack::CHARCOAL_PER_LITER; + + return std::max( charcoal, sm_rack::MIN_CHARCOAL ); +} + void smoker_activate(player &p, const tripoint &examp) { furn_id cur_smoker_type = g->m.furn( examp ); @@ -3724,13 +3734,13 @@ void smoker_activate(player &p, const tripoint &examp) add_msg( _( "There is no charcoal in the rack." ) ); return; } - if( food_volume > units::from_liter( 20 ) ) { + if( food_volume > sm_rack::MAX_FOOD_VOLUME ) { add_msg( _( "This rack is overloaded with food, and it blocks the flow of smoke. Remove some and try again." ) ); - add_msg( string_format( _( "You think that you can load about %s %s in it." ), format_volume( units::from_liter( 20 ) ), volume_units_long() ) ); + add_msg( string_format( _( "You think that you can load about %s %s in it." ), format_volume( sm_rack::MAX_FOOD_VOLUME ), volume_units_long() ) ); return; } - long char_charges = 100 * to_liter( food_volume ) < 100 ? 100 : 100 * to_liter( food_volume ); + int char_charges = get_charcoal_charges( food_volume ); if( count_charges_in_list( charcoal->type, g->m.i_at( examp ) ) < char_charges ) { add_msg( _( "There is not enough charcoal in the rack to smoke this much food." ) ); @@ -3839,7 +3849,7 @@ void smoker_finalize(player &, const tripoint &examp) g->m.furn_set( examp, next_smoker_type ); } -void smoker_load_food( player &p, const tripoint &examp ) +void smoker_load_food( player &p, const tripoint &examp, units::volume remaining_capacity ) { std::vector comps; std::list moved; @@ -3903,21 +3913,26 @@ void smoker_load_food( player &p, const tripoint &examp ) } } + const int max_count_for_capacity = remaining_capacity / what->base_volume(); + const int max_count = std::min( count, max_count_for_capacity ); + // ... then ask how many to put it const std::string popupmsg = string_format(_("Insert how many %s into the rack?"), item::nname( what->typeId(), count ).c_str() ); long amount = string_input_popup() .title( popupmsg ) .width( 20 ) - .text( to_string( count ) ) + .text( to_string( max_count ) ) .only_digits( true ) .query_long(); if( amount == 0 ) { add_msg(m_info, _( "Never mind." ) ); return; - } - if( amount > count ) { + } else if( amount > count ) { + add_msg(m_info, _( "You don't have that many." ) ); + return; + } else if( amount > max_count_for_capacity ) { add_msg(m_info, _( "You can't place that many." ) ); return; } @@ -3969,13 +3984,15 @@ void iexamine::on_smoke_out( const tripoint &examp ) void iexamine::smoker_options( player &p, const tripoint &examp ) { - bool active = g->m.furn( examp ) == furn_str_id( "f_smoking_rack_active" ) ? true : false; + bool active = g->m.furn( examp ) == furn_str_id( "f_smoking_rack_active" ); auto items_here = g->m.i_at( examp ); + if( items_here.empty() && active ) { debugmsg( "f_smoking_rack_active was empty!" ); g->m.furn_set( examp, f_smoking_rack ); return; } + if( items_here.size() == 1 && items_here.begin()->typeId() == "fake_smoke_plume" ) { debugmsg( "f_smoking_rack_active was empty, and had fake_smoke_plume!" ); g->m.furn_set( examp, f_smoking_rack ); @@ -3988,18 +4005,14 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) time_duration time_left = 0; int hours_left = 0; int minutes_left = 0; - int char_quantity = 0; + units::volume f_volume = 0; bool f_check = false; - bool c_check = false; for( size_t i = 0; i < items_here.size(); i++ ) { auto &it = items_here[i]; if( it.is_food() ) { f_check = true; - } - if( it.typeId() == "charcoal" ) { - c_check = true; - char_quantity = count_charges_in_list( it.type, items_here ); + f_volume += it.volume(); } if( active && it.typeId() == "fake_smoke_plume" ) { time_left = time_duration::from_turns( it.item_counter ); @@ -4007,34 +4020,60 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) minutes_left = to_minutes( time_left ) + 1; } } - + + const bool empty = f_volume == 0; + const bool full = f_volume >= sm_rack::MAX_FOOD_VOLUME; + const auto remaining_capacity = sm_rack::MAX_FOOD_VOLUME - f_volume; + const auto has_coal_in_inventory = p.charges_of( "charcoal" ) > 0; + const auto coal_charges = count_charges_in_list( item::find_type( "charcoal" ), items_here ); + const auto need_charges = get_charcoal_charges( f_volume ); + const bool has_coal = coal_charges > 0; + const bool has_enough_coal = coal_charges >= need_charges; + uimenu smenu; smenu.text = _( "What to do with the smoking rack:" ); smenu.return_invalid = true; - smenu.addentry( 0, true, 'i', "%s", _( "Inspect smoking rack" ) ); - if( active ) { - smenu.addentry( 1, false, 'l', "%s", _( "Light up and smoke food (lit & smoking)" ) ); - } else { - smenu.addentry( 1, true, 'l', "%s", _( "Light up and smoke food" ) ); - } + smenu.desc_enabled = true; - smenu.addentry( 2, true, 'f', "%s", _( "Insert food for smoking" ) ); - smenu.addentry( 3, true, 'r', "%s", _( "Reload with charcoal" ) ); + smenu.addentry( 0, true, 'i', _( "Inspect smoking rack" ) ); - if( f_check ) { - smenu.addentry( 4, true, 'e', "%s", _( "Remove food from rack" ) ); - } else { - smenu.addentry( 4, false, 'e', "%s", _( "Remove food from rack (none inside)" ) ); - } - if( c_check ) { - smenu.addentry( 5, true, 'c', "%s", _( "Remove charcoal from rack; has: " ) + std::to_string( char_quantity ) ); + if( !active ) { + smenu.addentry_desc( 1, !empty && has_enough_coal, 'l', + empty ? _( "Light up and smoke food... insert some food for smoking first" ) : + !has_enough_coal ? string_format( _( "Light up and smoke food... need extra %d charges of charcoal" ), + need_charges - coal_charges ) : + _( "Light up and smoke food" ), + _( "Light up the smoking rack and start smoking. Smoking will take about 6 hours." ) ); + + smenu.addentry_desc( 2, !full, 'f', + full ? _( "Insert food for smoking... smoking rack is full" ) : + string_format( _( "Insert food for smoking... remaining capacity is %s %s" ), + format_volume( remaining_capacity ), volume_units_abbr() ), + _( "Fill the smoking rack with raw meat, fish or sausages for smoking or fruit or vegetable or smoked meat for drying." ) ); + + if( f_check ) { + smenu.addentry( 4, f_check, 'e', _( "Remove food from smoking rack" ) ); + } + + smenu.addentry_desc( 3, has_coal_in_inventory, 'r', + !has_coal_in_inventory ? _( "Reload with charcoal... you don't have any" ) : + _( "Reload with charcoal" ), + string_format( _( "You need %d charges of charcoal for %s %s of food. Minimal amount of charcoal is %d charges." ), + sm_rack::CHARCOAL_PER_LITER, format_volume( 1000_ml ), volume_units_long(), sm_rack::MIN_CHARCOAL ) ); } else { - smenu.addentry( 5, false, 'c', "%s", _( "Remove charcoal from rack (none inside)" ) ); + smenu.addentry_desc( 7, true, 'x', + _( "Quench burning charcoal" ), + _( "Quenching will stop smoking process, but also destroy all used charcoal." ) ); } - if ( active ) { - smenu.addentry( 7, true, 'q', "%s", _( "Quench burning charcoal" ) ); + + if( has_coal ) { + smenu.addentry( 5, true, 'c', + active ? string_format( _( "Rake out %d excess charges of charcoal from smoking rack" ), coal_charges ) : + string_format( _( "Remove %d charges of charcoal from smoking rack" ), coal_charges ) ); } - smenu.addentry( 6, true, 'x', "%s", _( "Cancel" ) ); + + smenu.addentry( 6, true, 'q', "%s", _( "Cancel" ) ); + smenu.query(); switch( smenu.ret ) { @@ -4061,13 +4100,13 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) pop << "... that it is empty."; } else { for( size_t i = 0; i < items_here.size(); i++ ) { - auto &it = items_here[i]; - if ( it.typeId() == "fake_smoke_plume" ) { - pop << "\n " << "" << _( "You see some smoldering embers there." ) << "" << "\n "; - continue; - } - pop << "-> " << it.nname( it.typeId(), count_charges_in_list( it.type, items_here ) ); - pop << " (" << std::to_string( count_charges_in_list( it.type, items_here ) ) << ") \n "; + auto &it = items_here[i]; + if( it.typeId() == "fake_smoke_plume" ) { + pop << "\n " << "" << _( "You see some smoldering embers there." ) << "" << "\n "; + continue; + } + pop << "-> " << it.nname( it.typeId(), it.charges ); + pop << " (" << std::to_string( it.charges ) << ") \n "; } } popup( pop.str(), PF_NONE ); @@ -4083,7 +4122,7 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) } break; case 2: // load food - smoker_load_food( p, examp ); + smoker_load_food( p, examp, remaining_capacity ); break; case 3: // load charcoal reload_furniture( p, examp ); @@ -4096,10 +4135,13 @@ void iexamine::smoker_options( player &p, const tripoint &examp ) for( size_t i = 0; i < items_here.size(); i++ ) { auto &it = items_here[i]; if( ( rem_f_opt && it.is_food() ) || ( !rem_f_opt && ( it.typeId() == "charcoal" ) ) ) { + // get handling cost before the item reference is invalidated + const int handling_cost = -p.item_handling_cost( it ); + add_msg( _("You remove %s from the rack."), it.tname().c_str() ); g->m.add_item_or_charges( p.pos(), it ); g->m.i_rem( examp, i ); - p.mod_moves( -p.item_handling_cost( it ) ); + p.mod_moves( handling_cost ); i--; } } diff --git a/src/init.cpp b/src/init.cpp index 9d6983f0c0b96..11477f180d0ca 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -65,6 +65,7 @@ #include "anatomy.h" #include "loading_ui.h" #include "recipe_groups.h" +#include "mod_tileset.h" #include #include @@ -90,14 +91,16 @@ DynamicDataLoader &DynamicDataLoader::get_instance() return theDynamicDataLoader; } -void DynamicDataLoader::load_object( JsonObject &jo, const std::string &src ) +void DynamicDataLoader::load_object( JsonObject &jo, const std::string &src, + const std::string &base_path, + const std::string &full_path ) { std::string type = jo.get_string( "type" ); t_type_function_map::iterator it = type_function_map.find( type ); if( it == type_function_map.end() ) { jo.throw_error( "unrecognized JSON object", "type" ); } - it->second( jo, src ); + it->second( jo, src, base_path, full_path ); } void DynamicDataLoader::load_deferred( deferred_json &data ) @@ -139,7 +142,8 @@ void load_ignored_type( JsonObject &jo ) } void DynamicDataLoader::add( const std::string &type, - std::function f ) + std::function + f ) { const auto pair = type_function_map.emplace( type, f ); if( !pair.second ) { @@ -147,9 +151,22 @@ void DynamicDataLoader::add( const std::string &type, } } +void DynamicDataLoader::add( const std::string &type, + std::function f ) +{ + const auto pair = type_function_map.emplace( type, [f]( JsonObject & obj, const std::string & src, + const std::string &, const std::string & ) { + f( obj, src ); + } ); + if( !pair.second ) { + debugmsg( "tried to insert a second handler for type %s into the DynamicDataLoader", type.c_str() ); + } +} + void DynamicDataLoader::add( const std::string &type, std::function f ) { - const auto pair = type_function_map.emplace( type, [f]( JsonObject & obj, const std::string & ) { + const auto pair = type_function_map.emplace( type, [f]( JsonObject & obj, const std::string &, + const std::string &, const std::string & ) { f( obj ); } ); if( !pair.second ) { @@ -337,6 +354,12 @@ void DynamicDataLoader::initialize() add( "body_part", &body_part_struct::load_bp ); add( "anatomy", &anatomy::load_anatomy ); add( "morale_type", &morale_type_data::load_type ); +#if defined(TILES) + add( "mod_tileset", &load_mod_tileset ); +#else + // Dummy function + add( "mod_tileset", []( JsonObject &, const std::string & ) { } ); +#endif } void DynamicDataLoader::load_data_from_path( const std::string &path, const std::string &src, @@ -374,19 +397,20 @@ void DynamicDataLoader::load_data_from_path( const std::string &path, const std: try { // parse it JsonIn jsin( iss ); - load_all_from_json( jsin, src, ui ); + load_all_from_json( jsin, src, ui, path, file ); } catch( const JsonError &err ) { throw std::runtime_error( file + ": " + err.what() ); } } } -void DynamicDataLoader::load_all_from_json( JsonIn &jsin, const std::string &src, loading_ui & ) +void DynamicDataLoader::load_all_from_json( JsonIn &jsin, const std::string &src, loading_ui &, + const std::string &base_path, const std::string &full_path ) { if( jsin.test_object() ) { // find type and dispatch single object JsonObject jo = jsin.get_object(); - load_object( jo, src ); + load_object( jo, src, base_path, full_path ); jo.finish(); // if there's anything else in the file, it's an error. jsin.eat_whitespace(); @@ -398,7 +422,7 @@ void DynamicDataLoader::load_all_from_json( JsonIn &jsin, const std::string &src // find type and dispatch each object until array close while( !jsin.end_array() ) { JsonObject jo = jsin.get_object(); - load_object( jo, src ); + load_object( jo, src, base_path, full_path ); jo.finish(); } } else { @@ -464,6 +488,7 @@ void DynamicDataLoader::unload_data() body_part_struct::reset(); npc_template::reset(); anatomy::reset(); + reset_mod_tileset(); // TODO: // Name::clear(); diff --git a/src/init.h b/src/init.h index c3faea3155539..73498d199f24a 100644 --- a/src/init.h +++ b/src/init.h @@ -53,7 +53,7 @@ class DynamicDataLoader { public: typedef std::string type_string; - typedef std::map> + typedef std::map> t_type_function_map; typedef std::vector str_vec; @@ -74,6 +74,9 @@ class DynamicDataLoader t_type_function_map type_function_map; void add( const std::string &type, std::function f ); void add( const std::string &type, std::function f ); + void add( const std::string &type, + std::function + f ); /** * Load all the types from that json data. * @param jsin Might contain single object, @@ -83,14 +86,17 @@ class DynamicDataLoader * @param ui Finalization status display. * @throws std::exception on all kind of errors. */ - void load_all_from_json( JsonIn &jsin, const std::string &src, loading_ui &ui ); + void load_all_from_json( JsonIn &jsin, const std::string &src, loading_ui &ui, + const std::string &base_path, const std::string &full_path ); /** * Load a single object from a json object. * @param jo The json object to load the C++-object from. * @param src String identifier for mod this data comes from * @throws std::exception on all kind of errors. */ - void load_object( JsonObject &jo, const std::string &src ); + void load_object( JsonObject &jo, const std::string &src, + const std::string &base_path = std::string(), + const std::string &full_path = std::string() ); DynamicDataLoader(); ~DynamicDataLoader(); diff --git a/src/item.cpp b/src/item.cpp index 4a3ac7e73509a..20e875643f023 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -890,12 +890,10 @@ std::string item::info( std::vector &info, const iteminfo_query *parts to_turns( food->rot ), true, "", true, true ) ); info.push_back( iteminfo( "BASE", space + _( "max rot: " ), "", to_turns( food->type->comestible->spoils ), true, "", true, true ) ); - info.push_back( iteminfo( "BASE", space + _( "fridge: " ), "", - to_turn( food->fridge ), true, "", true, true ) ); - info.push_back( iteminfo( "BASE", space + _( "freezer: " ), "", - to_turn( food->freezer ), true, "", true, true ) ); info.push_back( iteminfo( "BASE", _( "last rot: " ), "", to_turn( food->last_rot_check ), true, "", true, true ) ); + info.push_back( iteminfo( "BASE", _( "last temp: " ), "", + to_turn( food->last_temp_check ), true, "", true, true ) ); } if( food->item_tags.count( "HOT" ) ) { info.push_back( iteminfo( "BASE", _( "HOT: " ), "", @@ -924,8 +922,8 @@ std::string item::info( std::vector &info, const iteminfo_query *parts if( food_item != nullptr ) { if( g->u.nutrition_for( *food_item ) != 0 || food_item->type->comestible->quench != 0 ) { if( parts->test( iteminfo_parts::FOOD_NUTRITION ) ) - info.push_back( iteminfo( "FOOD", _( "Nutrition: " ), "", - g->u.nutrition_for( *food_item ), + info.push_back( iteminfo( "FOOD", _( "Calories (kcal): " ), "", + g->u.nutrition_for( *food_item ) * islot_comestible::kcal_per_nutr, true, "", false, true ) ); if( parts->test( iteminfo_parts::FOOD_QUENCH ) ) { info.push_back( iteminfo( "FOOD", space + _( "Quench: " ), "", @@ -1019,7 +1017,7 @@ std::string item::info( std::vector &info, const iteminfo_query *parts "It's on a brink of becoming inedible." ) ); } } - if( food_item->has_flag( "NO_FREEZE" ) && !food_item->rotten() && + if( food_item->has_flag( "FREEZERBURN" ) && !food_item->rotten() && !food_item->has_flag( "MUSHY" ) ) { info.emplace_back( "DESCRIPTION", _( "* Quality of this food suffers when it's frozen, and it will become mushy after thawing out.." ) ); @@ -3265,8 +3263,6 @@ void item::set_relative_rot( double val ) // calc_rot uses last_rot_check (when it's not time_of_cataclysm) instead of bday. // this makes sure the rotting starts from now, not from bday. last_rot_check = calendar::turn; - fridge = calendar::before_time_starts; - freezer = calendar::before_time_starts; active = true; } } @@ -3303,11 +3299,24 @@ int item::spoilage_sort_order() void item::calc_rot( const tripoint &location ) { + // Avoid needlessly calculating already rotten things. Corpses should + // always rot away and food rots away at twice the shelf life. If the food + // is in a sealed container they won't rot away, this avoids needlessly + // calculating their rot in that case. + if( !is_corpse() && get_relative_rot() > 2.0 ) { + return; + } + const time_point now = calendar::turn; if( now - last_rot_check > 10_turns ) { const time_point since = last_rot_check == calendar::time_of_cataclysm ? bday : last_rot_check; - time_point until = fridge != calendar::before_time_starts ? fridge : now; - until = freezer != calendar::before_time_starts ? freezer : now; + + last_rot_check = now; + + // Frozen food do not rot, so no change to rot variable + if( item_tags.count( "FROZEN" ) ) { + return; + } // rot modifier float factor = 1.0; @@ -3324,21 +3333,13 @@ void item::calc_rot( const tripoint &location ) rot += factor * rng( -spoil_variation, spoil_variation ); } - if( since < until ) { - // rot (outside of fridge/freezer) from bday/last_rot_check until fridge/freezer/now - rot += factor * get_rot_since( since, until, location ); + if( item_tags.count( "COLD" ) ) { + rot += factor * ( ( now - since ) / 1_hours * + get_hourly_rotpoints_at_temp( temperatures::fridge ) * 1_turns ) ; + } else { + rot += factor * get_rot_since( since, now, location ); } - last_rot_check = now; - if( freezer != calendar::before_time_starts ) { - // Frozen food do not rot, so no change to rot variable - freezer = calendar::before_time_starts; - } - if( fridge != calendar::before_time_starts ) { - rot += factor * ( now - fridge ) / 1_hours * get_hourly_rotpoints_at_temp( - FRIDGE_TEMPERATURE ) * 1_turns; - fridge = calendar::before_time_starts; - } } } @@ -3884,6 +3885,11 @@ const std::vector &item::made_of() const return type->materials; } +const std::map &item::quality_of() const +{ + return type->qualities; +} + std::vector item::made_of_types() const { std::vector material_types_composed_of; @@ -5923,59 +5929,200 @@ bool item::needs_processing() const int item::processing_speed() const { - if( is_food() && !( item_tags.count( "HOT" ) || item_tags.count( "COLD" ) || - item_tags.count( "FROZEN" ) ) ) { - // Hot and cold food need turn-by-turn updates. - // If they ever become a performance problem, update process_food to handle them occasionally. - return 600; - } else if( is_food() ) { - return 100; - } - if( is_corpse() ) { + if( is_corpse() || is_food() || is_food_container() ) { return 100; } // Unless otherwise indicated, update every turn. return 1; } -bool item::process_food( player * /*carrier*/, const tripoint &pos ) +void item::apply_freezerburn() { - calc_rot( g->m.getabs( pos ) ); - if( item_tags.count( "HOT" ) && item_counter == 0 ) { - item_tags.erase( "HOT" ); + if( !item_tags.count( "FROZEN" ) ) { + return; } - if( item_tags.count( "COLD" ) && item_counter == 0 ) { - item_tags.erase( "COLD" ); + item_tags.erase( "FROZEN" ); + + if( !has_flag( "FREEZERBURN" ) ) { + return; } - if( item_tags.count( "FROZEN" ) && item_counter == 0 ) { - item_tags.erase( "FROZEN" ); - if( has_flag( "NO_FREEZE" ) && !rotten() ) { - item_tags.insert( "MUSHY" ); - } else if( has_flag( "NO_FREEZE" ) && has_flag( "MUSHY" ) && - rot < type->comestible->spoils ) { - rot = type->comestible->spoils; - } - item_tags.insert( "COLD" ); - item_counter = 600; + if( !item_tags.count( "MUSHY" ) ) { + item_tags.insert( "MUSHY" ); + } else { + set_relative_rot( 1.01 ); } - // deep freezing kills parasites but not instantly - if( item_tags.count( "FROZEN" ) > 0 && item_counter > 500 && type->comestible->parasites > 0 ) { - item_tags.insert( "NO_PARASITES" ); +} + +static int temp_difference_ratio( const int temp_one, const int temp_two ) +{ + return std::max( abs( temp_one - temp_two ) / 5, ( 1 ) ); +} + +void item::update_temp( const int temp, const float insulation ) +{ + const time_point now = calendar::turn; + const time_duration dur = now - last_temp_check; + + // if player debug menu'd the time backward it breaks stuff, just reset the + // last_temp_check in this case + if( dur < 0_turns ) { + last_temp_check = now; + return; } - // minimum is 0 - takes into account that process() takes --1 counter per turn regardless - const auto temp = g->get_temperature( pos ); - unsigned int diff_freeze = temp_difference_ratio( temp, FREEZING_TEMPERATURE ) - 1; //effective 1-4 - unsigned int diff_cold = temp_difference_ratio( temp, FRIDGE_TEMPERATURE ) - 1; + // only process temperature at most every 10_turns, note we're also gated + // by item::processing_speed + if( dur > 10_turns ) { + calc_temp( temp, insulation, dur ); + last_temp_check = now; + } +} + +void item::calc_temp( const int temp, const float insulation, const time_duration &time ) +{ + const int freeze_point = type->comestible->freeze_point; + bool is_hot = item_tags.count( "HOT" ); + bool is_cold = item_tags.count( "COLD" ); + bool is_frozen = item_tags.count( "FROZEN" ); + int loop_diff = 0; + int diff = temp <= freeze_point || is_frozen ? + temp_difference_ratio( temp, freeze_point ) : + temp_difference_ratio( temp, temperatures::cold ); + diff *= to_turns( time ); + diff /= std::max( insulation, static_cast( 0.1 ) ); + // no matter how much insulation temperature will shift at least a 1 degree + // every ten turns if less than cold + diff = std::max( diff, 1 ); + + do { + // process diff in chunks of 600 because that's the barrier at which a + // something can become frozen or cold + loop_diff = std::min( 600, diff ); + if( diff >= 600 ) { + diff -= 600; + } else { + diff = 0; + } + + if( is_hot ) { + // for now a hot item can only ever cool off + item_counter -= loop_diff; + if( item_counter <= 0 ) { + item_tags.erase( "HOT" ); + // if current temp is less than cold, start ticking + // item_counter for cold, otherwise we're done because item + // cannot cool further + if( temp < temperatures::cold ) { + item_counter = -item_counter; + } else { + item_counter = 0; + return; + } + is_hot = false; + } + } else if( is_cold ) { + if( temp <= temperatures::cold ) { + item_counter += loop_diff; + if( item_counter > 600 ) { + if( temp <= freeze_point ) { + // if temp is colder than freeze point start ticking frozen + item_tags.erase( "COLD" ); + item_tags.insert( "FROZEN" ); + item_counter -= 600; + is_cold = false; + is_frozen = true; + } else { + // if temp is warmer than freezing, cold counter cannot + // exceed 600 and we're done here because item cannot cool + // off any further + item_counter = 600; + return; + } + } + } else { + item_counter -= loop_diff; + // if item is cold and counter is decreasing, we can only be in a + // warmer temp, so we're done if it's less than zero, if it's + // greater than 600 that means we're still cooling off and need to + // transition to frozen. + if( item_counter <= 0 ) { + item_tags.erase( "COLD" ); + item_counter = 0; + return; + } + } + } else if( is_frozen ) { + if( temp <= freeze_point ) { + item_counter += loop_diff; + if( item_counter > 500 && type->comestible->parasites > 0 ) { + item_tags.insert( "NO_PARASITES" ); + } + + // counter cannot exceed 600 as frozen, if it does we know + // we're done because item is cooling down and cannot cool any + // further + if( item_counter > 600 ) { + item_counter = 600; + return; + } + } else { + item_counter -= loop_diff; + // item is defrosting + if( item_counter <= 0 ) { + apply_freezerburn(); // removes frozen tag and applies mushy/rot if needed + item_tags.insert( "COLD" ); + item_counter += 600; + is_frozen = false; + is_cold = true; + } + } + } else if( temp <= temperatures::cold ) { + // see if we need to add a cold tag + item_counter += loop_diff; + if( item_counter > 600 ) { + item_tags.insert( "COLD" ); + item_counter -= 600; + is_cold = true; + } + } else { + // no tags yet and temp is warming + item_counter -= loop_diff; + // negative item_counter without a tag doesn't compute yet + // we're done in this case + // TODO make it warm/hot? + if( item_counter < 0 ) { + item_counter = 0; + return; + } + } + } while( loop_diff > 0 || item_counter < 0 || item_counter > 600 ); +} + +void item::heat_up() +{ + item_tags.erase( "COLD" ); + item_tags.erase( "FROZEN" ); + item_tags.insert( "HOT" ); + // links the amount of heat an item can retain to its mass + item_counter = clamp( to_gram( weight() ), 100, 600 );; + reset_temp_check(); +} + +void item::reset_temp_check() +{ + last_temp_check = calendar::turn; +} - // environment temperature applies COLD/FROZEN - if( temp <= FRIDGE_TEMPERATURE ) { - g->m.apply_in_fridge( *this, temp ); - } else if( item_tags.count( "FROZEN" ) > 0 && item_counter > diff_freeze ) { - item_counter -= diff_freeze; // thaw - } else if( item_tags.count( "COLD" ) > 0 && item_counter > diff_cold ) { - item_counter -= diff_cold; // get warm +bool item::process_food( const player *carrier, const tripoint &p, int temp, float insulation ) +{ + if( carrier != nullptr && carrier->has_item( *this ) ) { + temp += 5; // body heat increases inventory temperature + insulation *= 1.5; // clothing provides inventory some level of insulation } + + // temperature can affect rot, so do it first + update_temp( temp, insulation ); + calc_rot( p ); return false; } @@ -6236,6 +6383,16 @@ bool item::process_tool( player *carrier, const tripoint &pos ) } bool item::process( player *carrier, const tripoint &pos, bool activate ) +{ + if( is_food() || is_food_container() ) { + return process( carrier, pos, activate, g->get_temperature( pos ), 1 ); + } else { + return process( carrier, pos, activate, 0, 1 ); + } +} + +bool item::process( player *carrier, const tripoint &pos, bool activate, int temp, + float insulation ) { const bool preserves = type->container && type->container->preserves; for( auto it = contents.begin(); it != contents.end(); ) { @@ -6244,7 +6401,7 @@ bool item::process( player *carrier, const tripoint &pos, bool activate ) // is not changed, the item is still fresh. it->last_rot_check = calendar::turn; } - if( it->process( carrier, pos, activate ) ) { + if( it->process( carrier, pos, activate, temp, type->insulation_factor * insulation ) ) { it = contents.erase( it ); } else { ++it; @@ -6266,7 +6423,7 @@ bool item::process( player *carrier, const tripoint &pos, bool activate ) return false; } - if( item_counter > 0 ) { + if( !is_food() && item_counter > 0 ) { item_counter--; } @@ -6284,7 +6441,7 @@ bool item::process( player *carrier, const tripoint &pos, bool activate ) if( has_flag( "FAKE_SMOKE" ) && process_fake_smoke( carrier, pos ) ) { return true; } - if( is_food() && process_food( carrier, pos ) ) { + if( is_food() && process_food( carrier, pos, temp, insulation ) ) { return true; } if( is_corpse() && process_corpse( carrier, pos ) ) { diff --git a/src/item.h b/src/item.h index 3178d6c81e8df..97b7431de23ef 100644 --- a/src/item.h +++ b/src/item.h @@ -640,6 +640,19 @@ class item : public visitable */ void calc_rot( const tripoint &p ); + /** + * Update temperature item_counters for things like food + * @param temp Temperature at which item is current exposed + * @param insulation Amount of insulation item has from surroundings + */ + void update_temp( const int temp, const float insulation ); + + /** Apply heat to this item, amount of heat will be based on item weight */ + void heat_up(); + + /** reset the last_temp_check used when crafting new items and the like */ + void reset_temp_check(); + /** whether an item is perishable (can rot) */ bool goes_bad() const; @@ -680,6 +693,9 @@ class item : public visitable return get_relative_rot() > 2.0; } + /** remove frozen tag and if it takes freezerburn, applies mushy/rotten */ + void apply_freezerburn(); + private: /** * Accumulated rot, expressed as time the item has been in standard temperature. @@ -690,17 +706,21 @@ class item : public visitable /** Time when the rot calculation was last performed. */ time_point last_rot_check = calendar::time_of_cataclysm; + /** + * Calculate temperature differential and handle FROZEN/COLD/HOT states + * @param temp Temperature of surroundings + * @param insulation Amount of insulation item has + * @param time Duration of time at which to process at temperature + */ + void calc_temp( const int temp, const float insulation, const time_duration &time ); + + /** the last time the temperature was updated for this item */ + time_point last_temp_check = calendar::time_of_cataclysm; public: time_duration get_rot() const { return rot; } - /** Turn item was put into a fridge or calendar::before_time_starts if not in any fridge. */ - time_point fridge = calendar::before_time_starts; - - /** Turn item was put into a freezer or calendar::before_time_starts if not in any freezer. */ - time_point freezer = calendar::before_time_starts; - /** Time for this item to be fully fermented. */ time_duration brewing_time() const; /** The results of fermenting this item. */ @@ -747,6 +767,10 @@ class item : public visitable * The returned vector does not contain the null id. */ const std::vector &made_of() const; + /** + * The ids of all the qualities this contains. + */ + const std::map &quality_of() const; /** * Same as @ref made_of(), but returns the @ref material_type directly. */ @@ -907,11 +931,12 @@ class item : public visitable * Returns false if the item is not destroyed. */ bool process( player *carrier, const tripoint &pos, bool activate ); + bool process( player *carrier, const tripoint &pos, bool activate, int temp, float insulation ); protected: // Sub-functions of @ref process, they handle the processing for different // processing types, just to make the process function cleaner. // The interface is the same as for @ref process. - bool process_food( player *carrier, const tripoint &pos ); + bool process_food( const player *carrier, const tripoint &p, int temp, float insulation ); bool process_corpse( player *carrier, const tripoint &pos ); bool process_wet( player *carrier, const tripoint &pos ); bool process_litcig( player *carrier, const tripoint &pos ); @@ -920,7 +945,6 @@ class item : public visitable bool process_cable( player *carrier, const tripoint &pos ); bool process_tool( player *carrier, const tripoint &pos ); public: - /** * Gets the point (vehicle tile) the cable is connected to. * Returns tripoint_min if not connected to anything. @@ -1743,7 +1767,7 @@ class item : public visitable std::set faults; std::set item_tags; // generic item specific flags - unsigned item_counter = 0; // generic counter to be used with item flags + int item_counter = 0; // generic counter to be used with item flags int mission_id = -1; // Refers to a mission in game's master list int player_id = -1; // Only give a mission to the right player! typedef std::vector t_item_vector; diff --git a/src/item_factory.cpp b/src/item_factory.cpp index f825966a37b9a..21f124980e5d9 100644 --- a/src/item_factory.cpp +++ b/src/item_factory.cpp @@ -1508,6 +1508,7 @@ void Item_factory::load( islot_comestible &slot, JsonObject &jo, const std::stri assign( jo, "stim", slot.stim, strict ); assign( jo, "healthy", slot.healthy, strict ); assign( jo, "parasites", slot.parasites, strict, 0 ); + assign( jo, "freezing_point", slot.freeze_point, strict ); assign( jo, "spoils_in", slot.spoils, strict, 1_hours ); if( jo.has_string( "addiction_type" ) ) { @@ -1821,6 +1822,7 @@ void Item_factory::load_basic_info( JsonObject &jo, itype &def, const std::strin assign( jo, "emits", def.emits ); assign( jo, "magazine_well", def.magazine_well ); assign( jo, "explode_in_fire", def.explode_in_fire ); + assign( jo, "insulation", def.insulation_factor ); if( jo.has_member( "thrown_damage" ) ) { JsonArray jarr = jo.get_array( "thrown_damage" ); diff --git a/src/item_search.cpp b/src/item_search.cpp index 2e000840c8487..f09654bb31bb9 100644 --- a/src/item_search.cpp +++ b/src/item_search.cpp @@ -3,6 +3,7 @@ #include "material.h" #include "cata_utility.h" #include "item_category.h" +#include "recipe_dictionary.h" std::pair get_both( const std::string &a ); @@ -28,6 +29,13 @@ std::function basic_item_filter( std::string filter ) return lcmatch( mat->name(), filter ); } ); }; + case 'q'://qualities + return [filter]( const item & i ) { + return std::any_of( i.quality_of().begin(), i.quality_of().end(), + [&filter]( const std::pair &e ) { + return lcmatch( e.first->name, filter ); + } ); + }; case 'b'://both return [filter]( const item & i ) { auto pair = get_both( filter ); diff --git a/src/itype.h b/src/itype.h index 58c1914ba8eab..2a46d5efd0f40 100644 --- a/src/itype.h +++ b/src/itype.h @@ -14,6 +14,7 @@ #include "damage.h" #include "translations.h" #include "calendar.h" +#include "game_constants.h" #include #include @@ -161,6 +162,9 @@ struct islot_comestible { /** chance (odds) of becoming parasitised when eating (zero if never occurs) */ int parasites = 0; + /** freezing point in degrees Fahrenheit, below this temperature item can freeze */ + int freeze_point = temperatures::freezing; + /** vitamins potentially provided by this comestible (if any) */ std::map vitamins; @@ -805,6 +809,13 @@ struct itype { /** Volume above which the magazine starts to protrude from the item and add extra volume */ units::volume magazine_well = 0; + /** + * How much insulation this item provides, either as a container, or as + * a vehicle base part. Larger means more insulation, less than 1 but + * greater than zero, transfers faster, cannot be less than zero. + */ + float insulation_factor = 1; + std::string get_item_type_string() const { if( tool ) { return "TOOL"; diff --git a/src/iuse.cpp b/src/iuse.cpp index ddc95e551d16a..655f9e381ceee 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -4891,10 +4891,8 @@ int iuse::handle_ground_graffiti( player &p, item *it, const std::string &prefix static bool heat_item( player &p ) { auto loc = g->inv_map_splice( []( const item & itm ) { - return ( ( itm.is_food() && ( itm.has_flag( "EATEN_HOT" ) || itm.item_tags.count( "FROZEN" ) ) ) || - ( itm.is_food_container() && - ( itm.contents.front().has_flag( "EATEN_HOT" ) || - itm.contents.front().item_tags.count( "FROZEN" ) ) ) ); + return( ( itm.is_food() && !itm.item_tags.count( "HOT" ) ) || + ( itm.is_food_container() && !itm.contents.front().item_tags.count( "HOT" ) ) ); }, _( "Heat up what?" ), 1, _( "You don't have appropriate food to heat up." ) ); item *heat = loc.get_item(); @@ -4904,47 +4902,36 @@ static bool heat_item( player &p ) } item &target = heat->is_food_container() ? heat->contents.front() : *heat; p.mod_moves( -300 ); //initial preparations + // simulates heat capacity of food, more weight = longer heating time + // this is x2 to simulate larger delta temperature of frozen food in relation to + // heating non-frozen food (x1); no real life physics here, only aproximations + int move_mod = ( to_gram( target.weight() ) ); if( target.item_tags.count( "FROZEN" ) ) { - add_msg( _( "You defrost the food." ) ); - target.item_tags.erase( "FROZEN" ); - if( target.has_flag( "EATEN_COLD" ) ) { - // heat just enough to thaw it - p.mod_moves( -to_gram( target.weight() ) ); + target.apply_freezerburn(); + + if( target.has_flag( "EATEN_COLD" ) && + !query_yn( _( "%s is best served cold. Heat beyond defrosting?" ), target.tname() ) ) { + + // assume environment is warm; heat less to keep COLD longer + int counter_mod = 550; target.item_tags.insert( "COLD" ); - if( g->get_temperature( p.pos() ) <= FRIDGE_TEMPERATURE ) { + if( g->get_temperature( p.pos() ) <= temperatures::cold ) { // environment is cold; heat more to prevent re-freeze - target.item_counter = 50; - } else { - // environment is warm; heat less to keep COLD longer - target.item_counter = 550; + counter_mod = 50; } + target.item_counter = counter_mod; + add_msg( _( "You defrost the food." ) ); } else { - // simulates heat capacity of food, more weight = longer heating time - // this is x2 to simulate larger delta temperature of frozen food in relation to - // heating non-frozen food (x1); no real life physics here, only aproximations - p.mod_moves( -to_gram( target.weight() ) * 2 ); - target.item_tags.insert( "HOT" ); - target.item_counter = 300; // prevents insta-freeze after defrosting - } - target.active = true; - if( target.has_flag( "NO_FREEZE" ) && !target.rotten() ) { - target.item_tags.insert( "MUSHY" ); - } else if( target.has_flag( "NO_FREEZE" ) && target.has_flag( "MUSHY" ) && - target.get_rot() < target.type->comestible->spoils ) { - target.set_relative_rot( 1.0 ); + add_msg( _( "You defrost and heat up the food." ) ); + target.heat_up(); + // bitshift multiply move_mod because we have to defrost and heat + move_mod <<= 1; } } else { add_msg( _( "You heat up the food." ) ); - target.item_tags.erase( "COLD" ); - target.item_tags.erase( "FROZEN" ); - target.item_tags.insert( "HOT" ); - p.mod_moves( -to_gram( target.weight() ) ); // simulates heat capacity of food - target.active = true; - // links time of food's HOT-ness with weight, as smaller items lose temperature faster - // locked in brackets between 10 minutes min and 60 minutes max to cut-off extreme values - const int hcapacity = to_gram( target.weight() ) < 100 ? 100 : to_gram( target.weight() ); - target.item_counter = hcapacity > 600 ? 600 : hcapacity; + target.heat_up(); } + p.mod_moves( -move_mod ); // time needed to actually heat up return true; } @@ -4960,6 +4947,11 @@ int iuse::heat_food( player *p, item *it, bool, const tripoint & ) { if( g->m.has_nearby_fire( p->pos() ) ) { heat_item( *p ); + } else if( p->has_active_bionic( bionic_id( "bio_tools" ) ) && p->power_level > 10 && + query_yn( _( "There is no fire around, use your integrated toolset instead?" ) ) ) { + if( heat_item( *p ) ) { + p->charge_power( -10 ); + } } else { p->add_msg_if_player( m_info, _( "You need to be next to fire to heat something up with the %s." ), it->tname().c_str() ); @@ -6665,7 +6657,6 @@ int iuse::radiocontrol( player *p, item *it, bool t, const tripoint & ) return it->type->charges_to_use(); } - int choice = -1; const char *car_action = NULL; if( !it->active ) { @@ -6674,12 +6665,14 @@ int iuse::radiocontrol( player *p, item *it, bool t, const tripoint & ) car_action = _( "Stop controlling RC car" ); } - choice = menu( true, _( "What to do with radio control?" ), _( "Nothing" ), car_action, - _( "Press red button" ), _( "Press blue button" ), _( "Press green button" ), NULL ); + int choice = uilist( _( "What to do with radio control?" ), { + car_action, + _( "Press red button" ), _( "Press blue button" ), _( "Press green button" ) + } ); - if( choice == 1 ) { + if( choice < 0 ) { return 0; - } else if( choice == 2 ) { + } else if( choice == 0 ) { if( it->active ) { it->active = false; p->remove_value( "remote_controlling" ); @@ -6707,10 +6700,10 @@ int iuse::radiocontrol( player *p, item *it, bool t, const tripoint & ) it->active = true; } } - } else if( choice > 2 ) { + } else if( choice > 0 ) { std::string signal = "RADIOSIGNAL_"; std::stringstream choice_str; - choice_str << ( choice - 2 ); + choice_str << choice; signal += choice_str.str(); auto item_list = p->get_radio_items(); @@ -6983,11 +6976,9 @@ int iuse::multicooker( player *p, item *it, bool t, const tripoint &pos ) if( cooktime <= 0 ) { item &meal = it->emplace_back( it->get_var( "DISH" ) ); if( meal.has_flag( "EATEN_HOT" ) ) { - meal.active = true; - meal.item_tags.erase( "COLD" ); - meal.item_tags.erase( "FROZEN" ); - meal.item_tags.insert( "HOT" ); - meal.item_counter = 600; + meal.heat_up(); + } else { + meal.reset_temp_check(); } it->active = false; diff --git a/src/main_menu.cpp b/src/main_menu.cpp index 9bdfdefcc3a67..736965883da7e 100644 --- a/src/main_menu.cpp +++ b/src/main_menu.cpp @@ -19,6 +19,8 @@ #include "cata_utility.h" #include "auto_pickup.h" #include "safemode_ui.h" +#include "text_snippets.h" +#include "loading_ui.h" #define dbg(x) DebugLog((DebugLevel)(x),D_GAME) << __FILE__ << ":" << __LINE__ << ": " @@ -77,11 +79,15 @@ void main_menu::print_menu( const catacurses::window &w_open, int iSel, const in // Draw horizontal line for( int i = 1; i < window_width - 1; ++i ) { - mvwputch( w_open, window_height - 2, i, c_white, LINE_OXOX ); + mvwputch( w_open, window_height - 4, i, c_white, LINE_OXOX ); } - center_print( w_open, window_height - 1, c_red, - _( "Please report bugs to kevin.granade@gmail.com or post on the forums." ) ); + center_print( w_open, window_height - 2, c_red, + _( "Bugs? Suggestions? Use links in MOTD to report them." ) ); + + center_print( w_open, window_height - 1, c_light_cyan, string_format( _( "Tip of the day: %s" ), + vdaytip ) ); + int iLine = 0; const int iOffsetX = ( window_width - FULL_SCREEN_WIDTH ) / 2; @@ -279,6 +285,10 @@ void main_menu::init_strings() for( auto item : vSettingsSubItems ) { vSettingsHotkeys.push_back( get_hotkeys( item ) ); } + + loading_ui ui( false ); + g->load_core_data( ui ); + vdaytip = SNIPPET.random_from_category( "tip" ); } std::vector main_menu::get_hotkeys( const std::string &s ) @@ -316,6 +326,20 @@ void main_menu::display_credits() catacurses::refresh(); } +void main_menu::load_char_templates() +{ + templates.clear(); + + for( std::string path : get_files_from_path( ".template", FILENAMES["templatedir"], false, + true ) ) { + path = native_to_utf8( path ); + path.erase( path.find( ".template" ), std::string::npos ); + path.erase( 0, path.find_last_of( "\\//" ) + 1 ); + templates.push_back( path ); + } + std::sort( templates.begin(), templates.end(), std::greater() ); +} + bool main_menu::opening_screen() { // Play title music, whoo! @@ -348,14 +372,7 @@ bool main_menu::opening_screen() return false; } - for( std::string path : get_files_from_path( ".template", FILENAMES["templatedir"], false, - true ) ) { - path = native_to_utf8( path ); - path.erase( path.find( ".template" ), std::string::npos ); - path.erase( 0, path.find_last_of( "\\//" ) + 1 ); - templates.push_back( path ); - } - std::sort( templates.begin(), templates.end(), std::greater() ); + load_char_templates(); ctxt.register_cardinal(); ctxt.register_action( "QUIT" ); @@ -676,6 +693,7 @@ bool main_menu::new_character_tab() } if( !g->u.create( play_type ) ) { g->u = player(); + load_char_templates(); werase( w_background ); wrefresh( w_background ); continue; @@ -762,6 +780,7 @@ bool main_menu::new_character_tab() } if( !g->u.create( PLTYPE_TEMPLATE, templates[sel3] ) ) { g->u = player(); + load_char_templates(); werase( w_background ); wrefresh( w_background ); continue; diff --git a/src/main_menu.h b/src/main_menu.h index cf647fd10ddf9..3b0188c430c29 100644 --- a/src/main_menu.h +++ b/src/main_menu.h @@ -29,6 +29,7 @@ class main_menu std::vector vSettingsSubItems; std::vector< std::vector > vSettingsHotkeys; std::vector< std::vector > vMenuHotkeys; // hotkeys for the vMenuItems + std::string vdaytip; //tip of the day /** * Does what it sounds like, but this function also exists in order to gracefully handle @@ -58,6 +59,11 @@ class main_menu bool load_character_tab(); void world_tab(); + /* + * Load character templates from template folder + */ + void load_char_templates(); + // These variables are shared between @opening_screen and the tab functions. // TODO: But this is an ugly short-term solution. input_context ctxt; diff --git a/src/map.cpp b/src/map.cpp index a2e0630fd2996..9fbde56401ae8 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1250,9 +1250,9 @@ ter_id map::ter( const int x, const int y ) const return current_submap->get_ter( lx, ly ); } -void map::ter_set( const int x, const int y, const ter_id new_terrain ) +bool map::ter_set( const int x, const int y, const ter_id new_terrain ) { - ter_set( tripoint( x, y, abs_sub.z ), new_terrain ); + return ter_set( tripoint( x, y, abs_sub.z ), new_terrain ); } std::string map::tername( const int x, const int y ) const @@ -1357,10 +1357,10 @@ bool map::is_harvestable( const tripoint &pos ) const /* * set terrain via string; this works for -any- terrain id */ -void map::ter_set( const tripoint &p, const ter_id new_terrain ) +bool map::ter_set( const tripoint &p, const ter_id new_terrain ) { if( !inbounds( p ) ) { - return; + return false; } int lx = 0; @@ -1369,7 +1369,7 @@ void map::ter_set( const tripoint &p, const ter_id new_terrain ) const ter_id old_id = current_submap->get_ter( lx, ly ); if( old_id == new_terrain ) { // Nothing changed - return; + return false; } current_submap->set_ter( lx, ly, new_terrain ); @@ -1410,6 +1410,8 @@ void map::ter_set( const tripoint &p, const ter_id new_terrain ) tripoint above( p.x, p.y, p.z + 1 ); // Make sure that if we supported something and no longer do so, it falls down support_dirty( above ); + + return true; } std::string map::tername( const tripoint &p ) const @@ -4180,9 +4182,6 @@ item &map::add_item_at( const tripoint &p, current_submap->update_lum_add( new_item, lx, ly ); const auto new_pos = current_submap->itm[lx][ly].insert( index, new_item ); - if( g->get_temperature( p ) <= FRIDGE_TEMPERATURE && new_item.is_food() ) { - new_item.active = true; - } if( new_item.needs_processing() ) { current_submap->active_items.add( new_pos, point( lx, ly ) ); } @@ -4266,77 +4265,6 @@ void map::update_lum( item_location &loc, bool add ) } } -unsigned int temp_difference_ratio( int temp_one, int temp_two ) -{ - // ratio is between 1-4 and changes every 10F (~5.5C) - unsigned int ratio = abs( temp_one - temp_two ) / 10; - ratio = clamp( ratio, static_cast( 1 ), static_cast( 4 ) ); - return ratio; -} - -// Check if it's in a fridge/freezer and is food, set the fridge/freezer -// date to current time, and also check contents. -void map::apply_in_fridge( item &it, int temp, bool vehicle ) -{ - unsigned int diff_freeze = temp_difference_ratio( temp, FREEZING_TEMPERATURE ) + 1; //effective 1-4 - unsigned int diff_cold = temp_difference_ratio( temp, FRIDGE_TEMPERATURE ) + 1; - - // this counters environmental effects trying to heat-up at the same ratio - if( vehicle ) { - diff_freeze *= 2; - diff_cold *= 2; - } - - if( it.is_food() ) { - if( temp <= FREEZING_TEMPERATURE ) { - if( it.freezer == calendar::before_time_starts ) { - it.freezer = calendar::turn; - } - } else if( temp <= FRIDGE_TEMPERATURE ) { - if( it.fridge == calendar::before_time_starts ) { - it.fridge = calendar::turn; - } - } - // cool down of the HOT flag, is unsigned, don't go below 1 - if( it.item_tags.count( "HOT" ) && it.item_counter > diff_cold ) { - it.item_counter -= diff_cold; - } else if( it.item_tags.count( "HOT" ) ) { - it.item_tags.erase( "HOT" ); - it.item_counter = 0; - } - // This sets the COLD flag, and doesn't go above 600 - if( !( it.item_tags.count( "COLD" ) || it.item_tags.count( "FROZEN" ) || - it.item_tags.count( "HOT" ) ) ) { - - it.item_tags.insert( "COLD" ); - it.active = true; - } - if( it.item_tags.count( "COLD" ) && it.item_counter <= ( 600 - diff_cold ) ) { - it.item_counter += diff_cold; - } - // Freezer converts COLD flag at 600 ticks to FROZEN flag with max 600 ticks - if( temp <= FREEZING_TEMPERATURE && it.item_tags.count( "COLD" ) && it.item_counter >= 600 && - !( it.item_tags.count( "FROZEN" ) || it.item_tags.count( "HOT" ) ) ) { - - it.item_tags.erase( "COLD" ); - it.item_tags.insert( "FROZEN" ); - it.active = true; - it.item_counter = 0; - - // items that don't use COLD flag can go FROZEN bypassing COLD state - } - if( temp <= FREEZING_TEMPERATURE && it.item_tags.count( "FROZEN" ) && it.item_counter <= 600 ) { - it.item_counter += diff_freeze; - it.item_counter = it.item_counter > 600 ? 600 : it.item_counter; - } - } - if( it.is_container() ) { - for( auto &elem : it.contents ) { - apply_in_fridge( elem, temp, vehicle ); - } - } -} - // This is an ugly and dirty hack to prevent invalidating the item_location // references the player is using for an activity. What needs to happen is // activity targets gets refactored in some way that it can reference items @@ -4352,15 +4280,15 @@ static bool item_is_in_activity( const item *it ) } ) != targs->end(); } -template -static bool process_item( item_stack &items, Iterator &n, const tripoint &location, bool activate ) +static bool process_item( item_stack &items, std::list::iterator &n, const tripoint &location, + const bool activate, const int temp, const float insulation ) { if( !item_is_in_activity( &*n ) ) { // make a temporary copy, remove the item (in advance) // and use that copy to process it item temp_item = *n; auto insertion_point = items.erase( n ); - if( !temp_item.process( nullptr, location, activate ) ) { + if( !temp_item.process( nullptr, location, activate, temp, insulation ) ) { // Not destroyed, must be inserted again. // If the item lost its active flag in processing, // it won't be re-added to the active list, tidy! @@ -4372,7 +4300,7 @@ static bool process_item( item_stack &items, Iterator &n, const tripoint &locati return false; } return true; - } else if( n->process( nullptr, location, activate ) ) { + } else if( n->process( nullptr, location, activate, temp, insulation ) ) { items.erase( n ); return true; } @@ -4380,29 +4308,14 @@ static bool process_item( item_stack &items, Iterator &n, const tripoint &locati } static bool process_map_items( item_stack &items, std::list::iterator &n, - const tripoint &location, std::string ) + const tripoint &location, const std::string &, const int temp, + const float insulation ) { - return process_item( items, n, location, false ); + return process_item( items, n, location, false, temp, insulation ); } static void process_vehicle_items( vehicle &cur_veh, int part ) { - const bool fridge_here = cur_veh.part_flag( part, VPFLAG_FRIDGE ) && - cur_veh.has_part( "FRIDGE", true ); - if( fridge_here ) { - for( auto &n : cur_veh.get_items( part ) ) { - g->m.apply_in_fridge( n, FRIDGE_TEMPERATURE, true ); - } - } - - const bool freezer_here = cur_veh.part_flag( part, VPFLAG_FREEZER ) && - cur_veh.has_part( "FREEZER", true ); - if( freezer_here ) { - for( auto &n : cur_veh.get_items( part ) ) { - g->m.apply_in_fridge( n, FREEZER_TEMPERATURE, true ); - } - } - const bool washmachine_here = cur_veh.part_flag( part, VPFLAG_WASHING_MACHINE ) && cur_veh.is_part_on( part ); bool washing_machine_finished = false; @@ -4456,8 +4369,8 @@ void map::process_active_items() process_items( true, process_map_items, std::string {} ); } -template -void map::process_items( bool const active, T processor, std::string const &signal ) +void map::process_items( bool const active, map::map_process_func processor, + std::string const &signal ) { const int minz = zlevels ? -OVERMAP_DEPTH : abs_sub.z; const int maxz = zlevels ? OVERMAP_HEIGHT : abs_sub.z; @@ -4471,8 +4384,15 @@ void map::process_items( bool const active, T processor, std::string const &sign submap *const current_submap = get_submap_at_grid( gp ); // Vehicles first in case they get blown up and drop active items on the map. if( !current_submap->vehicles.empty() ) { - process_items_in_vehicles( *current_submap, processor, signal ); + process_items_in_vehicles( *current_submap, gz, processor, signal ); } + } + } + } + for( gz = minz; gz <= maxz; ++gz ) { + for( gx = 0; gx < my_MAPSIZE; ++gx ) { + for( gy = 0; gy < my_MAPSIZE; ++gy ) { + submap *const current_submap = get_submap_at_grid( gp ); if( !active || !current_submap->active_items.empty() ) { process_items_in_submap( *current_submap, gp, processor, signal ); } @@ -4481,10 +4401,8 @@ void map::process_items( bool const active, T processor, std::string const &sign } } -template -void map::process_items_in_submap( submap ¤t_submap, - const tripoint &gridp, - T processor, std::string const &signal ) +void map::process_items_in_submap( submap ¤t_submap, const tripoint &gridp, + map::map_process_func processor, std::string const &signal ) { // Get a COPY of the active item list for this submap. // If more are added as a side effect of processing, they are ignored this turn. @@ -4497,14 +4415,14 @@ void map::process_items_in_submap( submap ¤t_submap, } const tripoint map_location = tripoint( grid_offset + active_item.location, gridp.z ); + const int loc_temp = g->get_temperature( map_location ); auto items = i_at( map_location ); - processor( items, active_item.item_iterator, map_location, signal ); + processor( items, active_item.item_iterator, map_location, signal, loc_temp, 1 ); } } -template -void map::process_items_in_vehicles( submap ¤t_submap, T processor, - std::string const &signal ) +void map::process_items_in_vehicles( submap ¤t_submap, const int gridz, + map::map_process_func processor, std::string const &signal ) { std::vector const &veh_in_nonant = current_submap.vehicles; // a copy, important if the vehicle list changes because a @@ -4519,33 +4437,39 @@ void map::process_items_in_vehicles( submap ¤t_submap, T processor, continue; } - process_items_in_vehicle( *cur_veh, current_submap, processor, signal ); + process_items_in_vehicle( *cur_veh, current_submap, gridz, processor, signal ); } } -template -void map::process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap, - T processor, std::string const &signal ) +void map::process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap, const int gridz, + map::map_process_func processor, std::string const &signal ) { + static time_point last_fluid_check = calendar::time_of_cataclysm; + const time_point now = calendar::turn; + + // only check the fluid every 10 turns for freeze/rot + if( last_fluid_check - now > 10_turns ) { + last_fluid_check = now; + std::vector tanks = cur_veh.all_parts_with_feature( VPFLAG_FLUIDTANK, false ); + for( const int &idx : tanks ) { + const point partloc = cur_veh.global_pos() + cur_veh.parts[idx].precalc[0]; + const tripoint partpos = tripoint( partloc, abs_sub.z ); + cur_veh.parts[idx].process_contents( partpos ); + } + } std::vector cargo_parts = cur_veh.all_parts_with_feature( VPFLAG_CARGO, true ); for( int part : cargo_parts ) { process_vehicle_items( cur_veh, part ); } - std::vector tanks = cur_veh.all_parts_with_feature( VPFLAG_FLUIDTANK, false ); - for( const int &idx : tanks ) { - const point partloc = cur_veh.global_pos() + cur_veh.parts[idx].precalc[0]; - const tripoint partpos = tripoint( partloc, abs_sub.z ); - cur_veh.parts[idx].process_contents( partpos ); - } - + const bool engine_heater_is_on = cur_veh.has_part( "E_HEATER", true ) && cur_veh.engine_on; + const point veh_pos = cur_veh.global_pos(); for( auto &active_item : cur_veh.active_items.get() ) { if( cargo_parts.empty() ) { return; } else if( !cur_veh.active_items.has( active_item ) ) { continue; } - auto const it = std::find_if( begin( cargo_parts ), end( cargo_parts ), [&]( int const part ) { return active_item.location == cur_veh.parts[static_cast( part )].mount; } ); @@ -4553,14 +4477,29 @@ void map::process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap, if( it == std::end( cargo_parts ) ) { continue; // Can't find a cargo part matching the active item. } - + auto &item_iter = active_item.item_iterator; // Find the cargo part and coordinates corresponding to the current active item. - auto const part_index = static_cast( *it ); - const point partloc = cur_veh.global_pos() + cur_veh.parts[part_index].precalc[0]; - // TODO: Make this 3D when vehicles know their Z-coordinate - const tripoint item_location = tripoint( partloc, abs_sub.z ); + const size_t part_index = static_cast( *it ); + const vehicle_part &pt = cur_veh.parts[part_index]; + const point partloc = veh_pos + pt.precalc[0]; + const tripoint item_loc = tripoint( partloc, gridz ); auto items = cur_veh.get_items( static_cast( part_index ) ); - if( !processor( items, active_item.item_iterator, item_location, signal ) ) { + int it_temp = g->get_temperature( item_loc ); + float it_insulation = 1.0; + if( item_iter->is_food() || item_iter->is_food_container() ) { + const vpart_info &pti = pt.info(); + if( engine_heater_is_on ) { + it_temp = std::max( it_temp, temperatures::cold + 1 ); + } + if( pt.enabled && pti.has_flag( VPFLAG_FRIDGE ) ) { + it_temp = std::min( it_temp, temperatures::fridge ); + } else if( pt.enabled && pti.has_flag( VPFLAG_FREEZER ) ) { + it_temp = std::min( it_temp, temperatures::freezer ); + } + // some vehicle parts provide insulation, default is 1 + it_insulation *= item::find_type( pti.item )->insulation_factor; + } + if( !processor( items, item_iter, item_loc, signal, it_temp, it_insulation ) ) { // If the item was NOT destroyed, we can skip the remainder, // which handles fallout from the vehicle being damaged. continue; @@ -4971,8 +4910,8 @@ std::list > map::get_rc_items( int x, int y, int z ) } static bool trigger_radio_item( item_stack &items, std::list::iterator &n, - const tripoint &pos, - std::string signal ) + const tripoint &pos, const std::string &signal, + const int, const float ) { bool trigger_item = false; if( n->has_flag( "RADIO_ACTIVATION" ) && n->has_flag( signal ) ) { @@ -5001,7 +4940,7 @@ static bool trigger_radio_item( item_stack &items, std::list::iterator &n, trigger_item = true; } if( trigger_item ) { - return process_item( items, n, pos, true ); + return process_item( items, n, pos, true, 0, 1 ); } return false; } diff --git a/src/map.h b/src/map.h index 089bacbaa28a2..0cc60287c0452 100644 --- a/src/map.h +++ b/src/map.h @@ -567,7 +567,7 @@ class map // Terrain integer id at coordinates (x, y); {x|y}=(0, SEE{X|Y}*3] ter_id ter( const int x, const int y ) const; - void ter_set( const int x, const int y, const ter_id new_terrain ); + bool ter_set( const int x, const int y, const ter_id new_terrain ); std::string tername( const int x, const int y ) const; // Name of terrain at (x, y) // Terrain: 3D @@ -582,7 +582,7 @@ class map const std::set &get_harvest_names( const tripoint &p ) const; ter_id get_ter_transforms_into( const tripoint &p ) const; - void ter_set( const tripoint &p, const ter_id new_terrain ); + bool ter_set( const tripoint &p, const ter_id new_terrain ); std::string tername( const tripoint &p ) const; @@ -898,14 +898,6 @@ class map */ void update_lum( item_location &loc, bool add ); - /** - * Governs HOT/COLD/FROZEN status of items in a fridge/freezer or in cold temperature - * and sets item's fridge/freezer status variables. - * @param it Item processed. - * @param temperature Temperature affecting item. - */ - void apply_in_fridge( item &it, int temperature, bool vehicle = false ); - /** * @name Consume items on the map * @@ -1488,17 +1480,27 @@ class map // or can just return air because we bashed down an entire floor tile ter_id get_roof( const tripoint &p, bool allow_air ); + public: + /** + * Processor function pointer used in process_items and brethren. + * + * Note, typedefs should be discouraged because they tend to obfuscate + * code, but due to complexity, a template type makes it worse here. + * It's a really heinous function pointer so a typedef is the best + * solution in this instance. + */ + typedef bool ( *map_process_func )( item_stack &, std::list::iterator &, const tripoint &, + const std::string &, int, float ); + private: + // Iterates over every item on the map, passing each item to the provided function. - template - void process_items( bool active, T processor, std::string const &signal ); - template + void process_items( bool active, map_process_func processor, std::string const &signal ); void process_items_in_submap( submap ¤t_submap, const tripoint &gridp, - T processor, std::string const &signal ); - template - void process_items_in_vehicles( submap ¤t_submap, T processor, std::string const &signal ); - template - void process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap, - T processor, std::string const &signal ); + map::map_process_func processor, std::string const &signal ); + void process_items_in_vehicles( submap ¤t_submap, const int gridz, + map_process_func processor, std::string const &signal ); + void process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap, const int gridz, + map::map_process_func processor, std::string const &signal ); /** Enum used by functors in `function_over` to control execution. */ enum iteration_state { @@ -1575,12 +1577,6 @@ class map bool need_draw_lower_floor( const tripoint &p ); }; -/** - * Gives ratio for temperature differential of two temperatures - * Used in determining speed of temperature change of items - */ -unsigned int temp_difference_ratio( int temp_one, int temp_two ); - std::vector closest_points_first( int radius, point p ); std::vector closest_points_first( int radius, int x, int y ); // Does not build "piles" - does the same as above functions, except in tripoints diff --git a/src/map_extras.cpp b/src/map_extras.cpp index e76c4af68cd82..0291509b8af7c 100644 --- a/src/map_extras.cpp +++ b/src/map_extras.cpp @@ -44,6 +44,9 @@ static const mtype_id mon_zombie_soldier( "mon_zombie_soldier" ); static const mtype_id mon_zombie_military_pilot( "mon_zombie_military_pilot" ); static const mtype_id mon_zombie_bio_op( "mon_zombie_bio_op" ); static const mtype_id mon_zombie_grenadier( "mon_zombie_grenadier" ); +static const mtype_id mon_shia( "mon_shia" ); +static const mtype_id mon_spider_web( "mon_spider_web" ); +static const mtype_id mon_jabberwock( "mon_jabberwock" ); void mx_null( map &, const tripoint & ) { @@ -673,6 +676,140 @@ void mx_anomaly( map &m, const tripoint &abs_sub ) m.spawn_natural_artifact( center, prop ); } +void mx_shia( map &m, const tripoint & ) +{ + // A rare chance to spawn Shia. This was extracted from the hardcoded forest mapgen + // and moved into a map extra, but it still has a one_in chance of spawning because + // otherwise the extreme rarity of this event wildly skewed the values for all of the + // other extras. + if( one_in( 5000 ) ) { + m.add_spawn( mon_shia, 1, SEEX, SEEY ); + } +} + +void mx_spider( map &m, const tripoint &abs_sub ) +{ + // This was extracted from the hardcoded forest mapgen and slightly altered so + // that it used flags rather than specific terrain types in determining where to + // place webs. + for( int i = 0; i < SEEX * 2; i++ ) { + for( int j = 0; j < SEEX * 2; j++ ) { + const tripoint location( i, j, abs_sub.z ); + + bool should_web_flat = m.has_flag_ter( "FLAT", location ) && !one_in( 3 ); + bool should_web_shrub = m.has_flag_ter( "SHRUB", location ) && !one_in( 4 ); + bool should_web_tree = m.has_flag_ter( "TREE", location ) && !one_in( 4 ); + + if( should_web_flat || should_web_shrub || should_web_tree ) { + m.add_field( location, fd_web, rng( 1, 3 ), 0 ); + } + } + } + + m.ter_set( 12, 12, t_dirt ); + m.furn_set( 12, 12, f_egg_sackws ); + m.remove_field( { 12, 12, m.get_abs_sub().z }, fd_web ); + m.add_spawn( mon_spider_web, rng( 1, 2 ), SEEX, SEEY ); +} + +void mx_jabberwock( map &m, const tripoint & ) +{ + // A rare chance to spawn a jabberwock. This was extracted from the harcoded forest mapgen + // and moved into a map extra. It still has a one_in chance of spawning because otherwise + // the rarity skewed the values for all the other extras too much. I considered moving it + // into the monster group, but again the hardcoded rarity it had in the forest mapgen was + // not easily replicated there. + if( one_in( 50 ) ) { + m.add_spawn( mon_jabberwock, 1, SEEX, SEEY ); + } +} + +void mx_grove( map &m, const tripoint &abs_sub ) +{ + // From wikipedia - The main meaning of "grove" is a group of trees that grow close together, + // generally without many bushes or other plants underneath. + + // This map extra finds the first tree in the area, and then converts all trees, young trees, + // and shrubs in the area into that type of tree. + + ter_id tree; + bool found_tree = false; + for( int i = 0; i < SEEX * 2; i++ ) { + for( int j = 0; j < SEEX * 2; j++ ) { + const tripoint location( i, j, abs_sub.z ); + if( m.has_flag_ter( "TREE", location ) ) { + tree = m.ter( location ); + found_tree = true; + } + } + } + + if( !found_tree ) { + return; + } + + for( int i = 0; i < SEEX * 2; i++ ) { + for( int j = 0; j < SEEX * 2; j++ ) { + const tripoint location( i, j, abs_sub.z ); + if( m.has_flag_ter( "SHRUB", location ) || m.has_flag_ter( "TREE", location ) || + m.has_flag_ter( "YOUNG", location ) ) { + m.ter_set( location, tree ); + } + } + } +} + +void mx_shrubbery( map &m, const tripoint &abs_sub ) +{ + // This map extra finds the first shrub in the area, and then converts all trees, young trees, + // and shrubs in the area into that type of shrub. + + ter_id shrubbery; + bool found_shrubbery = false; + for( int i = 0; i < SEEX * 2; i++ ) { + for( int j = 0; j < SEEX * 2; j++ ) { + const tripoint location( i, j, abs_sub.z ); + if( m.has_flag_ter( "SHRUB", location ) ) { + shrubbery = m.ter( location ); + found_shrubbery = true; + } + } + } + + if( !found_shrubbery ) { + return; + } + + for( int i = 0; i < SEEX * 2; i++ ) { + for( int j = 0; j < SEEX * 2; j++ ) { + const tripoint location( i, j, abs_sub.z ); + if( m.has_flag_ter( "SHRUB", location ) || m.has_flag_ter( "TREE", location ) || + m.has_flag_ter( "YOUNG", location ) ) { + m.ter_set( location, shrubbery ); + } + } + } +} + +void mx_clearcut( map &m, const tripoint &abs_sub ) +{ + // From wikipedia - Clearcutting, clearfelling or clearcut logging is a forestry/logging + // practice in which most or all trees in an area are uniformly cut down. + + // This map extra converts all trees and young trees in the area to stumps. + + ter_id stump( "t_stump" ); + + for( int i = 0; i < SEEX * 2; i++ ) { + for( int j = 0; j < SEEX * 2; j++ ) { + const tripoint location( i, j, abs_sub.z ); + if( m.has_flag_ter( "TREE", location ) || m.has_flag_ter( "YOUNG", location ) ) { + m.ter_set( location, stump ); + } + } + } +} + typedef std::unordered_map FunctionMap; FunctionMap builtin_functions = { { "mx_null", mx_null }, @@ -688,7 +825,13 @@ FunctionMap builtin_functions = { { "mx_crater", mx_crater }, { "mx_fumarole", mx_fumarole }, { "mx_portal_in", mx_portal_in }, - { "mx_anomaly", mx_anomaly } + { "mx_anomaly", mx_anomaly }, + { "mx_shia", mx_shia }, + { "mx_spider", mx_spider }, + { "mx_jabberwock", mx_jabberwock }, + { "mx_grove", mx_grove }, + { "mx_shrubbery", mx_shrubbery }, + { "mx_clearcut", mx_clearcut }, }; map_special_pointer get_function( const std::string &name ) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 9a4a52c482b46..744f65555d851 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1321,12 +1321,16 @@ class jmapgen_nested : public jmapgen_piece // To speed up the most common case: no checks bool has_any = false; std::array, om_direction::size> neighbors; + std::set above; public: neighborhood_check( JsonObject jsi ) { for( om_direction::type dir : om_direction::all ) { int index = static_cast( dir ); neighbors[index] = jsi.get_tags( om_direction::id( dir ) ); has_any |= !neighbors[index].empty(); + + above = jsi.get_tags( "above" ); + has_any |= !above.empty(); } } @@ -1350,6 +1354,15 @@ class jmapgen_nested : public jmapgen_piece } all_directions_match &= this_direction_matches; } + + if( !above.empty() ) { + bool above_matches = false; + for( oter_str_id allowed_neighbor : above ) { + above_matches |= is_ot_subtype( allowed_neighbor.c_str(), dat.above().id() ); + } + all_directions_match &= above_matches; + } + return all_directions_match; } }; diff --git a/src/mapgen_functions.cpp b/src/mapgen_functions.cpp index 2dffdd8b251cb..ffa4008fcdb23 100644 --- a/src/mapgen_functions.cpp +++ b/src/mapgen_functions.cpp @@ -22,6 +22,10 @@ #include "field.h" #include #include +#include +#include + +#define dbg(x) DebugLog((DebugLevel)(x),D_MAP_GEN) << __FILE__ << ":" << __LINE__ << ": " const mtype_id mon_ant_larva( "mon_ant_larva" ); const mtype_id mon_ant_queen( "mon_ant_queen" ); @@ -94,7 +98,7 @@ building_gen_pointer get_mapgen_cfunction( const std::string &ident ) { "crater", &mapgen_crater }, { "field", &mapgen_field }, { "dirtlot", &mapgen_dirtlot }, - { "forest", &mapgen_forest_general }, + { "forest", &mapgen_forest }, { "hive", &mapgen_hive }, { "spider_pit", &mapgen_spider_pit }, { "fungal_bloom", &mapgen_fungal_bloom }, @@ -425,227 +429,6 @@ void mapgen_dirtlot( map *m, oter_id, mapgendata, const time_point &, float ) } } } -// @todo: more region_settings for forest biome -void mapgen_forest_general( map *m, oter_id terrain_type, mapgendata dat, const time_point &turn, - float ) -{ - if( terrain_type == "forest_thick" ) { - dat.fill( 8 ); - } else if( terrain_type == "forest_water" ) { - dat.fill( 4 ); - } else if( terrain_type == "forest" ) { - dat.fill( 0 ); - } - for( int i = 0; i < 4; i++ ) { - if( dat.t_nesw[i] == "forest" || dat.t_nesw[i] == "forest_water" ) { - dat.dir( i ) += 14; - } else if( dat.t_nesw[i] == "forest_thick" ) { - dat.dir( i ) += 18; - } - } - for( int i = 0; i < SEEX * 2; i++ ) { - for( int j = 0; j < SEEY * 2; j++ ) { - int forest_chance = 0; - int num = 0; - if( j < dat.n_fac ) { - forest_chance += dat.n_fac - j; - num++; - } - if( SEEX * 2 - 1 - i < dat.e_fac ) { - forest_chance += dat.e_fac - ( SEEX * 2 - 1 - i ); - num++; - } - if( SEEY * 2 - 1 - j < dat.s_fac ) { - forest_chance += dat.s_fac - ( SEEY * 2 - 1 - j ); - num++; - } - if( i < dat.w_fac ) { - forest_chance += dat.w_fac - i; - num++; - } - if( num > 0 ) { - forest_chance /= num; - } - int rn = rng( 0, forest_chance ); - if( ( forest_chance > 0 && rn > 13 ) || one_in( 100 - forest_chance ) ) { - std::array, 16> tree_chances = {{ - // @todo: JSONize this array! - // Ensure that these one_in chances - // (besides the last) don't add up to more than 1 in 1 - // Reserve the last one (1 in 1) for simple trees that fill up the rest. - { 250, t_tree_apple }, - { 300, t_tree_pear }, - { 300, t_tree_coffee }, - { 300, t_tree_cherry }, - { 350, t_tree_apricot }, - { 350, t_tree_peach }, - { 350, t_tree_plum }, - { 256, t_tree_birch }, - { 256, t_tree_willow }, - { 256, t_tree_maple }, - { 128, t_tree_deadpine }, - { 128, t_tree_hickory_dead }, - { 32, t_tree_hickory }, - { 16, t_tree_pine }, - { 16, t_tree_blackjack }, - { 1, t_tree }, - } - }; - double earlier_chances = 0; - // Remember the earlier chances to calculate the sliding errors - for( size_t c = 0; c < tree_chances.size(); c++ ) { - if( tree_chances[c].first == 1 ) { - // If something has chances of 1, just put it in and go on. - m->ter_set( i, j, tree_chances[c].second ); - break; - } else if( earlier_chances != 1 && - ( one_in_improved( ( 1 / ( 1 - earlier_chances ) )*tree_chances[c].first ) ) ) { - // (1/(1 - earlier_chances)) is the sliding error. fixed here - m->ter_set( i, j, tree_chances[c].second ); - break; - } else { - earlier_chances += 1 / double( tree_chances[c].first ); - } - } - } else if( ( forest_chance > 0 && rn > 10 ) || one_in( 100 - forest_chance ) ) { - m->ter_set( i, j, t_tree_young ); - } else if( ( forest_chance > 0 && rn > 9 ) || one_in( 100 - forest_chance ) ) { - if( one_in( 250 ) ) { - m->ter_set( i, j, t_shrub_blueberry ); - } else { - m->ter_set( i, j, t_underbrush ); - } - } else { - m->ter_set( i, j, dat.groundcover() ); - } - } - } - m->place_items( "forest", 60, 0, 0, SEEX * 2 - 1, SEEY * 2 - 1, true, - turn ); // @todo: fixme: region settings - - if( terrain_type == "forest_water" ) { - // Reset *_fac to handle where to place water - for( int i = 0; i < 8; i++ ) { - if( dat.t_nesw[i] == "forest_water" ) { - dat.set_dir( i, 2 ); - } else if( is_ot_type( "river", dat.t_nesw[i] ) ) { - dat.set_dir( i, 3 ); - } else if( dat.t_nesw[i] == "forest" || dat.t_nesw[i] == "forest_thick" ) { - dat.set_dir( i, 1 ); - } else { - dat.set_dir( i, 0 ); - } - } - int x = SEEX / 2 + rng( 0, SEEX ), y = SEEY / 2 + rng( 0, SEEY ); - for( int i = 0; i < 20; i++ ) { - if( x >= 0 && x < SEEX * 2 && y >= 0 && y < SEEY * 2 ) { - if( m->ter( x, y ) == t_swater_sh ) { - m->ter_set( x, y, t_swater_dp ); - } else if( dat.is_groundcover( m->ter( x, y ) ) || - m->ter( x, y ) == t_underbrush ) { - m->ter_set( x, y, t_swater_sh ); - } - if( m->ter( x, y ) == t_water_sh ) { - m->ter_set( x, y, t_water_dp ); - } else if( dat.is_groundcover( m->ter( x, y ) ) || - m->ter( x, y ) == t_underbrush ) { - m->ter_set( x, y, t_water_sh ); - } - } else { - i = 20; - } - x += rng( -2, 2 ); - y += rng( -2, 2 ); - if( x < 0 || x >= SEEX * 2 ) { - x = SEEX / 2 + rng( 0, SEEX ); - } - if( y < 0 || y >= SEEY * 2 ) { - y = SEEY / 2 + rng( 0, SEEY ); - } - int factor = dat.n_fac + ( dat.ne_fac / 2 ) + ( dat.nw_fac / 2 ); - for( int j = 0; j < factor; j++ ) { - int wx = rng( 0, SEEX * 2 - 1 ), wy = rng( 0, SEEY - 1 ); - if( dat.is_groundcover( m->ter( wx, wy ) ) || - m->ter( wx, wy ) == t_underbrush ) { - m->ter_set( wx, wy, t_swater_sh ); - } - } - factor = dat.e_fac + ( dat.ne_fac / 2 ) + ( dat.se_fac / 2 ); - for( int j = 0; j < factor; j++ ) { - int wx = rng( SEEX, SEEX * 2 - 1 ), wy = rng( 0, SEEY * 2 - 1 ); - if( dat.is_groundcover( m->ter( wx, wy ) ) || - m->ter( wx, wy ) == t_underbrush ) { - m->ter_set( wx, wy, t_water_sh ); - } - } - factor = dat.s_fac + ( dat.se_fac / 2 ) + ( dat.sw_fac / 2 ); - for( int j = 0; j < factor; j++ ) { - int wx = rng( 0, SEEX * 2 - 1 ), wy = rng( SEEY, SEEY * 2 - 1 ); - if( dat.is_groundcover( m->ter( wx, wy ) ) || - m->ter( wx, wy ) == t_underbrush ) { - m->ter_set( wx, wy, t_swater_sh ); - } - } - factor = dat.s_fac + ( dat.se_fac / 2 ) + ( dat.ne_fac / 2 ); - for( int j = 0; j < factor; j++ ) { - int wx = rng( 0, SEEX * 2 - 1 ), wy = rng( SEEY, SEEY * 2 - 1 ); - if( m->ter( wx, wy ) == t_water_sh ) { - m->furn_set( wx, wy, f_cattails ); - } - } - factor = dat.s_fac + ( dat.se_fac / 2 ) + ( dat.sw_fac / 2 ); - for( int j = 0; j < factor; j++ ) { - int wx = rng( 0, SEEX * 2 - 1 ), wy = rng( SEEY, SEEY * 2 - 1 ); - if( m->ter( wx, wy ) == t_water_sh ) { - m->furn_set( wx, wy, f_cattails ); - } - } - factor = dat.w_fac + ( dat.nw_fac / 2 ) + ( dat.sw_fac / 2 ); - for( int j = 0; j < factor; j++ ) { - int wx = rng( 0, SEEX - 1 ), wy = rng( 0, SEEY * 2 - 1 ); - if( dat.is_groundcover( m->ter( wx, wy ) ) || - m->ter( wx, wy ) == t_underbrush ) { - m->ter_set( wx, wy, t_water_sh ); - } - } - } - int rn = rng( 0, 2 ) * rng( 0, 1 ) + rng( 0, 1 ); // Good chance of 0 - for( int i = 0; i < rn; i++ ) { - x = rng( 0, SEEX * 2 - 1 ); - y = rng( 0, SEEY * 2 - 1 ); - mtrap_set( m, x, y, tr_sinkhole ); - if( m->ter( x, y ) != t_swater_sh && m->ter( x, y ) != t_water_sh ) { - m->ter_set( x, y, dat.groundcover() ); - } - } - } - - //1-2 per overmap, very bad day for low level characters - if( one_in( 10000 ) ) { - m->add_spawn( mon_jabberwock, 1, SEEX, SEEY ); // @todo: fixme add to monster_group? - } - - //Very rare easter egg, ~1 per 10 overmaps - if( one_in( 1000000 ) ) { - m->add_spawn( mon_shia, 1, SEEX, SEEY ); - } - - // One in 100 forests has a spider living in it :o - if( one_in( 100 ) ) { - for( int i = 0; i < SEEX * 2; i++ ) { - for( int j = 0; j < SEEX * 2; j++ ) { - if( ( dat.is_groundcover( m->ter( i, j ) ) || - m->ter( i, j ) == t_underbrush ) && !one_in( 3 ) ) { - madd_field( m, i, j, fd_web, rng( 1, 3 ) ); - } - } - } - m->ter_set( 12, 12, t_dirt ); - m->furn_set( 12, 12, f_egg_sackws ); - m->remove_field( {12, 12, m->get_abs_sub().z}, fd_web ); - m->add_spawn( mon_spider_web, rng( 1, 2 ), SEEX, SEEY ); - } -} void mapgen_hive( map *m, oter_id, mapgendata dat, const time_point &turn, float ) { @@ -2666,7 +2449,7 @@ void mapgen_generic_house( map *m, oter_id terrain_type, mapgendata dat, const t } } - place_stairs( m, terrain_type, dat, actual_house_height, lw, rw ); + place_stairs( m, terrain_type, dat ); if( one_in( 100 ) ) { // @todo: region data // Houses have a 1 in 100 chance of wasps! for( int i = 0; i < SEEX * 2; i++ ) { @@ -3090,7 +2873,7 @@ void mapgen_cave( map *m, oter_id, mapgendata dat, const time_point &turn, float draw_map(oter_id("forest"), dat.north(), dat.east(), dat.south(), dat.west(), dat.neast(), dat.seast(), dat.nwest(), dat.swest(), dat.above(), turn, g, density, dat.zlevel); */ - mapgen_forest_general( m, oter_str_id( "forest" ).id(), dat, turn, density ); + mapgen_forest( m, oter_str_id( "forest" ).id(), dat, turn, density ); // Clear the center with some rocks square( m, t_rock, SEEX - 6, SEEY - 6, SEEX + 5, SEEY + 5 ); int pathx = 0; @@ -3786,6 +3569,239 @@ void mapgen_tutorial( map *m, oter_id terrain_type, mapgendata dat, const time_p } } +void mapgen_forest( map *m, oter_id terrain_type, mapgendata dat, const time_point &turn, + float ) +{ + // Adjacency factor is basically used to weight the frequency of a feature + // being placed by the relative sparseness of the current terrain to its + // neighbors. For example, a forest_thick surrounded by forest_thick on + // all sides can be much more dense than a forest_water surrounded by + // fields on all sides. It's a little magic-number-y but somewhat replicates + // the behavior of the previous forest mapgen when fading forest terrains + // into each other and non-forest terrains. + + const auto get_sparseness_adjacency_factor = [&dat]( const oter_id ot ) { + const auto biome = dat.region.forest_composition.biomes.find( ot ); + if( biome == dat.region.forest_composition.biomes.end() ) { + // If there is no defined biome for this oter, use 0. It's possible + // to specify biomes in the forest regional settings that are not + // rendered by this forest map gen method, in order to control + // how terrains are blended together (e.g. specify roads with an equal + // sparsness adjacency factor to forests so that forests don't fade out + // as they transition to roads. + return 0; + } + return biome->second.sparseness_adjacency_factor; + }; + + const auto fill_adjacency_factor = [&dat, &get_sparseness_adjacency_factor]( int self_factor ) { + dat.fill( self_factor ); + for( int i = 0; i < 4; i++ ) { + dat.dir( i ) += get_sparseness_adjacency_factor( dat.t_nesw[i] ); + } + }; + + const ter_furn_id no_ter_furn = ter_furn_id(); + + const auto get_feature_for_neighbor = [&dat, + &no_ter_furn]( const std::map &biome_features, + const om_direction::type dir ) { + const oter_id dir_ot = dat.neighbor_at( dir ); + const auto feature = biome_features.find( dir_ot ); + if( feature == biome_features.end() ) { + // If we have no biome for this neighbor, then we just return any empty feature. + // As with the sparseness adjacency factor, it's possible to define non-forest + // biomes in the regional settings so that they provide neighbor features + // here for blending purposes (e.g. define dirt terrain for roads so that the + // ground fades from forest ground cover to dirt as blends with roads. + return no_ter_furn; + } + return feature->second; + }; + + // The max sparseness is calculated across all the possible biomes, not just the adjacent ones. + const auto get_max_sparseness_adjacency_factor = [&dat]() { + if( dat.region.forest_composition.biomes.size() == 0 ) { + return 0; + } + std::vector factors; + for( auto &b : dat.region.forest_composition.biomes ) { + factors.push_back( b.second.sparseness_adjacency_factor ); + } + return *max_element( std::begin( factors ), std::end( factors ) ); + }; + + // Get the sparesness factor for this terrain, and fill it. + const int factor = get_sparseness_adjacency_factor( terrain_type ); + fill_adjacency_factor( factor ); + + const int max_factor = get_max_sparseness_adjacency_factor(); + + // Our margins for blending divide the overmap terrain into nine sections. + static constexpr int margin_x = SEEX * 2 / 3; + static constexpr int margin_y = SEEY * 2 / 3; + + const auto get_blended_feature = [&no_ter_furn, &max_factor, &factor, + &get_feature_for_neighbor, &terrain_type, &dat]( int x, int y ) { + // Pick one random feature from each biome according to the biome defs and save it into a lookup. + // We'll blend these features together below based on the current and adjacent terrains. + std::map biome_features; + for( auto &b : dat.region.forest_composition.biomes ) { + biome_features[b.first] = b.second.pick(); + } + + // Get a feature for ourself and each of the adjacent overmap terrains. + const ter_furn_id east_feature = get_feature_for_neighbor( biome_features, + om_direction::type::east ); + const ter_furn_id west_feature = get_feature_for_neighbor( biome_features, + om_direction::type::west ); + const ter_furn_id north_feature = get_feature_for_neighbor( biome_features, + om_direction::type::north ); + const ter_furn_id south_feature = get_feature_for_neighbor( biome_features, + om_direction::type::south ); + const ter_furn_id self_feature = biome_features[terrain_type]; + + // We'll use our margins and the four adjacent overmap terrains to pick a blended + // feature based on the features we picked above and a linear weight as we + // transition through the margins. + // + // (0,0) NORTH + // --------------- + // | NW | W | NE | + // |----|---|----| + // WEST | W | | E | EAST + // |----|---|----| + // | SW | S | SE | + // --------------- + // SOUTH (SEEX * 2, SEEY * 2) + + const int west_weight = std::max( margin_x - x, 0 ); + const int east_weight = std::max( x - ( SEEX * 2 - margin_x ) + 1, 0 ); + const int north_weight = std::max( margin_y - y, 0 ); + const int south_weight = std::max( y - ( SEEY * 2 - margin_y ) + 1, 0 ); + + // We'll build a weighted list of features to pull from at the end. + weighted_int_list feature_pool; + + // W sections + if( x < margin_x ) { + // NW corner - blend N, W, and self + if( y < margin_y ) { + feature_pool.add( no_ter_furn, 3 * max_factor - ( dat.n_fac + dat.w_fac + factor * 2 ) ); + feature_pool.add( self_feature, 1 ); + feature_pool.add( west_feature, west_weight ); + feature_pool.add( north_feature, north_weight ); + } + // SW corner - blend S, W, and self + else if( y > SEEY * 2 - margin_y ) { + feature_pool.add( no_ter_furn, 3 * max_factor - ( dat.s_fac + dat.w_fac + factor * 2 ) ); + feature_pool.add( self_feature, factor ); + feature_pool.add( west_feature, west_weight ); + feature_pool.add( south_feature, south_weight ); + } + // W edge - blend W and self + else { + feature_pool.add( no_ter_furn, 2 * max_factor - ( dat.w_fac + factor * 2 ) ); + feature_pool.add( self_feature, factor ); + feature_pool.add( west_feature, west_weight ); + } + } + // E sections + else if( x > SEEX * 2 - margin_x ) { + // NE corner - blend N, E, and self + if( y < margin_y ) { + feature_pool.add( no_ter_furn, 3 * max_factor - ( dat.n_fac + dat.e_fac + factor * 2 ) ); + feature_pool.add( self_feature, factor ); + feature_pool.add( east_feature, east_weight ); + feature_pool.add( north_feature, north_weight ); + } + // SE corner - blend S, E, and self + else if( y > SEEY * 2 - margin_y ) { + feature_pool.add( no_ter_furn, 3 * max_factor - ( dat.s_fac + dat.e_fac + factor * 2 ) ); + feature_pool.add( self_feature, factor ); + feature_pool.add( east_feature, east_weight ); + feature_pool.add( south_feature, south_weight ); + } + // E edge - blend E and self + else { + feature_pool.add( no_ter_furn, 2 * max_factor - ( dat.e_fac + factor * 2 ) ); + feature_pool.add( self_feature, factor ); + feature_pool.add( east_feature, east_weight ); + } + } + // Central sections + else { + // N edge - blend N and self + if( y < margin_y ) { + feature_pool.add( no_ter_furn, 2 * max_factor - ( dat.n_fac + factor * 2 ) ); + feature_pool.add( self_feature, factor ); + feature_pool.add( north_feature, north_weight ); + } + // S edge - blend S, and self + else if( y > SEEY * 2 - margin_y ) { + feature_pool.add( no_ter_furn, 2 * max_factor - ( dat.s_fac + factor * 2 ) ); + feature_pool.add( self_feature, factor ); + feature_pool.add( south_feature, south_weight ); + } + // center - no blending + else { + feature_pool.add( no_ter_furn, max_factor - factor * 2 ); + feature_pool.add( self_feature, factor ); + } + } + + // Pick a single feature from the pool we built above and return it. + const ter_furn_id *feature = feature_pool.pick(); + if( feature == nullptr ) { + return no_ter_furn; + } else { + return *feature; + } + }; + + // Get the current biome def for this terrain. + const auto current_biome_def_it = dat.region.forest_composition.biomes.find( terrain_type ); + + // If there is no biome def for this terrain, fill in with the region's default ground cover + // and bail--nothing more to be done. + if( current_biome_def_it == dat.region.forest_composition.biomes.end() ) { + dat.fill_groundcover(); + return; + } + + const forest_biome current_biome_def = current_biome_def_it->second; + + // If this biome does not define its own groundcover, then fill with the region's ground + // cover. Otherwise, fill with the biome defs groundcover. + if( current_biome_def.groundcover.size() == 0 ) { + dat.fill_groundcover(); + } else { + m->draw_fill_background( current_biome_def.groundcover ); + } + + // Loop through each location in this overmap terrain and attempt to place a feature. + for( int x = 0; x < SEEX * 2; x++ ) { + for( int y = 0; y < SEEY * 2; y++ ) { + const ter_furn_id feature = get_blended_feature( x, y ); + ter_or_furn_set( m, x, y, feature ); + + // Special handling from the original map gen: a chance of spawning cattails on fresh water in swamp biomes. + // TODO: think of a good way to move this sort of dependent spawning into the biome def + if( terrain_type == "forest_water" && feature.ter == t_water_sh ) { + if( one_in( 2 ) ) { + m->furn_set( x, y, f_cattails ); + } + } + } + } + + // Place items on this terrain as defined in the biome. + for( int i = 0; i < current_biome_def.item_spawn_iterations; i++ ) { + m->place_items( current_biome_def.item_group, current_biome_def.item_group_chance, 0, 0, + SEEX * 2 - 1, SEEY * 2 - 1, true, turn ); + } +} + void mremove_trap( map *m, int x, int y ) { tripoint actual_location( x, y, m->get_abs_sub().z ); @@ -3804,70 +3820,132 @@ void madd_field( map *m, int x, int y, field_id t, int density ) m->add_field( actual_location, t, density, 0 ); } -void place_stairs( map *m, oter_id terrain_type, mapgendata dat, - const int actual_house_height, const int lw, const int rw ) +bool is_suitable_for_stairs( const map *const m, const tripoint &p ) +{ + const ter_t &p_ter = m->ter( p ).obj(); + + return + p_ter.has_flag( "INDOORS" ) && + p_ter.has_flag( "FLAT" ) && + m->furn( p ) == f_null; +} + +void stairs_debug_log( const map *const m, const std::string &msg, const tripoint &p, + DebugLevel level = D_INFO ) +{ + const ter_t &p_ter = m->ter( p ).obj(); + + dbg( level ) + << msg + << " tripoint: " << p + << " terrain: " << p_ter.name() + << " movecost: " << p_ter.movecost + << " furniture: " << m->furn( p ) + << " indoors: " << p_ter.has_flag( "INDOORS" ) + << " flat: " << p_ter.has_flag( "FLAT" ) + ; +} + +void place_stairs( map *m, oter_id terrain_type, mapgendata dat ) { if( !dat.has_basement() ) { return; } const bool force = get_option( "ALIGN_STAIRS" ); - // Find the basement's stairs first + const tripoint abs_sub_here = m->get_abs_sub(); + tinymap basement; basement.load( abs_sub_here.x, abs_sub_here.y, abs_sub_here.z - 1, false ); - std::vector upstairs; - const tripoint from( 0, 0, abs_sub_here.z - 1 ); - const tripoint to( SEEX * 2, SEEY * 2, abs_sub_here.z - 1 ); - for( const tripoint &p : m->points_in_rectangle( from, to ) ) { - if( basement.has_flag( TFLAG_GOES_UP, p ) ) { - upstairs.emplace_back( p ); - } - } - - bool placed_any = false; - for( const tripoint &p : upstairs ) { - static const tripoint up = tripoint( 0, 0, 1 ); - const tripoint here = om_direction::rotate( p + up, terrain_type->get_dir() ); - // @todo: Less ugly check - // If aligning isn't forced, allow only floors. Otherwise allow all non-walls - const ter_t &ter_here = m->ter( here ).obj(); - if( ( force && ter_here.movecost > 0 ) || - ( ter_here.has_flag( "INDOORS" ) && ter_here.has_flag( "FLAT" ) ) ) { - m->ter_set( here, t_stairs_down ); - placed_any = true; - } - // Try to push away furniture - const furn_id furn_here = m->furn( here ); - if( furn_here != f_null ) { - for( const tripoint &push_point : m->points_in_radius( here, 1 ) ) { - if( m->furn( push_point ) == f_null ) { - m->furn_set( push_point, furn_here ); - break; - } - } - m->furn_set( here, f_null ); + + const tripoint down( 0, 0, -1 ); + const tripoint from( 0, 0, abs_sub_here.z ); + const tripoint to( SEEX * 2, SEEY * 2, abs_sub_here.z ); + tripoint_range tr = m->points_in_rectangle( from, to ); + std::vector stairs; + std::vector tripoints; + + // Find the basement's stairs first. + for( auto &&p : tr ) { + if( basement.has_flag( TFLAG_GOES_UP, p + down ) ) { + const tripoint rotated = om_direction::rotate( p, terrain_type->get_dir() ); + stairs.emplace_back( rotated ); + stairs_debug_log( m, "basement stairs:", rotated ); + } + + if( is_suitable_for_stairs( m, p ) ) { + tripoints.emplace_back( p ); } } - // If not forcing alignment and didn't place any stairs, allow legacy stair placement - // Note: any, not all - legacy stairs wouldn't deal well with multiple random stairs - if( !placed_any && !force ) { - // Legacy stair spawning code - allows teleports - int attempts = 100; - int stairs_height = actual_house_height - 1; - do { - int rn = rng( lw + 1, rw - 1 ); - // After 50 failed attempts, relax the placement limitations a bit - // Otherwise it will most likely fail the next 50 too - if( attempts < 50 ) { - stairs_height = rng( 1, SEEY ); - } - attempts--; - if( m->ter( rn, stairs_height ) == t_floor && !m->has_furn( rn, stairs_height ) ) { - m->ter_set( rn, stairs_height, t_stairs_down ); + if( stairs.empty() ) { + dbg( D_INFO ) << "no stairs found downstairs"; + return; + } + + // Shuffle tripoints so that the stairs are not always similarly placed. + static auto eng = std::default_random_engine( + std::chrono::system_clock::now().time_since_epoch().count() ); + std::shuffle( std::begin( tripoints ), std::end( tripoints ), eng ); + + bool all_can_be_placed = false; + tripoint shift( 0, 0, 0 ); + int match_count = 0; + + // Find a tripoint where all the underground tripoints for stairs are on + // suitable locations aboveground. + for( auto &&p : tripoints ) { + int count = 1; + all_can_be_placed = true; + stairs_debug_log( m, "ok first:", p ); + + // First element can be ignored as p is already ok. + for( auto it = stairs.begin() + 1; it != stairs.end(); ++it ) { + // Align tripoint with the first underground tripoint. + const tripoint &stair = *it - stairs.front() + p; + + if( !is_suitable_for_stairs( m, stair ) ) { + stairs_debug_log( m, "not ok:", stair ); + all_can_be_placed = false; + + if( match_count < count ) { + match_count = count; + shift = p - stairs.front(); + dbg( D_INFO ) << "partial match shift tripoint: " << shift; + } + break; } - } while( attempts > 0 ); + + stairs_debug_log( m, "ok:", stair ); + ++count; + } + + if( all_can_be_placed ) { + shift = p - stairs.front(); + dbg( D_INFO ) << "full match shift tripoint: " << shift; + break; + } + } + + if( !( all_can_be_placed || force ) ) { + dbg( D_WARNING ) << "no stairs were placed"; + return; + } + + if( !all_can_be_placed ) { + dbg( D_WARNING ) << "Some stairs can be placed to suitable locations " + << "and the rest may end up in odd locations."; + } + + for( auto &&p : stairs ) { + tripoint stair = p + shift; + + if( m->ter_set( stair, t_stairs_down ) ) { + stairs_debug_log( m, "stairs placed:", stair ); + } else { + stairs_debug_log( m, "stairs not placed:", stair, D_WARNING ); + } } } diff --git a/src/mapgen_functions.h b/src/mapgen_functions.h index 9e645afa8498d..e84cbd2f226bb 100644 --- a/src/mapgen_functions.h +++ b/src/mapgen_functions.h @@ -110,8 +110,8 @@ void mapgen_field( map *m, oter_id terrain_type, mapgendata dat, const time_poin float density ); void mapgen_dirtlot( map *m, oter_id terrain_type, mapgendata dat, const time_point &time, float density ); -void mapgen_forest_general( map *m, oter_id terrain_type, mapgendata dat, const time_point &time, - float density ); +void mapgen_forest( map *m, oter_id terrain_type, mapgendata dat, const time_point &time, + float density ); void mapgen_hive( map *m, oter_id terrain_type, mapgendata dat, const time_point &time, float density ); void mapgen_spider_pit( map *m, oter_id terrain_type, mapgendata dat, const time_point &time, @@ -228,7 +228,6 @@ void mremove_trap( map *m, int x, int y ); void mtrap_set( map *m, int x, int y, trap_id t ); void madd_field( map *m, int x, int y, field_id t, int density ); -void place_stairs( map *m, oter_id terrain_type, mapgendata dat, - const int actual_house_height = SEEY * 2, const int lw = 0, const int rw = SEEX * 2 - 1 ); +void place_stairs( map *m, oter_id terrain_type, mapgendata dat ); #endif diff --git a/src/messages.cpp b/src/messages.cpp index bfc9e6f435cc6..9f2b2f7631e46 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -8,6 +8,7 @@ #include "calendar.h" #include "translations.h" #include "string_formatter.h" +#include "string_input_popup.h" #include #include @@ -235,135 +236,430 @@ bool Messages::has_undisplayed_messages() return player_messages.has_undisplayed_messages(); } -void Messages::display_messages() +// Returns pairs of message log type id and untranslated name +static const std::vector> &msg_type_and_names() +{ + static const std::vector> type_n_names = { + { m_good, translate_marker_context( "message type", "good" ) }, + { m_bad, translate_marker_context( "message type", "bad" ) }, + { m_mixed, translate_marker_context( "message type", "mixed" ) }, + { m_warning, translate_marker_context( "message type", "warning" ) }, + { m_info, translate_marker_context( "message type", "info" ) }, + { m_neutral, translate_marker_context( "message type", "neutral" ) }, + { m_debug, translate_marker_context( "message type", "debug" ) }, + }; + return type_n_names; +} + +// Get message type from translated name, returns true if name is a valid translated name +static bool msg_type_from_name( game_message_type &type, const std::string &name ) { - catacurses::window w = catacurses::newwin( - FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, - ( TERMY > FULL_SCREEN_HEIGHT ) ? ( TERMY - FULL_SCREEN_HEIGHT ) / 2 : 0, - ( TERMX > FULL_SCREEN_WIDTH ) ? ( TERMX - FULL_SCREEN_WIDTH ) / 2 : 0 ); + for( const auto &p : msg_type_and_names() ) { + if( name == pgettext( "message type", p.second ) ) { + type = p.first; + return true; + } + } + return false; +} - input_context ctxt( "MESSAGE_LOG" ); +namespace Messages +{ +class dialog +{ + public: + dialog(); + void run(); + private: + void init(); + void show(); + void input(); + void do_filter( const std::string &filter_str ); + static std::vector filter_help_text( int width ); + + const nc_color border_color; + const nc_color filter_color; + const nc_color time_color; + const nc_color bracket_color; + const nc_color filter_help_color; + + const char *time_fmt; + + // border_width border_width + // v v + // + // | 12 seconds Never mind. x 2 | + // + // '-----v-----''---------v---------' + // time_width msg_width + static constexpr int border_width = 1; + int unit_width, time_width, msg_width; + + size_t max_lines; // Max number of lines the window can show at once + + int w_x, w_y, w_width, w_height; // Main window position + catacurses::window w; // Main window + + int w_fh_x, w_fh_y, w_fh_width, w_fh_height; // Filter help window position + catacurses::window w_filter_help; // Filter help window + + std::vector help_text; // Folded filter help text + + string_input_popup filter; + bool filtering; + std::string filter_str; + + input_context ctxt; + + // Message indices and folded strings + std::vector> folded_all; + // Indices of filtered messages + std::vector folded_filtered; + + size_t offset; // Index of the first printed message + + bool canceled; + bool errored; +}; +} + +Messages::dialog::dialog() + : border_color( BORDER_COLOR ), filter_color( c_white ), + time_color( c_light_blue ), bracket_color( c_dark_gray ), + filter_help_color( c_cyan ) +{ + init(); +} + +void Messages::dialog::init() +{ + w_width = std::min( TERMX, FULL_SCREEN_WIDTH ); + w_height = std::min( TERMY, FULL_SCREEN_HEIGHT ); + w_x = ( TERMX - w_width ) / 2; + w_y = ( TERMY - w_height ) / 2; + + w = catacurses::newwin( w_height, w_width, w_y, w_x ); + + ctxt = input_context( "MESSAGE_LOG" ); ctxt.register_action( "UP", _( "Scroll up" ) ); ctxt.register_action( "DOWN", _( "Scroll down" ) ); + ctxt.register_action( "PAGE_UP" ); + ctxt.register_action( "PAGE_DOWN" ); + ctxt.register_action( "FILTER" ); + ctxt.register_action( "RESET_FILTER" ); ctxt.register_action( "QUIT" ); ctxt.register_action( "HELP_KEYBINDINGS" ); - /* Right-Aligning Time Epochs For Readability - * ========================================== - * Given display_messages(); right-aligns epochs, we must declare one quick variable first: - * max_padlength refers to the length of the LONGEST possible unit of time returned by to_string_clipped() any language has to offer. - * This variable is, for now, set to '10', which seems most reasonable. - * - * The reason right-aligned epochs don't use a "shortened version" (e.g. only showing the first letter) boils down to: - * 1. The first letter of every time unit being unique is a property that might not carry across to other languages. - * 2. Languages where displayed characters change depending on the characters preceding/following it will become unclear. - * 3. Some polymorphic languages might not be able to appropriately convey meaning with one character (FRS is not a linguist- correct her on this if needed.) - * - * This right padlength is then incorporated into a so-called 'epoch_format' which, in turn, will be used to format the correct epoch. - * If an external language introduces time units longer than 10 characters in size, consider altering these variables. - * The game (likely) shan't segfault, though the text may appear a bit messed up if these variables aren't set properly. - */ - const int max_padlength = 10; - - /* Dealing With Screen Extremities - * =============================== - * 'maxlength' corresponds to the most extreme length a log message may be before foldstring() wraps it around to two or more lines. - * The numbers subtracted from FULL_SCREEN_WIDTH are - in order: - * '-2' the characters reserved for the borders of the box, both on the left and right side. - * '-1' the leftmost guide character that's drawn on screen. - * '-4' the padded three-digit number each epoch starts with. - * '-max_padlength' the characters of space that are allocated to time units (e.g. "years", "minutes", etc.) - * - * 'bottom' works much like 'maxlength', but instead it refers to the amount of lines that the message box may hold. - */ - const int maxlength = FULL_SCREEN_WIDTH - 2 - 1 - 4 - max_padlength; - const int bottom = FULL_SCREEN_HEIGHT - 2; - const int msg_count = size(); - - /* Dealing With Scroll Direction - * ============================= - * Much like how the sidebar can have variable scroll direction, so will the message box. - * To properly differentiate the two methods of displaying text, we will label them NEWEST-TOP, and OLDEST-TOP. This labeling should be self explanatory. - * - * LIMITATIONS: - * 1. If there are multi-line messages among the oldest ones, the text cannot be fully scrolled to the top/bottom, - * since the message box is drawn using message index rather than actual line number. - * 2. Markers will change when skipping through multi-line messages, since `offset` is only the number of messages - * instead of the line count of these messages. - * - * log_from_top: display the newest message at the top if true, bottom if false. - * offset: index of the message from which to start displaying, from the newest to the oldest. - * line: the current line of folded message for display, either from the top or the bottom. - * scr_line: the current line of folded message for display, from the top. - * retrieve_history: the current index of message for display, from the newest to the oldest. - * folded_ind: current line index of the folded message. - */ - for( int offset = 0;; ) { - werase( w ); - draw_border( w ); - center_print( w, bottom + 1, c_red, - string_format( _( "Press %s to return" ), ctxt.get_desc( "QUIT" ).c_str() ) ); - int scroll = log_from_top ? offset : msg_count - bottom - offset; - draw_scrollbar( w, scroll, bottom, msg_count, 1, 0, c_white, true ); - - time_duration lasttime = -1_turns; - for( int line = 0, retrieve_history = offset; - line < bottom && retrieve_history < msg_count; ++retrieve_history ) { - const game_message &m = player_messages.history( retrieve_history ); - const time_duration timepassed = calendar::turn - m.timestamp_in_turns; - std::string long_ago = to_string_clipped( timepassed ); - nc_color col = msgtype_to_color( m.type, false ); - - auto &&folded_strings = foldstring( m.get_with_count(), maxlength ); - int folded_size( folded_strings.size() ); - int scr_line = log_from_top ? line : std::max( 0, bottom - line - folded_size ); - // Here we separate the unit and amount from one another so that they can be properly padded when they're drawn on the screen. - // Note that the very first character of 'unit' is often a space (except for languages where the time unit directly follows the number.) - const auto amount_len = long_ago.find_first_not_of( "0123456789" ); - std::string amount = long_ago.substr( 0, amount_len ); - std::string unit = long_ago.substr( amount_len ); - if( timepassed != lasttime ) { - right_print( w, scr_line + 1, 2, c_light_blue, string_format( _( "%-3s%-10s" ), amount.c_str(), - unit.c_str() ) ); - lasttime = timepassed; - } + // string_format does not handle alignment of utf8 strings correctly, so we have to hack it here + //~ Change '7' in %7s to the maximum display width of all time units in the target language. + const auto &unit_fmt = pgettext( "message log", "%7s" ); + //~ Time format in the message log window, %3d is the time number, %s is the (already aligned) time unit. + time_fmt = pgettext( "message log", "%3d %s " ); - nc_color col_out = col; - for( int folded_ind = log_from_top ? 0 : folded_size - 1; - folded_ind >= 0 && folded_ind < folded_size && line < bottom; - ( log_from_top ? ++folded_ind : --folded_ind ), ++line ) { - scr_line = log_from_top ? line : bottom - line - 1; - print_colored_text( w, scr_line + 1, 2, col_out, col, folded_strings[folded_ind] ); - - // So-called special "markers"- alternating '=' and '-'s at the edges of te message window so players can properly make sense of which message belongs to which time interval. - // The '+offset%4' in the calculation makes it so that the markings scroll along with the messages. - // On lines divisible by 4, draw a dark gray '-' at both horizontal extremes of the window. - if( ( line + offset % 4 ) % 4 == 0 ) { - mvwprintz( w, scr_line + 1, 1, c_dark_gray, "-" ); - mvwprintz( w, scr_line + 1, FULL_SCREEN_WIDTH - 2, c_dark_gray, "-" ); - // On lines divisible by 2 (but not 4), draw a light gray '=' at the horizontal extremes of the window. - } else if( ( line + offset % 4 ) % 2 == 0 ) { - mvwprintz( w, scr_line + 1, 1, c_light_gray, "=" ); - mvwprintz( w, scr_line + 1, FULL_SCREEN_WIDTH - 2, c_light_gray, "=" ); - } + // Use unit_fmt and time_fmt to determine time string width + unit_width = utf8_width( string_format( unit_fmt, "" ) ); + time_width = utf8_width( string_format( time_fmt, 0, string_format( unit_fmt, "" ) ) ); + + if( border_width * 2 + time_width >= w_width || + border_width * 2 >= w_height ) { + + debugmsg( "No enough space for the message window" ); + errored = true; + return; + } + msg_width = w_width - border_width * 2 - time_width; + max_lines = static_cast( w_height - border_width * 2 ); + + // Initialize filter help text and window + w_fh_width = w_width; + w_fh_x = w_x; + help_text = filter_help_text( w_fh_width - border_width * 2 ); + w_fh_height = help_text.size() + border_width * 2; + w_fh_y = w_y + w_height - w_fh_height; + w_filter_help = catacurses::newwin( w_fh_height, w_fh_width, w_fh_y, w_fh_x ); + + // Initialize filter input + filter.window( w_filter_help, border_width + 2, w_fh_height - 1, w_fh_width - border_width - 2 ); + filtering = false; + + // Initialize folded messages + folded_all.clear(); + folded_filtered.clear(); + const size_t msg_count = size(); + for( size_t ind = 0; ind < msg_count; ++ind ) { + const size_t msg_ind = log_from_top ? ind : msg_count - 1 - ind; + const game_message &msg = player_messages.history( msg_ind ); + const auto &folded = foldstring( msg.get_with_count(), msg_width ); + for( auto it = folded.begin(); it != folded.end(); ++it ) { + folded_filtered.emplace_back( folded_all.size() ); + folded_all.emplace_back( msg_ind, *it ); + } + } + + // Initialize scrolling offset + if( log_from_top || max_lines > folded_filtered.size() ) { + offset = 0; + } else { + offset = folded_filtered.size() - max_lines; + } + + canceled = false; + errored = false; +} + +void Messages::dialog::show() +{ + werase( w ); + draw_border( w, border_color ); + + scrollbar() + .offset_x( 0 ) + .offset_y( border_width ) + .content_size( folded_filtered.size() ) + .viewport_pos( offset ) + .viewport_size( max_lines ) + .apply( w ); + + // Range of window lines to print + size_t line_from = 0, line_to; + if( offset < folded_filtered.size() ) { + line_to = std::min( max_lines, folded_filtered.size() - offset ); + } else { + line_to = 0; + } + + if( !log_from_top ) { + // Always print from new to old + std::swap( line_from, line_to ); + } + std::string prev_time_str; + bool printing_range = false; + for( size_t line = line_from; line != line_to; ) { + // Decrement here if printing from bottom to get the correct line number + if( !log_from_top ) { + --line; + } + + const size_t folded_ind = offset + line; + const size_t msg_ind = folded_all[folded_filtered[folded_ind]].first; + const game_message &msg = player_messages.history( msg_ind ); + + nc_color col = msgtype_to_color( msg.type, false ); + + // Print current line + print_colored_text( w, border_width + line, border_width + time_width, col, col, + folded_all[folded_filtered[folded_ind]].second ); + + // Generate aligned time string + const time_point msg_time = msg.timestamp_in_turns; + const auto &num_n_unit = to_num_and_unit( calendar::turn - msg_time ); + const auto u8w = utf8_width( num_n_unit.second ); + std::string time_str; + + if( num_n_unit.first.has_value() ) { + if( u8w < unit_width ) { + // string_format does not handle utf8 string width correctly, we have to insert our own padding + time_str = string_format( time_fmt, num_n_unit.first.value(), + std::string( unit_width - u8w, ' ' ) + num_n_unit.second ); + } else { + time_str = string_format( time_fmt, num_n_unit.first.value(), num_n_unit.second ); + } + } else { + // not likely, but just in case + if( u8w < time_width ) { + time_str = std::string( time_width - u8w, ' ' ) + num_n_unit.second; + } else { + time_str = num_n_unit.second; } } + if( time_str != prev_time_str ) { + // Time changed, print time string + prev_time_str = time_str; + right_print( w, border_width + line, border_width + msg_width, time_color, time_str ); + printing_range = false; + } else { + // Print line brackets to mark ranges of time + if( printing_range ) { + const size_t last_line = log_from_top ? line - 1 : line + 1; + wattron( w, bracket_color ); + mvwaddch( w, border_width + last_line, border_width + time_width - 2, LINE_XOXO ); + wattroff( w, bracket_color ); + } + wattron( w, bracket_color ); + mvwaddch( w, border_width + line, border_width + time_width - 2, + log_from_top ? LINE_XXOO : LINE_OXXO ); + wattroff( w, bracket_color ); + printing_range = true; + } + + // Decrement for !log_from_top is done at the beginning + if( log_from_top ) { + ++line; + } + } + + if( filtering ) { wrefresh( w ); + // Print the help text + werase( w_filter_help ); + draw_border( w_filter_help, border_color ); + for( size_t line = 0; line < help_text.size(); ++line ) { + nc_color col = filter_help_color; + print_colored_text( w_filter_help, border_width + line, border_width, col, col, + help_text[line] ); + } + mvwprintz( w_filter_help, w_fh_height - 1, border_width, border_color, "< " ); + mvwprintz( w_filter_help, w_fh_height - 1, w_fh_width - border_width - 2, border_color, " >" ); + wrefresh( w_filter_help ); + + // This line is preventing this method from being const + filter.query( false, true ); // Draw only + } else { + if( filter_str.empty() ) { + mvwprintz( w, w_height - 1, border_width, border_color, _( "< Press %s to filter, %s to reset >" ), + ctxt.get_desc( "FILTER" ), ctxt.get_desc( "RESET_FILTER" ) ); + } else { + mvwprintz( w, w_height - 1, border_width, border_color, "< %s >", filter_str ); + mvwprintz( w, w_height - 1, border_width + 2, filter_color, "%s", filter_str ); + } + wrefresh( w ); + } +} + +void Messages::dialog::do_filter( const std::string &filter_str ) +{ + // Split the search string into type and text + bool has_type_filter = false; + game_message_type filter_type = m_neutral; + std::string filter_text; + const auto colon = filter_str.find( ':' ); + if( colon != std::string::npos ) { + has_type_filter = msg_type_from_name( filter_type, filter_str.substr( 0, colon ) ); + filter_text = filter_str.substr( colon + 1 ); + } else { + filter_text = filter_str; + } + + // Start filtering the log + folded_filtered.clear(); + for( size_t folded_ind = 0; folded_ind < folded_all.size(); ) { + const size_t msg_ind = folded_all[folded_ind].first; + const game_message &msg = player_messages.history( msg_ind ); + const bool match = ( !has_type_filter || filter_type == msg.type ) && + ci_find_substr( remove_color_tags( msg.get_with_count() ), filter_text ) >= 0; + + // Always advance the index, but only add to filtered list if the original message matches + for( ; folded_ind < folded_all.size() && folded_all[folded_ind].first == msg_ind; ++folded_ind ) { + if( match ) { + folded_filtered.emplace_back( folded_ind ); + } + } + } + + // Reset view + if( log_from_top || max_lines > folded_filtered.size() ) { + offset = 0; + } else { + offset = folded_filtered.size() - max_lines; + } +} +void Messages::dialog::input() +{ + canceled = false; + if( filtering ) { + filter.query( false ); + if( filter.confirmed() || filter.canceled() ) { + filtering = false; + } + if( !filter.canceled() ) { + const std::string &new_filter_str = filter.text(); + if( new_filter_str != filter_str ) { + filter_str = new_filter_str; + + do_filter( filter_str ); + } + } else { + filter.text( filter_str ); + } + } else { const std::string &action = ctxt.handle_input(); - if( action == "DOWN" || action == "UP" ) { - if( ( action == "DOWN" ) ^ ( log_from_top ) ) { - if( offset > 0 ) { - --offset; - } - } else if( offset < msg_count - bottom ) { - ++offset; + if( action == "DOWN" && offset + max_lines < folded_filtered.size() ) { + ++offset; + } else if( action == "UP" && offset > 0 ) { + --offset; + } else if( action == "PAGE_DOWN" ) { + if( offset + max_lines * 2 <= folded_filtered.size() ) { + offset += max_lines; + } else if( max_lines <= folded_filtered.size() ) { + offset = folded_filtered.size() - max_lines; + } else { + offset = 0; + } + } else if( action == "PAGE_UP" ) { + if( offset >= max_lines ) { + offset -= max_lines; + } else { + offset = 0; } + } else if( action == "FILTER" ) { + filtering = true; + } else if( action == "RESET_FILTER" ) { + filter_str.clear(); + filter.text( filter_str ); + do_filter( filter_str ); } else if( action == "QUIT" ) { - break; + canceled = true; + } + } +} + +void Messages::dialog::run() +{ + while( !errored && !canceled ) { + show(); + input(); + } +} + +std::vector Messages::dialog::filter_help_text( int width ) +{ + const auto &help_fmt = _( + "Format is [[TYPE]:]TEXT. The values for TYPE are: %s\n" + "Examples:\n" + " good:mutation\n" + " :you pick up: 1\n" + " crash!\n" + ); + std::stringstream type_text; + const auto &type_list = msg_type_and_names(); + for( auto it = type_list.begin(); it != type_list.end(); ++it ) { + // Skip m_debug outside debug mode (but allow searching for it) + if( debug_mode || it->first != m_debug ) { + const auto &col_name = get_all_colors().get_name( msgtype_to_color( it->first ) ); + auto next_it = std::next( it ); + // Skip m_debug outside debug mode + if( !debug_mode && next_it != type_list.end() && next_it->first == m_debug ) { + next_it = std::next( next_it ); + } + if( next_it != type_list.end() ) { + //~ the 2nd %s is a type name, this is used to format a list of type names + type_text << string_format( pgettext( "message log", "%s, " ), + col_name, pgettext( "message type", it->second ) ); + } else { + //~ the 2nd %s is a type name, this is used to format the last type name in a list of type names + type_text << string_format( pgettext( "message log", "%s." ), + col_name, pgettext( "message type", it->second ) ); + } } } + return foldstring( string_format( help_fmt, type_text.str() ), width ); +} +void Messages::display_messages() +{ + dialog dlg; + dlg.run(); player_messages.curmes = calendar::turn; } diff --git a/src/mission_companion.cpp b/src/mission_companion.cpp index 91ea1067c149f..38932308f638a 100644 --- a/src/mission_companion.cpp +++ b/src/mission_companion.cpp @@ -4580,7 +4580,7 @@ void talk_function::mission_key_push( std::vector> &m const std::string &dir, bool priority, bool possible ) { mission_entry miss; - miss.id = name_display == "" ? id : name_display; + miss.id = id; miss.name_display = name_display; miss.dir = dir; miss.priority = priority; diff --git a/src/mod_tileset.cpp b/src/mod_tileset.cpp new file mode 100644 index 0000000000000..de1f65141c594 --- /dev/null +++ b/src/mod_tileset.cpp @@ -0,0 +1,64 @@ +#include "mod_tileset.h" +#include "json.h" + +#include +#include + +std::vector all_mod_tilesets; + +void load_mod_tileset( JsonObject &jsobj, const std::string &, const std::string &base_path, + const std::string &full_path ) +{ + // This function didn't loads image data actually, loads when tileset loading. + load_mod_tileset_into_array( jsobj, base_path, full_path, all_mod_tilesets ); +} + +void load_mod_tileset_into_array( JsonObject &jsobj, const std::string &base_path, + const std::string &full_path, + std::vector &mod_tileset_array ) +{ + int new_num_in_file = 1; + // Check mod tileset num in file + for( auto mts : mod_tileset_array ) { + if( mts->get_full_path() == full_path ) { + new_num_in_file++; + } + } + + mod_tileset *new_mts = new mod_tileset( base_path, full_path, new_num_in_file ); + std::vector compatibility = jsobj.get_string_array( "compatibility" ); + for( auto compatible_tileset_id : compatibility ) { + new_mts->add_compatible_tileset( compatible_tileset_id ); + } + mod_tileset_array.push_back( new_mts ); +} + +void reset_mod_tileset() +{ + for( mod_tileset *mts : all_mod_tilesets ) { + delete mts; + } + all_mod_tilesets.clear(); +} + +mod_tileset::mod_tileset( const mod_tileset &obj ) +{ + base_path_ = obj.base_path_; + full_path_ = obj.full_path_; + num_in_file_ = obj.num_in_file_; + copy( obj.compatibility.begin(), obj.compatibility.end(), back_inserter( compatibility ) ); +} + +bool mod_tileset::is_compatible( std::string tileset_id ) const +{ + auto iter = std::find( compatibility.begin(), compatibility.end(), tileset_id ); + if( iter == compatibility.end() ) { + return false; + } + return true; +} + +void mod_tileset::add_compatible_tileset( std::string tileset_id ) +{ + compatibility.push_back( tileset_id ); +} diff --git a/src/mod_tileset.h b/src/mod_tileset.h new file mode 100644 index 0000000000000..0e331f12516b3 --- /dev/null +++ b/src/mod_tileset.h @@ -0,0 +1,58 @@ +#pragma once +#ifndef MOD_TILESET_H +#define MOD_TILESET_H + +#include +#include + +class mod_tileset; +class JsonObject; + +extern std::vector all_mod_tilesets; + +void load_mod_tileset( JsonObject &jsobj, const std::string &, const std::string &base_path, + const std::string &full_path ); +void load_mod_tileset_into_array( JsonObject &jsobj, const std::string &base_path, + const std::string &full_path, + std::vector &mod_tileset_array ); +void reset_mod_tileset(); + +class mod_tileset +{ + public: + mod_tileset() { } + + mod_tileset( const std::string &new_base_path, const std::string &new_full_path, + int new_num_in_file ) : + base_path_( new_base_path ), + full_path_( new_full_path ), + num_in_file_( new_num_in_file ) { } + + mod_tileset( const mod_tileset &obj ); + ~mod_tileset() { + compatibility.clear(); + } + + const std::string &get_base_path() const { + return base_path_; + } + + const std::string &get_full_path() const { + return full_path_; + } + + int num_in_file() const { + return num_in_file_; + } + + bool is_compatible( std::string tileset_id ) const; + void add_compatible_tileset( std::string tileset_id ); + + private: + std::string base_path_; + std::string full_path_; + int num_in_file_; + std::vector compatibility; +}; + +#endif diff --git a/src/monattack.cpp b/src/monattack.cpp index a4c968dec9abb..79da8e496bedc 100644 --- a/src/monattack.cpp +++ b/src/monattack.cpp @@ -3405,20 +3405,16 @@ bool mattack::multi_robot( monster *z ) } int dist = rl_dist( z->pos(), target->pos() ); - if( dist == 1 && one_in( 2 ) ) { + if( dist <= 15 ) { mode = 1; - } else if( dist <= 5 ) { - mode = 2; - } else if( dist <= 20 ) { - mode = 3; } else if( dist <= 30 ) { - mode = 4; + mode = 2; } else if( ( target == &g->u && g->u.in_vehicle ) || z->friendly != 0 || cap > 4 ) { // Primary only kicks in if you're in a vehicle or are big enough to be mistaken for one. // Or if you've hacked it so the turret's on your side. ;-) - if( dist >= 35 && dist < 50 ) { + if( dist >= 30 && dist < 50 ) { // Enforced max-range of 50. mode = 5; cap = 5; @@ -3434,30 +3430,15 @@ bool mattack::multi_robot( monster *z ) } switch( mode ) { case 1: - if( dist <= 1 ) { - taze( z, target ); - } - break; - case 2: - if( dist <= 5 ) { - flame( z, target ); - } - break; - case 3: - if( dist <= 20 ) { + if( dist <= 15 ) { rifle( z, target ); } break; - case 4: + case 2: if( dist <= 30 ) { frag( z, target ); } break; - case 5: - if( dist <= 50 ) { - tankgun( z, target ); - } - break; default: return false; // Weak stuff, shouldn't bother with } diff --git a/src/monmove.cpp b/src/monmove.cpp index bf46c385faac9..c3be10ecdd2a8 100644 --- a/src/monmove.cpp +++ b/src/monmove.cpp @@ -689,17 +689,18 @@ void monster::footsteps( const tripoint &p ) if( made_footstep ) { return; } - if( has_flag( MF_FLIES ) ) { - return; // Flying monsters don't have footsteps! - } made_footstep = true; int volume = 6; // same as player's footsteps + if( has_flag( MF_FLIES ) ) { + volume = 0; // Flying monsters don't have footsteps! + } if( digging() ) { volume = 10; } switch( type->size ) { case MS_TINY: - return; // No sound for the tinies + volume = 0; // No sound for the tinies + break; case MS_SMALL: volume /= 3; break; @@ -714,6 +715,12 @@ void monster::footsteps( const tripoint &p ) default: break; } + if( has_flag( MF_LOUDMOVES ) ) { + volume += 6; + } + if( volume == 0 ) { + return; + } int dist = rl_dist( p, g->u.pos() ); sounds::add_footstep( p, volume, dist, this ); return; diff --git a/src/monstergenerator.cpp b/src/monstergenerator.cpp index 7f27c7953cf5d..eafdcccfacb96 100644 --- a/src/monstergenerator.cpp +++ b/src/monstergenerator.cpp @@ -464,6 +464,7 @@ void MonsterGenerator::init_flags() flag_map["PET_WONT_FOLLOW"] = MF_PET_WONT_FOLLOW; flag_map["DRIPS_NAPALM"] = MF_DRIPS_NAPALM; flag_map["ELECTRIC_FIELD"] = MF_ELECTRIC_FIELD; + flag_map["LOUDMOVES"] = MF_LOUDMOVES; } void MonsterGenerator::set_species_ids( mtype &mon ) diff --git a/src/mtype.h b/src/mtype.h index 3cb463b861690..a49dd40013c3f 100644 --- a/src/mtype.h +++ b/src/mtype.h @@ -160,13 +160,14 @@ enum m_flag : int { MF_NOT_HALLU, // Monsters that will NOT appear when player's producing hallucinations MF_CATFOOD, // This monster will become friendly when fed cat food. MF_CATTLEFODDER, // This monster will become friendly when fed cattle fodder. - MF_BIRDFOOD, // This monster will become friendly when fed bird food. + MF_BIRDFOOD, // This monster will become friendly when fed bird food. MF_DOGFOOD, // This monster will become friendly when fed dog food. MF_MILKABLE, // This monster is milkable. MF_NO_BREED, // This monster doesn't breed, even though it has breed data MF_PET_WONT_FOLLOW, // This monster won't follow the player automatically when tamed. MF_DRIPS_NAPALM, // This monster ocassionally drips napalm on move MF_ELECTRIC_FIELD, // This monster is surrounded by an electrical field that ignites flammable liquids near it + MF_LOUDMOVES, // This monster makes move noises as if ~2 sizes louder, even if flying. MF_MAX // Sets the length of the flags - obviously must be LAST }; diff --git a/src/newcharacter.cpp b/src/newcharacter.cpp index 522041e1168f6..2b2e408236547 100644 --- a/src/newcharacter.cpp +++ b/src/newcharacter.cpp @@ -27,6 +27,7 @@ #include "crafting.h" #include "string_input_popup.h" #include "worldfactory.h" +#include "json.h" #ifndef _MSC_VER #include @@ -72,11 +73,11 @@ void draw_points( const catacurses::window &w, points_left &points, int netPoint static int skill_increment_cost( const Character &u, const skill_id &skill ); struct points_left { - int stat_points = 0; - int trait_points = 0; - int skill_points = 0; + int stat_points; + int trait_points; + int skill_points; - enum point_limit { + enum point_limit : int { FREEFORM = 0, ONE_POOL, MULTI_POOL @@ -182,7 +183,7 @@ tab_direction set_description( const catacurses::window &w, player &u, bool allo points_left &points ); static cata::optional query_for_template_name(); -static void save_template( const player &u, const std::string &name ); +static void save_template( const player &u, const std::string &name, const points_left &points ); void reset_scenario( player &u, const scenario *scen ); void Character::pick_name( bool bUseDefault ) @@ -219,21 +220,6 @@ matype_id choose_ma_style( const character_type type, const std::vectorclear(); @@ -543,7 +526,7 @@ bool player::create( character_type type, const std::string &tempname ) return false; } - save_template( *this, _( "Last Character" ) ); + save_template( *this, _( "Last Character" ), points ); recalc_hp(); for( int i = 0; i < num_hp_parts; i++ ) { @@ -2379,29 +2362,8 @@ tab_direction set_description( const catacurses::window &w, player &u, const boo // Return tab_direction::NONE so we re-enter this tab again, but it forces a complete redrawing of it. return tab_direction::NONE; } else if( action == "SAVE_TEMPLATE" ) { - static const auto save_template = [&u]() { - if( const auto name = query_for_template_name() ) { - ::save_template( u, *name ); - } - }; - if( points.has_spare() ) { - if( query_yn( _( "You are attempting to save a template with unused points. " - "Any unspent points will be lost, are you sure you want to proceed?" ) ) ) { - save_template(); - } - } else if( !points.is_valid() ) { - if( points.skill_points_left() < 0 ) { - popup( _( "You cannot save a template with this many points allocated, change some features and try again." ) ); - } else if( points.trait_points_left() < 0 ) { - popup( _( "You cannot save a template with this many trait points allocated, change some traits or lower some stats and try again." ) ); - } else if( points.stat_points_left() < 0 ) { - popup( _( "You cannot save a template with this many stat points allocated, lower some stats and try again." ) ); - } else { - popup( _( "You cannot save a template with negative unused points." ) ); - } - - } else { - save_template(); + if( const auto name = query_for_template_name() ) { + ::save_template( u, *name, points ); } redraw = true; } else if( action == "PICK_RANDOM_NAME" ) { @@ -2557,7 +2519,7 @@ cata::optional query_for_template_name() } } -void save_template( const player &u, const std::string &name ) +void save_template( const player &u, const std::string &name, const points_left &points ) { std::string native = utf8_to_native( name ); #if (defined _WIN32 || defined __WIN32__) @@ -2571,12 +2533,59 @@ void save_template( const player &u, const std::string &name ) return; } #endif - std::string playerfile = FILENAMES["templatedir"] + native + ".template"; - write_to_file( playerfile, [&]( std::ostream & fout ) { - fout << u.save_info(); + + write_to_file( FILENAMES["templatedir"] + native + ".template", [&]( std::ostream & fout ) { + JsonOut jsout( fout, true ); + + jsout.start_array(); + + jsout.start_object(); + jsout.member( "stat_points", points.stat_points ); + jsout.member( "trait_points", points.trait_points ); + jsout.member( "skill_points", points.skill_points ); + jsout.member( "limit", points.limit ); + jsout.end_object(); + + u.serialize( jsout ); + + jsout.end_array(); }, _( "player template" ) ); } +bool player::load_template( const std::string &template_name, points_left &points ) +{ + return read_from_file_json( FILENAMES["templatedir"] + utf8_to_native( template_name ) + + ".template", [&]( JsonIn & jsin ) { + + if( jsin.test_array() ) { + // not a legacy template + jsin.start_array(); + + if( jsin.end_array() ) { + return; + } + + JsonObject jobj = jsin.get_object(); + + points.stat_points = jobj.get_int( "stat_points" ); + points.trait_points = jobj.get_int( "trait_points" ); + points.skill_points = jobj.get_int( "skill_points" ); + points.limit = static_cast( jobj.get_int( "limit" ) ); + + if( jsin.end_array() ) { + return; + } + } + + deserialize( jsin ); + + if( MAP_SHARING::isSharing() ) { + // just to make sure we have the right name + name = MAP_SHARING::getUsername(); + } + } ); +} + void reset_scenario( player &u, const scenario *scen ) { auto psorter = profession_sorter; diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 60d631a1f19ca..3756bc1dff44d 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -294,6 +294,7 @@ float npc::character_danger( const Character &uc ) const if( u_gun && !my_gun ) { u_weap_val *= 1.5f; } + ret += u_weap_val; ret += hp_percentage() * get_hp_max( hp_torso ) / 100.0 / my_weap_val; diff --git a/src/output.cpp b/src/output.cpp index 679e39d22e4e7..2a3ec9916aebc 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -70,12 +70,49 @@ std::vector foldstring( std::string str, int width ) } std::stringstream sstr( str ); std::string strline; + std::vector tags; while( std::getline( sstr, strline, '\n' ) ) { std::string wrapped = word_rewrap( strline, width ); std::stringstream swrapped( wrapped ); std::string wline; while( std::getline( swrapped, wline, '\n' ) ) { - lines.push_back( wline ); + // Ensure that each line is independently color-tagged + // Re-add tags closed in the previous line + const std::string rawwline = wline; + if( !tags.empty() ) { + std::stringstream swline; + for( const std::string &tag : tags ) { + swline << tag; + } + swline << wline; + wline = swline.str(); + } + // Process the additional tags in the current line + const std::vector tags_pos = get_tag_positions( rawwline ); + for( const size_t tag_pos : tags_pos ) { + if( tag_pos + 1 < rawwline.size() && rawwline[tag_pos + 1] == '/' ) { + if( !tags.empty() ) { + tags.pop_back(); + } + } else { + auto tag_end = rawwline.find( '>', tag_pos ); + if( tag_end != std::string::npos ) { + tags.emplace_back( rawwline.substr( tag_pos, tag_end + 1 - tag_pos ) ); + } + } + } + // Close any unclosed tags + if( !tags.empty() ) { + std::stringstream swline; + swline << wline; + for( auto it = tags.rbegin(); it != tags.rend(); ++it ) { + // currently the only closing tag is + swline << ""; + } + wline = swline.str(); + } + // The resulting line can be printed independently and have the correct color + lines.emplace_back( wline ); } } return lines; @@ -856,9 +893,10 @@ void draw_item_filter_rules( const catacurses::window &win, int starty, int heig starty += 1 + fold_and_print( win, starty, 1, len, c_white, _( "Example: -pipe,-chunk,-steel" ) ); } - starty += fold_and_print( win, starty, 1, len, c_white, _( "Search [c]ategory or [m]aterial:" ) ); + starty += fold_and_print( win, starty, 1, len, c_white, + _( "Search [c]ategory, [m]aterial, or [q]uality:" ) ); //~ An example of how to filter items based on category or material. - fold_and_print( win, starty, 1, len, c_white, _( "Example: c:food,m:iron" ) ); + fold_and_print( win, starty, 1, len, c_white, _( "Example: c:food,m:iron,q:hammering" ) ); wrefresh( win ); } @@ -1156,6 +1194,7 @@ std::string word_rewrap( const std::string &in, int width ) } } + const int old_j = j; j += ANY_LENGTH - len; if( skipping_tag ) { @@ -1172,7 +1211,19 @@ std::string word_rewrap( const std::string &in, int width ) x += mk_wcwidth( uc ); + if( uc == ' ' || uc >= 0x2E80 ) { // space or CJK characters + if( x <= width ) { + lastwb = j; // break after character + } else { + lastwb = old_j; // break before character + } + } + if( x > width ) { + if( lastwb == lastout ) { + lastwb = old_j; + } + // old_j may equal to lastout, this checks it and ensures there's at least one character in the line. if( lastwb == lastout ) { lastwb = j; } @@ -1186,10 +1237,6 @@ std::string word_rewrap( const std::string &in, int width ) } else { just_wrapped = false; } - - if( uc == ' ' || uc >= 0x2E80 ) { - lastwb = j; - } } for( int k = lastout; k < ( int )in.size(); k++ ) { o << in[k]; @@ -1257,7 +1304,7 @@ void draw_subtab( const catacurses::window &w, int iOffsetX, std::string sText, } /** - * Draw a scrollbar + * Draw a scrollbar (Legacy function, use class scrollbar instead!) * @param window Pointer of window to draw on * @param iCurrentLine The starting line or currently selected line out of the iNumLines lines * @param iContentHeight Height of the scrollbar @@ -1273,38 +1320,116 @@ void draw_scrollbar( const catacurses::window &window, const int iCurrentLine, const int iContentHeight, const int iNumLines, const int iOffsetY, const int iOffsetX, nc_color bar_color, const bool bDoNotScrollToEnd ) { - if( iContentHeight >= iNumLines ) { - //scrollbar is not required - bar_color = BORDER_COLOR; - } + scrollbar() + .offset_x( iOffsetX ) + .offset_y( iOffsetY ) + .content_size( iNumLines ) + .viewport_pos( iCurrentLine ) + .viewport_size( iContentHeight ) + .slot_color( bar_color ) + .scroll_to_last( !bDoNotScrollToEnd ) + .apply( window ); +} - //Clear previous scrollbar - for( int i = iOffsetY; i < iOffsetY + iContentHeight; i++ ) { - mvwputch( window, i, iOffsetX, bar_color, LINE_XOXO ); - } +scrollbar::scrollbar() + : offset_x_v( 0 ), offset_y_v( 0 ), content_size_v( 0 ), + viewport_pos_v( 0 ), viewport_size_v( 0 ), + border_color_v( BORDER_COLOR ), arrow_color_v( c_light_green ), + slot_color_v( c_white ), bar_color_v( c_cyan_cyan ), scroll_to_last_v( false ) +{ +} - if( iContentHeight >= iNumLines ) { - return; - } +scrollbar &scrollbar::offset_x( int offx ) +{ + offset_x_v = offx; + return *this; +} + +scrollbar &scrollbar::offset_y( int offy ) +{ + offset_y_v = offy; + return *this; +} + +scrollbar &scrollbar::content_size( int csize ) +{ + content_size_v = csize; + return *this; +} + +scrollbar &scrollbar::viewport_pos( int vpos ) +{ + viewport_pos_v = vpos; + return *this; +} + +scrollbar &scrollbar::viewport_size( int vsize ) +{ + viewport_size_v = vsize; + return *this; +} + +scrollbar &scrollbar::border_color( nc_color border_c ) +{ + border_color_v = border_c; + return *this; +} + +scrollbar &scrollbar::arrow_color( nc_color arrow_c ) +{ + arrow_color_v = arrow_c; + return *this; +} - if( iNumLines > 0 ) { - mvwputch( window, iOffsetY, iOffsetX, c_light_green, '^' ); - mvwputch( window, iOffsetY + iContentHeight - 1, iOffsetX, c_light_green, 'v' ); +scrollbar &scrollbar::slot_color( nc_color slot_c ) +{ + slot_color_v = slot_c; + return *this; +} + +scrollbar &scrollbar::bar_color( nc_color bar_c ) +{ + bar_color_v = bar_c; + return *this; +} - int iSBHeight = std::max( 2, ( ( iContentHeight - 2 ) * iContentHeight ) / iNumLines ); - int iScrollableLines = bDoNotScrollToEnd ? iNumLines - iContentHeight + 1 : iNumLines; +scrollbar &scrollbar::scroll_to_last( bool scr2last ) +{ + scroll_to_last_v = scr2last; + return *this; +} - int iStartY; - if( iCurrentLine == 0 ) { - iStartY = -1; - } else if( iScrollableLines > 2 ) { - iStartY = ( ( iContentHeight - 3 - iSBHeight ) * ( iCurrentLine - 1 ) ) / ( iScrollableLines - 2 ); +void scrollbar::apply( const catacurses::window &window ) +{ + if( viewport_size_v >= content_size_v || content_size_v <= 0 ) { + // scrollbar not needed, fill output area with borders + for( int i = offset_y_v; i < offset_y_v + viewport_size_v; ++i ) { + mvwputch( window, i, offset_x_v, border_color_v, LINE_XOXO ); + } + } else { + mvwputch( window, offset_y_v, offset_x_v, arrow_color_v, '^' ); + mvwputch( window, offset_y_v + viewport_size_v - 1, offset_x_v, arrow_color_v, 'v' ); + + int slot_size = viewport_size_v - 2; + int bar_size = std::max( 2, slot_size * viewport_size_v / content_size_v ); + int scrollable_size = scroll_to_last_v ? content_size_v : content_size_v - viewport_size_v + 1; + + int bar_start, bar_end; + if( viewport_pos_v == 0 ) { + bar_start = 0; + } else if( scrollable_size > 2 ) { + bar_start = ( slot_size - 1 - bar_size ) * ( viewport_pos_v - 1 ) / ( scrollable_size - 2 ) + 1; } else { - iStartY = iContentHeight - 3 - iSBHeight; + bar_start = slot_size - bar_size; } + bar_end = bar_start + bar_size; - for( int i = 0; i < iSBHeight; i++ ) { - mvwputch( window, i + iOffsetY + 2 + iStartY, iOffsetX, c_cyan_cyan, LINE_XOXO ); + for( int i = 0; i < slot_size; ++i ) { + if( i >= bar_start && i < bar_end ) { + mvwputch( window, offset_y_v + 1 + i, offset_x_v, bar_color_v, LINE_XOXO ); + } else { + mvwputch( window, offset_y_v + 1 + i, offset_x_v, slot_color_v, LINE_XOXO ); + } } } } diff --git a/src/output.h b/src/output.h index 78bd027701f22..ba514ad52ecb0 100644 --- a/src/output.h +++ b/src/output.h @@ -153,7 +153,8 @@ std::string remove_color_tags( const std::string &text ); /** * Split the input text into separate lines and wrap long lines. Each resulting line is at most * `width` console cells long. - * The functions handles @ref color_tags. + * The functions handles @ref color_tags. Color tags are added to the resulting lines so each + * line can be independently printed. * @return A vector of lines, it may contain empty strings. Each entry is at most `width` * console cells width. */ @@ -333,6 +334,7 @@ inline bool query_int( int &result, const char *const msg, Args &&... args ) } // for the next two functions, if cancelable is true, Esc returns the last option +// These are legacy functions, use uilist instead! int menu_vec( bool cancelable, const char *mes, const std::vector options ); int menu_vec( bool cancelable, const char *mes, const std::vector &options, const std::string &hotkeys_override ); @@ -591,12 +593,45 @@ std::string get_labeled_bar( const double val, const int width, const std::strin void draw_tab( const catacurses::window &w, int iOffsetX, std::string sText, bool bSelected ); void draw_subtab( const catacurses::window &w, int iOffsetX, std::string sText, bool bSelected, bool bDecorate = true, bool bDisabled = false ); +// Legacy function, use class scrollbar instead! void draw_scrollbar( const catacurses::window &window, const int iCurrentLine, const int iContentHeight, const int iNumLines, const int iOffsetY = 0, const int iOffsetX = 0, nc_color bar_color = c_white, const bool bDoNotScrollToEnd = false ); void calcStartPos( int &iStartPos, const int iCurrentLine, const int iContentHeight, const int iNumEntries ); +class scrollbar +{ + public: + scrollbar(); + // relative position of the scrollbar to the window + scrollbar &offset_x( int offx ); + scrollbar &offset_y( int offy ); + // total number of lines + scrollbar &content_size( int csize ); + // index of the beginning line + scrollbar &viewport_pos( int vpos ); + // number of lines shown + scrollbar &viewport_size( int vsize ); + // window border color + scrollbar &border_color( nc_color border_c ); + // scrollbar arrow color + scrollbar &arrow_color( nc_color arrow_c ); + // scrollbar slot color + scrollbar &slot_color( nc_color slot_c ); + // scrollbar bar color + scrollbar &bar_color( nc_color bar_c ); + // can viewport_pos go beyond (content_size - viewport_size)? + scrollbar &scroll_to_last( bool scr2last ); + // draw the scrollbar to the window + void apply( const catacurses::window &window ); + private: + int offset_x_v, offset_y_v; + int content_size_v, viewport_pos_v, viewport_size_v; + nc_color border_color_v, arrow_color_v, slot_color_v, bar_color_v; + bool scroll_to_last_v; +}; + class scrollingcombattext { public: diff --git a/src/overmap.cpp b/src/overmap.cpp index 90da2981d61f0..644ab1acdefb6 100644 --- a/src/overmap.cpp +++ b/src/overmap.cpp @@ -722,6 +722,122 @@ const std::vector &overmap_terrains::get_all() return terrains.get_all(); } +template +void read_and_set_or_throw( JsonObject &jo, const std::string &member, T &target, bool required ) +{ + T tmp; + if( !jo.read( member, tmp ) ) { + if( required ) { + jo.throw_error( string_format( "%s required", member ) ); + } + } else { + target = tmp; + } +} + +void load_forest_biome_component( JsonObject &jo, forest_biome_component &forest_biome_component, + const bool overlay ) +{ + read_and_set_or_throw( jo, "chance", forest_biome_component.chance, !overlay ); + read_and_set_or_throw( jo, "sequence", forest_biome_component.sequence, !overlay ); + read_and_set_or_throw( jo, "clear_types", forest_biome_component.clear_types, !overlay ); + + if( forest_biome_component.clear_types ) { + forest_biome_component.unfinalized_types.clear(); + } + + if( !jo.has_object( "types" ) ) { + if( !overlay ) { + jo.throw_error( "types required" ); + } + } else { + JsonObject feature_types_jo = jo.get_object( "types" ); + std::set keys = feature_types_jo.get_member_names(); + for( const auto &key : keys ) { + int weight = 0; + if( key != "//" ) { + if( feature_types_jo.read( key, weight ) ) { + forest_biome_component.unfinalized_types[key] = weight; + } + } + } + } +} + +void load_forest_biome( JsonObject &jo, forest_biome &forest_biome, const bool overlay ) +{ + read_and_set_or_throw( jo, "sparseness_adjacency_factor", + forest_biome.sparseness_adjacency_factor, !overlay ); + read_and_set_or_throw( jo, "item_group", forest_biome.item_group, !overlay ); + read_and_set_or_throw( jo, "item_group_chance", forest_biome.item_group_chance, !overlay ); + read_and_set_or_throw( jo, "item_spawn_iterations", forest_biome.item_spawn_iterations, + !overlay ); + read_and_set_or_throw( jo, "clear_components", forest_biome.clear_components, !overlay ); + read_and_set_or_throw( jo, "clear_groundcover", forest_biome.clear_groundcover, !overlay ); + + if( forest_biome.clear_components ) { + forest_biome.unfinalized_biome_components.clear(); + } + + if( !jo.has_object( "components" ) ) { + if( !overlay ) { + jo.throw_error( "components required" ); + } + } else { + JsonObject components_jo = jo.get_object( "components" ); + std::set component_names = components_jo.get_member_names(); + for( const auto &name : component_names ) { + if( name != "//" ) { + JsonObject component_jo = components_jo.get_object( name ); + load_forest_biome_component( component_jo, forest_biome.unfinalized_biome_components[name], + overlay ); + } + } + } + + if( forest_biome.clear_groundcover ) { + forest_biome.unfinalized_groundcover.clear(); + } + + if( !jo.has_object( "groundcover" ) ) { + if( !overlay ) { + jo.throw_error( "groundcover required" ); + } + } else { + JsonObject groundcover_jo = jo.get_object( "groundcover" ); + std::set keys = groundcover_jo.get_member_names(); + for( const auto &key : keys ) { + int weight = 0; + if( key != "//" ) { + if( groundcover_jo.read( key, weight ) ) { + forest_biome.unfinalized_groundcover[key] = weight; + } + } + } + } +} + +void load_forest_mapgen_settings( JsonObject &jo, forest_mapgen_settings &forest_mapgen_settings, + const bool strict, + const bool overlay ) +{ + if( !jo.has_object( "forest_mapgen_settings" ) ) { + if( strict ) { + jo.throw_error( "\"forest_mapgen_settings\": { ... } required for default" ); + } + } else { + JsonObject forest_biomes_list_jo = jo.get_object( "forest_mapgen_settings" ); + std::set forest_biome_names = forest_biomes_list_jo.get_member_names(); + for( const auto &forest_biome_name : forest_biome_names ) { + if( forest_biome_name != "//" ) { + JsonObject forest_biome_jo = forest_biomes_list_jo.get_object( forest_biome_name ); + load_forest_biome( forest_biome_jo, forest_mapgen_settings.unfinalized_biomes[forest_biome_name], + overlay ); + } + } + } +} + void load_region_settings( JsonObject &jo ) { regional_settings new_region; @@ -818,6 +934,8 @@ void load_region_settings( JsonObject &jo ) } } + load_forest_mapgen_settings( jo, new_region.forest_composition, strict, false ); + if( ! jo.has_object( "map_extras" ) ) { if( strict ) { jo.throw_error( "\"map_extras\": { ... } required for default" ); @@ -1022,6 +1140,8 @@ void apply_region_overlay( JsonObject &jo, regional_settings ®ion ) fieldjo.throw_error( "boost_chance > 0 requires boosted_other { ... }" ); } + load_forest_mapgen_settings( jo, region.forest_composition, false, true ); + JsonObject mapextrajo = jo.get_object( "map_extras" ); std::set extrazones = mapextrajo.get_member_names(); for( const auto &zone : extrazones ) { @@ -2685,6 +2805,34 @@ bool overmap::build_lab( int x, int y, int z, int s, std::vector *lab_tra } } + // 4th story of labs is a candidate for lab escape, as long as there's no train or finale. + if( prefix.empty() && z == -4 && train_odds == 0 && numstairs > 0 ) { + int cellx = 0; + int celly = 0; + int tries = 0; + int adjacent_labs = 0; + + // Find a space bordering just one lab to the south. + do { + cellx = rng( x - s * 1.5 - 1, x + s * 1.5 + 1 ); + celly = rng( y - s * 1.5 - 1, y + s * 1.5 + 1 ); + tries++; + + adjacent_labs = ( is_ot_subtype( "lab", ter( cellx, celly - 1, z ) ) ? 1 : 0 ) + + ( is_ot_subtype( "lab", ter( cellx - 1, celly, z ) ) ? 1 : 0 ) + + ( is_ot_subtype( "lab", ter( cellx, celly + 1, z ) ) ? 1 : 0 ) + + ( is_ot_subtype( "lab", ter( cellx + 1, celly, z ) ) ? 1 : 0 ); + } while( tries < 50 && ( + ter( cellx, celly, z ) == labt_stairs || + ter( cellx, celly, z ) == labt_finale || + ter( cellx, celly + 1, z ) != labt || + adjacent_labs != 1 ) ); + if( tries < 50 ) { + ter( cellx, celly, z ) = oter_id( "lab_escape_cells" ); + ter( cellx, celly + 1, z ) = oter_id( "lab_escape_entrance" ); + } + } + return numstairs > 0; } @@ -3830,6 +3978,76 @@ ter_furn_id groundcover_extra::pick( bool boosted ) const return weightlist.lower_bound( rng( 0, 1000000 ) )->second; } +void forest_biome_component::finalize() +{ + for( const std::pair &pr : unfinalized_types ) { + ter_furn_id tf_id; + tf_id.ter = t_null; + tf_id.furn = f_null; + const ter_str_id tid( pr.first ); + const furn_str_id fid( pr.first ); + if( tid.is_valid() ) { + tf_id.ter = tid.id(); + } else if( fid.is_valid() ) { + tf_id.furn = fid.id(); + } else { + continue; + } + types.add( tf_id, pr.second ); + } +} + +ter_furn_id forest_biome::pick() const +{ + // Iterate through the biome components (which have already been put into sequence), roll for the + // one_in chance that component contributes a feature, and if so pick that feature and return it. + // If a given component does not roll as success, proceed to the next feature in sequence until + // a feature is picked or none are picked, in which case an empty feature is returned. + const ter_furn_id *result = nullptr; + for( auto &pr : biome_components ) { + if( one_in( pr.chance ) ) { + result = pr.types.pick(); + break; + } + } + + if( result == nullptr ) { + return ter_furn_id(); + } + + return *result; +} + +void forest_biome::finalize() +{ + for( auto &pr : unfinalized_biome_components ) { + pr.second.finalize(); + biome_components.push_back( pr.second ); + } + + std::sort( biome_components.begin(), biome_components.end(), []( const forest_biome_component & a, + const forest_biome_component & b ) { + return a.sequence < b.sequence; + } ); + + for( const std::pair &pr : unfinalized_groundcover ) { + const ter_str_id tid( pr.first ); + if( !tid.is_valid() ) { + continue; + } + groundcover.add( tid.id(), pr.second ); + } +} + +void forest_mapgen_settings::finalize() +{ + for( auto &pr : unfinalized_biomes ) { + pr.second.finalize(); + const oter_id ot( pr.first ); + biomes[ot] = pr.second; + } +} + void regional_settings::finalize() { if( default_groundcover_str != nullptr ) { @@ -3840,6 +4058,7 @@ void regional_settings::finalize() field_coverage.finalize(); default_groundcover_str.reset(); city_spec.finalize(); + forest_composition.finalize(); get_options().add_value( "DEFAULT_REGION", id ); } } diff --git a/src/overmap.h b/src/overmap.h index 91d2dd87d2546..047d6fb478f09 100644 --- a/src/overmap.h +++ b/src/overmap.h @@ -111,6 +111,42 @@ struct groundcover_extra { groundcover_extra() = default; }; +struct forest_biome_component { + std::map unfinalized_types; + weighted_int_list types; + int sequence = 0; + int chance = 0; + bool clear_types = false; + + void finalize(); + forest_biome_component() = default; +}; + +struct forest_biome { + std::map unfinalized_biome_components; + std::vector biome_components; + std::map unfinalized_groundcover; + weighted_int_list groundcover; + int sparseness_adjacency_factor = 0; + int item_group_chance = 0; + int item_spawn_iterations = 0; + std::string item_group; + bool clear_components = false; + bool clear_groundcover = false; + + ter_furn_id pick() const; + void finalize(); + forest_biome() = default; +}; + +struct forest_mapgen_settings { + std::map unfinalized_biomes; + std::map biomes; + + void finalize(); + forest_mapgen_settings() = default; +}; + struct map_extras { unsigned int chance; weighted_int_list values; @@ -141,7 +177,7 @@ struct regional_settings { city_settings city_spec; // put what where in a city of what kind groundcover_extra field_coverage; - groundcover_extra forest_coverage; + forest_mapgen_settings forest_composition; weather_generator weather; diff --git a/src/player.cpp b/src/player.cpp index 2eda8d83c1394..3dd0497aa09a9 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -218,6 +218,7 @@ static const bionic_id bio_sleepy( "bio_sleepy" ); static const bionic_id bn_bio_solar( "bn_bio_solar" ); static const bionic_id bio_spasm( "bio_spasm" ); static const bionic_id bio_speed( "bio_speed" ); +static const bionic_id bio_syringe( "bio_syringe" ); static const bionic_id bio_tools( "bio_tools" ); static const bionic_id bio_trip( "bio_trip" ); static const bionic_id bio_uncanny_dodge( "bio_uncanny_dodge" ); @@ -2422,7 +2423,7 @@ bool player::has_higher_trait( const trait_id &flag ) const bool player::has_same_type_trait( const trait_id &flag ) const { for( auto &i : get_mutations_in_types( flag->types ) ) { - if( has_trait( i ) ) { + if( has_trait( i ) && flag != i ) { return true; } } @@ -3267,7 +3268,7 @@ void player::on_hurt( Creature *source, bool disturb /*= true*/ ) } if( !is_npc() ) { if( source != nullptr ) { - g->cancel_activity_or_ignore_query( distraction_type::attacked, string_format( _( "You were attacked by %s!" ), + g->cancel_activity_or_ignore_query( distraction_type::attacked, string_format( _( "You were attacked by %s!" ), source->disp_name().c_str() ) ); } else { g->cancel_activity_or_ignore_query( distraction_type::attacked, _( "You were hurt!" ) ); @@ -6963,8 +6964,12 @@ bool player::consume_med( item &target ) const itype_id tool_type = target.type->comestible->tool; const auto req_tool = item::find_type( tool_type ); + bool tool_override = false; + if( tool_type == "syringe" && has_bionic( bio_syringe ) ) { + tool_override = true; + } if( req_tool->tool ) { - if( !( has_amount( tool_type, 1 ) && has_charges( tool_type, req_tool->tool->charges_per_use ) ) ) { + if( !( has_amount( tool_type, 1 ) && has_charges( tool_type, req_tool->tool->charges_per_use ) ) && !tool_override ) { add_msg_if_player( m_info, _( "You need a %s to consume that!" ), req_tool->nname( 1 ).c_str() ); return false; } diff --git a/src/player.h b/src/player.h index b865075d7bef5..ddc32515946f3 100644 --- a/src/player.h +++ b/src/player.h @@ -144,7 +144,8 @@ class player : public Character // newcharacter.cpp bool create( character_type type, const std::string &tempname = "" ); void randomize( bool random_scenario, points_left &points, bool play_now = false ); - bool load_template( const std::string &template_name ); + bool load_template( const std::string &template_name, points_left &points ); + /** Calls Character::normalize() * normalizes HP and body temperature */ @@ -286,7 +287,7 @@ class player : public Character float bionics_adjusted_skill( const skill_id &most_important_skill, const skill_id &important_skill, const skill_id &least_important_skill, - bool autodoc, int skill_level = -1 ); + int skill_level = -1 ); /** Attempts to install bionics, returns false if the player cancels prior to installation */ bool install_bionics( const itype &type, player &installer, bool autodoc = false, int skill_level = -1 ); diff --git a/src/ranged.cpp b/src/ranged.cpp index 66ca803d64b8b..4025efdeab929 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -521,15 +521,17 @@ static std::string print_recoil( const player &p ) const int val = p.recoil_total(); const int min_recoil = p.effective_dispersion( p.weapon.sight_dispersion() ); const int recoil_range = MAX_RECOIL - min_recoil; - const char *color_name = "c_light_gray"; + std::string level; if( val >= min_recoil + ( recoil_range * 2 / 3 ) ) { - color_name = "c_red"; + level = "High"; } else if( val >= min_recoil + ( recoil_range / 2 ) ) { - color_name = "c_light_red"; + level = "Medium"; } else if( val >= min_recoil + ( recoil_range / 4 ) ) { - color_name = "c_yellow"; + level = "Low"; + } else { + level = "None"; } - return string_format( "%s", color_name, _( "Recoil" ) ); + return string_format( _( "Recoil: %s" ), level ); } return std::string(); } @@ -537,7 +539,7 @@ static std::string print_recoil( const player &p ) // Draws the static portions of the targeting menu, // returns the number of lines used to draw instructions. static int draw_targeting_window( const catacurses::window &w_target, const std::string &name, - player &p, target_mode mode, input_context &ctxt, + target_mode mode, input_context &ctxt, const std::vector &aim_types, bool switch_mode, bool switch_ammo, bool tiny ) { @@ -549,7 +551,7 @@ static int draw_targeting_window( const catacurses::window &w_target, const std: switch( mode ) { case TARGET_MODE_FIRE: case TARGET_MODE_TURRET_MANUAL: - title = string_format( _( "Firing %s %s" ), name.c_str(), print_recoil( p ).c_str() ); + title = string_format( _( "Firing %s" ), name.c_str() ); break; case TARGET_MODE_THROW: @@ -1018,7 +1020,7 @@ std::vector target_handler::target_ui( player &pc, target_mode mode, } int num_instruction_lines = draw_targeting_window( w_target, relevant->tname(), - pc, mode, ctxt, aim_types, + mode, ctxt, aim_types, bool( on_mode_change ), bool( on_ammo_change ), tiny ); @@ -1135,6 +1137,9 @@ std::vector target_handler::target_ui( player &pc, target_mode mode, nc_color col = c_light_gray; print_colored_text( w_target, line_number++, 1, col, col, str ); } + + mvwprintw( w_target, line_number++, 1, _( "%s" ), print_recoil( g->u ).c_str() ); + // Skip blank lines if we're short on space. if( !compact ) { line_number++; diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index 8aad941d73592..4e1bf404edeba 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -1606,9 +1606,9 @@ void item::io( Archive &archive ) archive.io( "damaged", damage_, 0 ); archive.io( "active", active, false ); archive.io( "item_counter", item_counter, static_cast( 0 ) ); - archive.io( "fridge", fridge, calendar::before_time_starts ); archive.io( "rot", rot, 0_turns ); archive.io( "last_rot_check", last_rot_check, calendar::time_of_cataclysm ); + archive.io( "last_temp_check", last_temp_check, calendar::time_of_cataclysm ); archive.io( "techniques", techniques, io::empty_default_tag() ); archive.io( "faults", faults, io::empty_default_tag() ); archive.io( "item_tags", item_tags, io::empty_default_tag() ); diff --git a/src/sidebar.cpp b/src/sidebar.cpp index 34ab8f47af902..841ea186ec527 100644 --- a/src/sidebar.cpp +++ b/src/sidebar.cpp @@ -300,12 +300,14 @@ void player::disp_status( const catacurses::window &w, const catacurses::window // Print currently used style or weapon mode. std::string style; const auto &cur_style = style_selected.obj(); - if( cur_style.force_unarmed || cur_style.weapon_valid( weapon ) ) { - style = _( cur_style.name.c_str() ); - } else if( is_armed() ) { - style = _( "Normal" ); - } else { - style = _( "No Style" ); + if( !weapon.is_gun() ) { + if( cur_style.force_unarmed || cur_style.weapon_valid( weapon ) ) { + style = _( cur_style.name.c_str() ); + } else if( is_armed() ) { + style = _( "Normal" ); + } else { + style = _( "No Style" ); + } } if( !style.empty() ) { diff --git a/src/start_location.cpp b/src/start_location.cpp index 4949181ac13aa..4495fdcfb7088 100644 --- a/src/start_location.cpp +++ b/src/start_location.cpp @@ -295,10 +295,9 @@ void start_location::place_player( player &u ) const // Need the "real" map with it's inside/outside cache and the like. map &m = g->m; // Start us off somewhere in the center of the map - u.setx( SEEX * int( MAPSIZE / 2 ) + 5 ); - u.sety( SEEY * int( MAPSIZE / 2 ) + 6 ); + u.setx( SEEX * int( MAPSIZE / 2 ) ); + u.sety( SEEY * int( MAPSIZE / 2 ) ); u.setz( g->get_levz() ); - m.build_map_cache( m.get_abs_sub().z ); const bool must_be_inside = flags().count( "ALLOW_OUTSIDE" ) == 0; ///\EFFECT_STR allows player to start behind less-bashable furniture and terrain @@ -330,8 +329,8 @@ void start_location::place_player( player &u ) const }; while( !found_good_spot && tries < 100 ) { - tripoint rand_point( ( SEEX * int( MAPSIZE / 2 ) ) + rng( 0, SEEX * 2 ), - ( SEEY * int( MAPSIZE / 2 ) ) + rng( 0, SEEY * 2 ), + tripoint rand_point( ( SEEX * int( MAPSIZE / 2 ) ) + rng( 0, SEEX * 2 - 1 ), + ( SEEY * int( MAPSIZE / 2 ) ) + rng( 0, SEEY * 2 - 1 ), u.posz() ); check_spot( rand_point ); } diff --git a/src/string_input_popup.cpp b/src/string_input_popup.cpp index 9804c79f241b2..676f0a534ae32 100644 --- a/src/string_input_popup.cpp +++ b/src/string_input_popup.cpp @@ -238,6 +238,8 @@ const std::string &string_input_popup::query_string( const bool loop, const bool int ch = 0; + _canceled = false; + _confirmed = false; do { if( _position < 0 ) { @@ -302,10 +304,12 @@ const std::string &string_input_popup::query_string( const bool loop, const bool } #endif _text.clear(); + _position = -1; _canceled = true; return _text; } else if( ch == '\n' ) { add_to_history( ret.str() ); + _confirmed = true; _text = ret.str(); return _text; } else if( ch == KEY_UP ) { @@ -426,3 +430,13 @@ void string_input_popup::edit( int &value ) value = std::atoi( text().c_str() ); } } + +string_input_popup &string_input_popup::text( std::string value ) +{ + _text = value; + auto u8size = utf8_wrapper( _text ).size(); + if( _position < 0 || static_cast( _position ) > u8size ) { + _position = u8size; + } + return *this; +} diff --git a/src/string_input_popup.h b/src/string_input_popup.h index 3dc40625e9241..a5df15c13188a 100644 --- a/src/string_input_popup.h +++ b/src/string_input_popup.h @@ -66,8 +66,7 @@ class string_input_popup input_context *ctxt = nullptr; bool _canceled = false; - - void query_more( bool loop, bool dorefresh ); + bool _confirmed = false; void create_window(); void create_context(); @@ -93,10 +92,7 @@ class string_input_popup * It's optional default is an empty string. */ /**@{*/ - string_input_popup &text( std::string value ) { - _text = value; - return *this; - } + string_input_popup &text( std::string value ); const std::string &text() const { return _text; } @@ -219,6 +215,12 @@ class string_input_popup bool canceled() const { return _canceled; } + /** + * Returns true if query was finished via the ENTER key. + */ + bool confirmed() const { + return _confirmed; + } /** * Edit values in place. This combines: calls to @ref text to set the * current value, @ref query to get user input and setting the diff --git a/src/ui.cpp b/src/ui.cpp index 923d20b3da151..a408102031d38 100644 --- a/src/ui.cpp +++ b/src/ui.cpp @@ -127,6 +127,74 @@ uimenu::uimenu(bool cancelable, int startx, int width, int starty, std::string t query(); } +uilist::uilist() +{ + init(); +} + +uilist::uilist( const std::string &hotkeys_override ) +{ + init(); + if( !hotkeys_override.empty() ) { + hotkeys = hotkeys_override; + } +} + +uilist::uilist( const std::string &msg, const std::vector &opts ) + : uilist( MENU_AUTOASSIGN, MENU_AUTOASSIGN, MENU_AUTOASSIGN, msg, opts ) +{ +} + +uilist::uilist( const std::string &msg, const std::vector &opts ) + : uilist( MENU_AUTOASSIGN, MENU_AUTOASSIGN, MENU_AUTOASSIGN, msg, opts ) +{ +} + +uilist::uilist( const std::string &msg, std::initializer_list opts ) + : uilist( MENU_AUTOASSIGN, MENU_AUTOASSIGN, MENU_AUTOASSIGN, msg, opts ) +{ +} + +uilist::uilist( int startx, int width, int starty, const std::string &msg, + const std::vector &opts ) +{ + init(); + w_x = startx; + w_y = starty; + w_width = width; + text = msg; + entries = opts; + query(); +} + +uilist::uilist( int startx, int width, int starty, const std::string &msg, + const std::vector &opts ) +{ + init(); + w_x = startx; + w_y = starty; + w_width = width; + text = msg; + for( auto it = opts.begin(); it != opts.end(); ++it ) { + entries.emplace_back( *it ); + } + query(); +} + +uilist::uilist( int startx, int width, int starty, const std::string &msg, + std::initializer_list opts ) +{ + init(); + w_x = startx; + w_y = starty; + w_width = width; + text = msg; + for( auto it = opts.begin(); it != opts.end(); ++it ) { + entries.emplace_back( *it ); + } + query(); +} + /* * Enables oneshot construction -> running -> exit */ @@ -146,7 +214,7 @@ void uimenu::init() w_width = MENU_AUTOASSIGN; // MENU_AUTOASSIGN = based on text width or max entry width, -2 = based on max entry, folds text w_height = MENU_AUTOASSIGN; // -1 = autocalculate based on number of entries + number of lines in text // @todo: fixme: scrolling list with offset - ret = UIMENU_INVALID; // return this unless a valid selection is made ( -1024 ) + ret = dynamic_cast( this ) ? UIMENU_WAIT_INPUT : UIMENU_INVALID; text.clear(); // header text, after (maybe) folding, populates: textformatted.clear(); // folded to textwidth textwidth = MENU_AUTOASSIGN; // if unset, folds according to w_width @@ -169,7 +237,10 @@ void uimenu::init() hilight_color = h_white; // highlight for up/down selection bar hotkey_color = c_light_green; // hotkey text to the right of menu entry's text disabled_color = c_dark_gray; // disabled menu entry - return_invalid = false; // return 0-(int)invalidKeyCode + allow_disabled = false; // disallow selecting disabled options + allow_anykey = false; // do not return on unbound keys + allow_cancel = true; // allow cancelling with "QUIT" action + return_invalid = false; // legacy flag hilight_full = true; // render hilight_color background over the entire line (minus padding) hilight_disabled = false; // if false, hitting 'down' onto a disabled entry will advance downward to the first enabled entry @@ -192,8 +263,6 @@ void uimenu::init() scrollbar_page_color = c_cyan_cyan; // color of the '|' line for whatever's the current page. scrollbar_side = -1; // -1 == choose left unless taken, then choose right - last_fsize = -1; - last_vshift = -1; hotkeys = DEFAULT_HOTKEYS; input_category = "UIMENU"; additional_actions.clear(); @@ -498,58 +567,32 @@ void uimenu::setup() started = true; } -// @todo: replace content of this function by draw_scrollbar() from output.(h|cpp) void uimenu::apply_scrollbar() { - if ( ! scrollbar_auto ) { + if ( !scrollbar_auto ) { return; } - if ( last_vshift != vshift || last_fsize != (int)fentries.size() ) { - last_vshift = vshift; - last_fsize = fentries.size(); - - int sbside = ( scrollbar_side == 0 ? 0 : w_width ); - int estart = textformatted.size() + 2; - - if ( !fentries.empty() && vmax < (int)fentries.size() ) { - wattron(window, border_color); - mvwaddch(window, estart, sbside, '^'); - wattroff(window, border_color); - - wattron(window, scrollbar_nopage_color); - for( int i = estart + 1; i < estart + vmax - 1; i++ ) { - mvwaddch(window, i, sbside, LINE_XOXO); - } - wattroff(window, scrollbar_nopage_color); - wattron(window, border_color); - mvwaddch(window, estart + vmax - 1, sbside, 'v'); - wattroff(window, border_color); - - int svmax = vmax - 2; - int fentriessz = fentries.size() - vmax; - int sbsize = (vmax * svmax) / fentries.size(); - if ( sbsize < 2 ) { - sbsize = 2; - } - int svmaxsz = svmax - sbsize; - int sbstart = ( vshift * svmaxsz ) / fentriessz; - int sbend = sbstart + sbsize; - - wattron(window, scrollbar_page_color); - for ( int i = sbstart; i < sbend; i++ ) { - mvwaddch(window, i + estart + 1, sbside, LINE_XOXO); - } - wattroff(window, scrollbar_page_color); - - } else { - wattron(window, border_color); - for( int i = estart; i < estart + vmax; i++ ) { - mvwaddch(window, i, sbside, LINE_XOXO); - } - wattroff(window, border_color); - } - } + int sbside = ( scrollbar_side == 0 ? 0 : w_width - 1 ); + int estart = textformatted.size(); + if( estart > 0 ) { + estart += 2; + } else { + estart = 1; + } + + scrollbar() + .offset_x( sbside ) + .offset_y( estart ) + .content_size( fentries.size() ) + .viewport_pos( vshift ) + .viewport_size( vmax ) + .border_color( border_color ) + .arrow_color( border_color ) + .slot_color( scrollbar_nopage_color ) + .bar_color( scrollbar_page_color ) + .scroll_to_last( false ) + .apply( window ); } /** @@ -752,24 +795,30 @@ bool uimenu::scrollby( const int scrollby ) } if ( backwards ) { + if( fselected < 0 ) { + fselected = fentries.size() - 1; + } for( size_t i = 0; i < fentries.size(); ++i ) { - if( fselected < 0 ) { - fselected = fentries.size() - 1; - } if( hilight_disabled || entries[ fentries [ fselected ] ].enabled ) { break; } --fselected; + if( fselected < 0 ) { + fselected = fentries.size() - 1; + } } } else { + if( fselected >= ( int )fentries.size() ) { + fselected = 0; + } for( size_t i = 0; i < fentries.size(); ++i ) { - if( fselected >= (int)fentries.size() ) { - fselected = 0; - } if( hilight_disabled || entries[ fentries [ fselected ] ].enabled ) { break; } ++fselected; + if( fselected >= ( int )fentries.size() ) { + fselected = 0; + } } } if( static_cast( fselected ) < fentries.size() ) { @@ -784,12 +833,15 @@ bool uimenu::scrollby( const int scrollby ) */ void uimenu::query(bool loop) { + bool new_interface = dynamic_cast( this ) != nullptr; keypress = 0; if ( entries.empty() ) { + if( new_interface ) { + ret = UIMENU_ERROR; + } return; } - int startret = UIMENU_INVALID; - ret = UIMENU_INVALID; + ret = ( new_interface ? UIMENU_WAIT_INPUT : UIMENU_INVALID ); input_context ctxt( input_category ); ctxt.register_updown(); @@ -797,7 +849,7 @@ void uimenu::query(bool loop) ctxt.register_action( "PAGE_DOWN" ); ctxt.register_action( "SCROLL_UP" ); ctxt.register_action( "SCROLL_DOWN" ); - if( return_invalid ) { + if( new_interface ? allow_cancel : return_invalid ) { ctxt.register_action( "QUIT" ); } ctxt.register_action( "CONFIRM" ); @@ -819,15 +871,12 @@ void uimenu::query(bool loop) #endif do { - bool skipkey = false; const auto action = ctxt.handle_input(); const auto event = ctxt.get_raw_input(); keypress = event.get_first_input(); const auto iter = keymap.find( keypress ); - if ( skipkey ) { - /* nothing */ - } else if( scrollby( scroll_amount_from_action( action ) ) ) { + if( scrollby( scroll_amount_from_action( action ) ) ) { /* nothing */ } else if ( action == "HELP_KEYBINDINGS" ) { /* nothing, handled by input_context */ @@ -837,28 +886,34 @@ void uimenu::query(bool loop) selected = iter->second; if( entries[ selected ].enabled ) { ret = entries[ selected ].retval; // valid - } else if( return_invalid ) { + } else if( !new_interface && return_invalid ) { ret = 0 - entries[ selected ].retval; // disabled + } else if( new_interface && allow_disabled ) { + ret = entries[selected].retval; // disabled } } else if ( !fentries.empty() && action == "CONFIRM" ) { if( entries[ selected ].enabled ) { ret = entries[ selected ].retval; // valid - } else if ( return_invalid ) { + } else if ( !new_interface && return_invalid ) { ret = 0 - entries[ selected ].retval; // disabled + } else if( new_interface && allow_disabled ) { + ret = entries[selected].retval; // disabled } - } else if( action == "QUIT" ) { - break; - } else { - if ( callback != nullptr ) { - skipkey = callback->key( ctxt, event, selected, this ); + } else if( ( !new_interface || allow_cancel ) && action == "QUIT" ) { + if( new_interface ) { + ret = UIMENU_CANCEL; + } else { + break; } - if ( ! skipkey && return_invalid ) { - ret = -1; + } else if( action != "TIMEOUT" ) { + bool unhandled = callback == nullptr || !callback->key( ctxt, event, selected, this ); + if( unhandled && ( new_interface ? allow_anykey : return_invalid ) ) { + ret = new_interface ? UIMENU_UNBOUND : -1; } } show(); - } while ( loop && (ret == startret ) ); + } while( loop && ret == ( new_interface ? UIMENU_WAIT_INPUT : UIMENU_INVALID ) ); } ///@} diff --git a/src/ui.h b/src/ui.h index 4a82444b4b536..0a71def6e52f5 100644 --- a/src/ui.h +++ b/src/ui.h @@ -17,7 +17,11 @@ /** * uimenu constants */ -const int UIMENU_INVALID = -1024; +const int UIMENU_INVALID = -1024; // legacy constant +const int UIMENU_ERROR = -1024; +const int UIMENU_WAIT_INPUT = -1025; +const int UIMENU_UNBOUND = -1026; +const int UIMENU_CANCEL = -1027; const int MENU_ALIGN_LEFT = -1; const int MENU_ALIGN_CENTER = 0; const int MENU_ALIGN_RIGHT = 1; @@ -145,6 +149,8 @@ class uimenu_callback */ class ui_element; class ui_element_input; + +// This class should be migrated out, use uilist instead! class uimenu: public ui_container { public: @@ -175,7 +181,10 @@ class uimenu: public ui_container nc_color disabled_color; int pad_left; int pad_right; - bool return_invalid; + bool allow_disabled; // return on selecting disabled entry, default false + bool allow_anykey; // return UIMENU_UNBOUND on keys unbound & unhandled by callback, default false + bool allow_cancel; // return UIMENU_CANCEL on "QUIT" action, default true + bool return_invalid; // legacy flag bool hilight_disabled; bool hilight_full; int shift_retval; @@ -237,11 +246,28 @@ class uimenu: public ui_container private: bool started; - int last_fsize; - int last_vshift; + + protected: std::string hotkeys; }; +class uilist : virtual public uimenu +{ + public: + uilist(); + uilist( const std::string &hotkeys_override ); + // query() will be called at the end of these convenience constructors + uilist( const std::string &msg, const std::vector &opts ); + uilist( const std::string &msg, const std::vector &opts ); + uilist( const std::string &msg, std::initializer_list opts ); + uilist( int startx, int width, int starty, const std::string &msg, + const std::vector &opts ); + uilist( int startx, int width, int starty, const std::string &msg, + const std::vector &opts ); + uilist( int startx, int width, int starty, const std::string &msg, + std::initializer_list opts ); +}; + /** * Callback for uimenu that pairs menu entries with points * When an entry is selected, view will be centered on the paired point diff --git a/src/veh_interact.cpp b/src/veh_interact.cpp index 2cd88915ba1a4..b01b7aef013e3 100644 --- a/src/veh_interact.cpp +++ b/src/veh_interact.cpp @@ -393,11 +393,11 @@ void veh_interact::cache_tool_availability() vehicle_selector( g->u.pos(), 2, true, *veh ).has_quality( JACK, qual ); } -void veh_interact::cache_tool_availability_update_lifting(tripoint world_cursor_pos) +void veh_interact::cache_tool_availability_update_lifting( tripoint world_cursor_pos ) { max_lift = std::max( { g->u.max_quality( LIFT ), map_selector( g->u.pos(), PICKUP_RANGE ).max_quality( LIFT ), - vehicle_selector( world_cursor_pos, 4, true ).max_quality( LIFT ) + vehicle_selector( world_cursor_pos, 4, true, true ).max_quality( LIFT ) } ); } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index c91769f33af20..c0c7adc9975b8 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1146,7 +1146,9 @@ bool vehicle::is_connected( vehicle_part const &to, vehicle_part const &from, std::vector parts_there = parts_at_relative( next.x, next.y ); - if( !parts_there.empty() ) { + if( !parts_there.empty() && !parts[ parts_there[ 0 ] ].removed && + part_info( parts_there[ 0 ] ).location == "structure" && + !part_info( parts_there[ 0 ] ).has_flag( "PROTRUSION" ) ) { //Only add the part if we haven't been here before bool found = false; for( auto &elem : discovered ) { @@ -2634,13 +2636,10 @@ void vehicle::consume_fuel( double load = 1.0 ) amnt_precise -= remainder; if( amnt_precise > 0.0f ) { - fuel_remainder[ ft ] = amnt_precise - drain_energy( ft, amnt_precise ); + fuel_remainder[ ft ] = drain_energy( ft, amnt_precise ) - amnt_precise; } else { fuel_remainder[ ft ] = -amnt_precise; } - - add_msg( m_debug, "%s consumes %s: amount %.2f, remainder %.2f", - name.c_str(), ft.c_str(), amnt_precise, fuel_remainder[ ft ] ); } //do this with chance proportional to current load // But only if the player is actually there! @@ -3744,7 +3743,6 @@ void vehicle::shift_parts( const point delta ) //Need to also update the map after this g->m.reset_vehicle_cache( smz ); - } /** @@ -3754,7 +3752,8 @@ void vehicle::shift_parts( const point delta ) */ bool vehicle::shift_if_needed() { - if( !parts_at_relative( 0, 0 ).empty() ) { + std::vector vehicle_origin = parts_at_relative( 0, 0 ); + if( !vehicle_origin.empty() && !parts[ vehicle_origin[ 0 ] ].removed ) { // Shifting is not needed. return false; } @@ -3788,7 +3787,7 @@ int vehicle::break_off( int p, int dmg ) return dmg; } - const auto pos = global_part_pos3( p ); + const tripoint pos = global_part_pos3( p ); if( part_info( p ).location == part_location_structure ) { // For structural parts, remove other parts first std::vector parts_in_square = parts_at_relative( parts[p].mount.x, parts[p].mount.y ); @@ -3816,17 +3815,32 @@ int vehicle::break_off( int p, int dmg ) } remove_part( parts_in_square[index] ); } - /* After clearing the frame, remove it if normally legal to do - * so (it's not holding the vehicle together). At a later date, - * some more complicated system (such as actually making two - * vehicles from the split parts) would be ideal. */ - if( can_unmount( p ) ) { - if( g->u.sees( pos ) ) { - add_msg( m_bad, _( "The %1$s's %2$s is destroyed!" ), - name.c_str(), parts[ p ].name().c_str() ); + // After clearing the frame, remove it. + if( g->u.sees( pos ) ) { + add_msg( m_bad, _( "The %1$s's %2$s is destroyed!" ), + name.c_str(), parts[ p ].name().c_str() ); + } + // Special handling for destroying a frame that will break the vehicle into pieces. + // General idea is if parts become isolated from the rest of the vehicle, they "fall off". + std::vector offsets = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; + std::vector isolated_parts; + break_part_into_pieces( p, pos.x, pos.y, true ); + remove_part( p ); + shift_if_needed(); + for( point offset : offsets ) { + std::vector vehicle_origin = parts_at_relative( 0, 0, false ); + const point smashed_part_position = parts[ p ].mount; + std::vector at_risk_part = parts_at_relative( smashed_part_position.x + offset.x, + smashed_part_position.y + offset.y, + false ); + if( at_risk_part.empty() ) { + continue; + } + if( !is_connected( parts[ vehicle_origin[ 0 ] ], parts[ at_risk_part[ 0 ] ], + parts[ p ] ) ) { + // Ludicrous damage level to ensure it happens. + break_off( at_risk_part[ 0 ], 1000000 ); } - break_part_into_pieces( p, pos.x, pos.y, true ); - remove_part( p ); } } else { //Just break it off diff --git a/src/vehicle.h b/src/vehicle.h index 5cc5fb2587081..0a85b6a58b5d8 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -1057,6 +1057,13 @@ class vehicle // Process the trap beneath void handle_trap( const tripoint &p, int part ); + /** + * Player is driving the vehicle + * @param x direction player is steering + * @param y direction player is steering + */ + void pldrive( int x, int y ); + // stub for per-vpart limit units::volume max_volume( int part ) const; units::volume free_volume( int part ) const; @@ -1410,6 +1417,8 @@ class vehicle bool insides_dirty = true; // Is the vehicle hanging in the air and expected to fall down in the next turn? bool falling = false; + // last time point the fluid was inside tanks was checked for processing + time_point last_fluid_check = calendar::time_of_cataclysm; private: // refresh pivot_cache, clear pivot_dirty diff --git a/src/vehicle_move.cpp b/src/vehicle_move.cpp index 5dbcffc265dac..dc297088805c1 100644 --- a/src/vehicle_move.cpp +++ b/src/vehicle_move.cpp @@ -828,6 +828,90 @@ void vehicle::handle_trap( const tripoint &p, int part ) } } +void vehicle::pldrive( int x, int y ) +{ + player &u = g->u; + int turn_delta = 15 * x; + const float handling_diff = handling_difficulty(); + if( turn_delta != 0 ) { + float eff = steering_effectiveness(); + if( eff < 0 ) { + add_msg( m_info, _( "This vehicle has no steering system installed, you can't turn it." ) ); + return; + } + + if( eff == 0 ) { + add_msg( m_bad, _( "The steering is completely broken!" ) ); + return; + } + + // If you've got more moves than speed, it's most likely time stop + // Let's get rid of that + u.moves = std::min( u.moves, u.get_speed() ); + + ///\EFFECT_DEX reduces chance of losing control of vehicle when turning + + ///\EFFECT_PER reduces chance of losing control of vehicle when turning + + ///\EFFECT_DRIVING reduces chance of losing control of vehicle when turning + float skill = std::min( 10.0f, + u.get_skill_level( skill_driving ) + ( u.get_dex() + u.get_per() ) / 10.0f ); + float penalty = rng_float( 0.0f, handling_diff ) - skill; + int cost; + if( penalty > 0.0f ) { + // At 10 penalty (rather hard to get), we're taking 4 turns per turn + cost = 100 * ( 1.0f + penalty / 2.5f ); + } else { + // At 10 skill, with a perfect vehicle, we could turn up to 3 times per turn + cost = std::max( u.get_speed(), 100 ) * ( 1.0f - ( -penalty / 10.0f ) * 2 / 3 ); + } + + if( penalty > skill || cost > 400 ) { + add_msg( m_warning, _( "You fumble with the %s's controls." ), name.c_str() ); + // Anything from a wasted attempt to 2 turns in the intended direction + turn_delta *= rng( 0, 2 ); + // Also wastes next turn + cost = std::max( cost, u.moves + 100 ); + } else if( one_in( 10 ) ) { + // Don't warn all the time or it gets spammy + if( cost >= u.get_speed() * 2 ) { + add_msg( m_warning, _( "It takes you a very long time to steer that vehicle!" ) ); + } else if( cost >= u.get_speed() * 1.5f ) { + add_msg( m_warning, _( "It takes you a long time to steer that vehicle!" ) ); + } + } + + turn( turn_delta ); + + // At most 3 turns per turn, because otherwise it looks really weird and jumpy + u.moves -= std::max( cost, u.get_speed() / 3 + 1 ); + } + + if( y != 0 ) { + int thr_amount = 10 * 100; + if( cruise_on ) { + cruise_thrust( -y * thr_amount ); + } else { + thrust( -y ); + u.moves = std::min( u.moves, 0 ); + } + } + + // @todo: Actually check if we're on land on water (or disable water-skidding) + if( skidding && ( valid_wheel_config( false ) || valid_wheel_config( true ) ) ) { + ///\EFFECT_DEX increases chance of regaining control of a vehicle + + ///\EFFECT_DRIVING increases chance of regaining control of a vehicle + if( handling_diff * rng( 1, 10 ) < u.dex_cur + u.get_skill_level( skill_driving ) * 2 ) { + add_msg( _( "You regain control of the %s." ), name.c_str() ); + u.practice( skill_driving, velocity / 5 ); + velocity = int( forward_velocity() ); + skidding = false; + move.init( turn_dir ); + } + } +} + // A chance to stop skidding if moving in roughly the faced direction void vehicle::possibly_recover_from_skid() { diff --git a/src/vehicle_selector.cpp b/src/vehicle_selector.cpp index cba4259aab064..146a8112a421d 100644 --- a/src/vehicle_selector.cpp +++ b/src/vehicle_selector.cpp @@ -4,10 +4,12 @@ #include "vpart_position.h" #include "map.h" -vehicle_selector::vehicle_selector( const tripoint &pos, int radius, bool accessible ) +vehicle_selector::vehicle_selector( const tripoint &pos, int radius, bool accessible, + bool visibility_only ) { for( const auto &e : closest_tripoints_first( radius, pos ) ) { - if( !accessible || g->m.clear_path( pos, e, radius, 1, 100 ) ) { + if( !accessible || + ( visibility_only ? g->m.sees( pos, e, radius ) : g->m.clear_path( pos, e, radius, 1, 100 ) ) ) { if( const optional_vpart_position vp = g->m.veh_at( e ) ) { data.emplace_back( vp->vehicle(), vp->part_index() ); } diff --git a/src/vehicle_selector.h b/src/vehicle_selector.h index a9dff5e205303..a889cc18407e6 100644 --- a/src/vehicle_selector.h +++ b/src/vehicle_selector.h @@ -34,8 +34,10 @@ class vehicle_selector : public visitable * @param pos map position at which to start each query which may or may not contain vehicle * @param radius number of adjacent tiles to include (searching from pos outwards) * @param accessible whether found items must be accessible from pos to be considered + * @param check accessibility based on line of sight, not walkability */ - vehicle_selector( const tripoint &pos, int radius = 0, bool accessible = true ); + vehicle_selector( const tripoint &pos, int radius = 0, bool accessible = true, + bool visibility_only = false ); /** * Constructs vehicle_selector used for querying items located on vehicle tiles diff --git a/src/weather_data.cpp b/src/weather_data.cpp index aeb41fcbeb919..0ac1f750eb84a 100644 --- a/src/weather_data.cpp +++ b/src/weather_data.cpp @@ -130,15 +130,15 @@ int calc_hourly_rotpoints_at_temp( const int temp ) const int cutoff = 105; // stop torturing the player at this temperature, which is const int cutoffrot = 3540; // ..almost 6 times the base rate. bacteria hate the heat too - const int dsteps = dropoff - FREEZING_TEMPERATURE; + const int dsteps = dropoff - temperatures::freezing; const int dstep = ( 35.91 * std::pow( 2.0, ( float )dropoff / 16.0 ) / dsteps ); - if( temp < FREEZING_TEMPERATURE ) { + if( temp < temperatures::freezing ) { return 0; } else if( temp > cutoff ) { return cutoffrot; } else if( temp < dropoff ) { - return ( ( temp - FREEZING_TEMPERATURE ) * dstep ); + return ( ( temp - temperatures::freezing ) * dstep ); } else { return int( ( 35.91 * std::pow( 2.0, ( float )temp / 16.0 ) ) + 0.5 ); } diff --git a/tests/fold_string_test.cpp b/tests/fold_string_test.cpp new file mode 100644 index 0000000000000..9c8e2795353bf --- /dev/null +++ b/tests/fold_string_test.cpp @@ -0,0 +1,105 @@ +#include "catch/catch.hpp" + +#include + +#include "output.h" + +template +static void check_equal( IterResult beg_res, IterResult end_res, + IterExpect beg_exp, IterExpect end_exp ) +{ + CHECK( std::distance( beg_res, end_res ) == std::distance( beg_exp, end_exp ) ); + IterResult result = beg_res; + IterExpect expect = beg_exp; + for( ; result != end_res && expect != end_exp; ++result, ++expect ) { + CHECK( *result == *expect ); + } +} + +TEST_CASE( "fold-string" ) +{ + SECTION( "Case 1 - test wrapping of lorem ipsum" ) { + const auto folded = foldstring( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a.", + 17 + ); + const auto expected = { + /* + 0123456789abcdefg + */ + "Lorem ipsum dolor", + "sit amet, ", + "consectetur ", + "adipiscing elit. ", + "Pellentesque a.", + }; + check_equal( folded.begin(), folded.end(), expected.begin(), expected.end() ); + } + + SECTION( "Case 2 - test wrapping of Chinese" ) { + const auto folded = foldstring( + "春哥纯爷们,铁血真汉子。人民好兄弟,父亲好儿子。", + 19 + ); + const auto expected = { + /* + 0123456789abcdefghi + */ + "春哥纯爷们,铁血真", + "汉子。人民好兄弟,", + "父亲好儿子。", + }; + check_equal( folded.begin(), folded.end(), expected.begin(), expected.end() ); + } + + SECTION( "Case 3 - test wrapping of mixed language" ) { + const auto folded = foldstring( + "Cataclysm-DDA是Github上的一个开源游戏项目,目前已有超过16000个PR.", + 13 + ); + const auto expected = { + /* + 0123456789abc + */ + "Cataclysm-DDA", + "是Github上的", + "一个开源游戏", + "项目,目前已", + "有超过16000个", + "PR." + }; + check_equal( folded.begin(), folded.end(), expected.begin(), expected.end() ); + } + + SECTION( "Case 4 - test color tags" ) { + const auto folded = foldstring( + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a.", + 18 + ); + const auto expected = { + "Lorem ipsum dolor ", + "sit amet, ", + "consectetur ", + "adipiscing elit. ", + "Pellentesque a.", + }; + check_equal( folded.begin(), folded.end(), expected.begin(), expected.end() ); + } + + SECTION( "Case 5 - test long word" ) { + const auto folded = foldstring( + "You gain a mutation called Hippopotomonstrosesquippedaliophobia!", + 20 + ); + const auto expected = { + /* + 0123456789abcdefghij + */ + "You gain a mutation ", + "called ", + "Hippopotomonstrosesq", + "uippedaliophobia!" + }; + check_equal( folded.begin(), folded.end(), expected.begin(), expected.end() ); + } +} diff --git a/tests/vehicle_efficiency.cpp b/tests/vehicle_efficiency.cpp index 13f2c7eb5b92b..60b31073e2cc7 100644 --- a/tests/vehicle_efficiency.cpp +++ b/tests/vehicle_efficiency.cpp @@ -374,20 +374,20 @@ TEST_CASE( "vehicle_make_efficiency_case", "[.]" ) // Fix test for electric vehicles TEST_CASE( "vehicle_efficiency", "[vehicle] [engine]" ) { - test_vehicle( "beetle", 117600, 107700, 12580, 10470 ); - test_vehicle( "car", 115000, 92350, 12650, 7348 ); - test_vehicle( "car_sports", 243800, 163000, 15780, 9458 ); - test_vehicle( "electric_car", 62820, 45220, 3590, 2520 ); - test_vehicle( "suv", 304300, 208600, 28500, 14250 ); - test_vehicle( "motorcycle", 15180, 13190, 2304, 1302 ); - test_vehicle( "quad_bike", 11720, 10570, 1963, 1302 ); - test_vehicle( "scooter", 9650, 9484, 1723, 1723 ); - test_vehicle( "superbike", 31970, 8104, 3152, 1224 ); - test_vehicle( "ambulance", 252300, 229800, 22480, 18740 ); - test_vehicle( "fire_engine", 294100, 281800, 24740, 22840 ); - test_vehicle( "fire_truck", 217100, 65930, 18740, 4813 ); - test_vehicle( "truck_swat", 198900, 64370, 21020, 4691 ); - test_vehicle( "tractor_plow", 144000, 144000, 14120, 14120 ); - test_vehicle( "apc", 627700, 580300, 65960, 60720 ); - test_vehicle( "humvee", 286500, 169000, 25180, 11650 ); + test_vehicle( "beetle", 287700, 230500, 15990, 13310 ); + test_vehicle( "car", 281700, 163300, 16070, 9336 ); + test_vehicle( "car_sports", 323400, 185500, 16690, 9176 ); + test_vehicle( "electric_car", 69420, 45080, 3620, 2300 ); + test_vehicle( "suv", 589700, 288700, 31870, 15320 ); + test_vehicle( "motorcycle", 80860, 45920, 3885, 2195 ); + test_vehicle( "quad_bike", 52140, 35180, 3310, 2195 ); + test_vehicle( "scooter", 71290, 71290, 3707, 3707 ); + test_vehicle( "superbike", 94350, 10270, 4005, 1556 ); + test_vehicle( "ambulance", 378800, 287200, 23740, 18680 ); + test_vehicle( "fire_engine", 452700, 381700, 27350, 23150 ); + test_vehicle( "fire_truck", 311100, 68740, 20680, 4312 ); + test_vehicle( "truck_swat", 340100, 75240, 24760, 5527 ); + test_vehicle( "tractor_plow", 281900, 281900, 16630, 16630 ); + test_vehicle( "apc", 1081000, 960200, 77710, 71540 ); + test_vehicle( "humvee", 438400, 210500, 28000, 12950 ); }